딥러닝

Neural Networks

HooSL 2022. 3. 29. 10:57

필요한 라이브러이 import

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inline

구글 드라이브 마운트

from google.colab import drive
drive.mount('/content/drive')

Churn_Modelling.csv
0.64MB

csv파일 읽기

import os
# Working Direcctory Setting 워킹 디렉토리 세팅
os.chdir('/content/drive/csv파일 있는 위치')

df = pd.read_csv('Churn_Modelling.csv')

df

 

1. 비어있는 데이터 확인합니다.

df.isna().sum()

 

2. X와 y 설정합니다.

X=df.loc[:,'CreditScore':'EstimatedSalary']
y=df['Exited']

 

3. 문자열 데이터를 숫자로 변경합니다.

X의 Geography은 3개로 되어있으므로 원핫인코딩 해야합니다.
X의 Gender은 2개로 외어있으므로 레이블인코딩 해야합니다.

#원핫인코딩
X = pd.get_dummies(X,columns=['Geography'])

#레이블인코딩
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
encoder.fit_transform(X['Gender'])

#Female, Male 정렬하면 ,Female이 0, Male이 1이 됩니다.
X['Gender'] = encoder.fit_transform(X['Gender'])

X

원 핫 인코딩한 결과의 맨 왼쪽 컬럼은, 삭제를 해도 0과 1로 모두 3개 데이터 표현 가능
Dummy varialbe trap : 즉 맨 왼쪽 하나의 컬럼은 지워도 됩니다.

많으면 메모리 먹기 떄문입니다
 0 0 1 => 0 1
 0 1 0 => 1 0
 1 0 0 => 0 0

X=X.drop('Geography_France',axis=1)
X

 

4. 각 데이터의 범위를 일정하게 맞춰주는, 피쳐 스케일링 합니다.

딥러닝은 무조건 피처스케일링 합니다.

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X = scaler.fit_transform(X)

 

5. 학습용과 테스트용으로 나눕니다.

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)

 

6. 딥러닝으로 모델링

import tensorflow as tf
from tensorflow.keras.models import Sequential #sequential 신경망 같은거
from tensorflow.keras.layers import Dense #Dense는 레이어

model = Sequential()
X.shape# input_dim을 확인하기 위해
#히든레이어 생성 : 이때는 인풋 레이어의 숫자도 세팅해줍니다
model.add(Dense(units=6,activation='relu',input_dim = 11))

#히든레이어 생성(인풋레이어 필요없음)
model.add(Dense(units=8,activation='relu'))

#아웃풋 레이어 생성
model.add(Dense(units=1,activation='sigmoid'))

컴파일 합니다. Compile
오차함수를 설정하고 옵티마이저(그레디언트 디센트 알고리즘)를 설정합니다
옵티마이저는 그래디언트 디센트 알고리즘을 개선한 것들 중에서 선택하면 됩니다.
그래디언트 디센트는 오차가 최소가 될때의 W값을 찾는 알고리즘입니다.

loss는, 오차함수를 말합니다
분류의 문제는 2가지로 나뉩니다.
1. 2개로 분류하는 문제 : binary_crossentropy
2. 3개 이상으로 분류하는 문제 : categorical_crossentropy
위의 2개중 하나를 설정합니다

metrics 분류의 문제는 보통 정확도를 측정합니다

따라서 accuracy를 설정합니다

model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])

#만든 모델을, 요약
model.summary()

 

7. 컴파일이 끝나면, 학습합니다.

epoch : 한 번의 epoch는 신경망에서 전체 데이터 셋에 대해 forward pass/backward pass 과정을 거친 것을 말합니다. 즉, 전체 데이터 셋에 대해 한 번 학습을 완료한 상태를 말합니다.


batch_size : 메모리의 한계와 속도 저하 때문에 대부분의 경우에는 한 번의 epoch에서 모든 데이터를 한꺼번에 집어넣을 수는 없습니다. 

그래서 데이터를 나누어서 주게 되는데 이때 몇 번 나누어서 주는가를 iteration, 각 iteration마다 주는 데이터 사이즈를 batch size라고 합니다.

 

출처: https://www.slideshare.net/w0ong/ss-82372826

model.fit(X_train,y_train,epochs=20,batch_size=10)

 

8. 학습이 끝나면, 평가해야 합니다.

y_pred = model.predict(X_test)

# 0~1사이의 실수로 나옵니다.
# 이유는 아웃풋 레이어의 액티베이션 펑션으로 시그모이드를 시용했기 때문 입니다.
y_pred

y_pred 값이 실수로 나왔기 때문에 컨퓨전 매트릭스에 넣을 수 없습니다
따라서 0.5기준으로 크면 1, 작으면 0으로 맞춰줘야합니다.

y_pred = (y_pred > 0.5).astype(int)
#결과값 (2000,1)

#y_pred는 2차원 이므로, 컨퓨전매트릭스에 넣을 수 없기 때문에 1차원으로 만들어줍니다.

y_pred=y_pred.reshape(2000,)
#결과값 (2000,)

 

from sklearn.metrics import confusion_matrix, accuracy_score

confusion_matrix(y_test,y_pred)
accuracy_score(y_test,y_pred)

# 텐서플로우의 평가 함수 제공,
model.evaluate(X_test,y_test)