AI 이론/딥러닝 이론

[분류 딥러닝 모델링] tensorflow코딩 (sigmoid함수, confusion metrics 평가)

jasonshin 2021. 11. 30. 12:54
1. 비어있는 데이터 확인
 
2. X 와 y 설정
 
3. 문자열 데이터를 숫자로 변경한다. (인코딩 2가지 중 택1)
 
X의 Geography는 3개로 되어있으므로 원핫인코딩 / X의 gender는 2개로 되어있으르모 레이블 인코딩
Female, Male 정렬하면 Female이 0, Male이 1이 된다. 
# 원핫 인코딩한 결과의 맨 왼쪽 컬럼은 삭제를 해도 0과 1로 모두 3개 데이터표현가능.
 Dummy variable trap : 즉 맨 앞쪽 하나의 컬럼은 지워도 된다.
 0 0 1 => 0 1
 0 1 0 => 1 0
 1 0 0 => 0 0
 
X.drop('Geography_France', axis=1, inplace=True) <= 컬럼하나 삭제해도 무방
 
4. 각 데이터의 범위를 일정하게 맞춰주는 피쳐 스케일링 한다. (classicfication 2가지 중 택1) 
  # 딥러닝은 무조건 피쳐스케일링 한다.
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.25, random_state=50)
 
6. 딥러닝으로 모델링
 
# Sequential: 딥러닝 그물망 구조

# Dense: 레이어 한 열을 말한다. 

import tensorflow as tf
from tensorflow.keras.models import Sequential  
from tensorflow.keras.layers import Dense  
 
model = Sequential()
 
X.shape
(110, 11)
 
# 첫번째 히든레이어 생성 : 이때는 인풋 레이어의 숫자도 세팅해준다. (컬럼수)
model.add(Dense(units=6, activation='relu',input_dim= 11 ))
 
# 두번째 히든레이어 생성
model.add(Dense(units=8, activation='relu'))
 
# 아웃풋 레이어 생성
model.add(Dense(units=1, activation='sigmoid'))
 
 
model.summary()
 
# 컴파일 한다! Compile한다. 오차함수를 설정하고, 옵티마이저(그레이언트 디센트 알고리즘)를 설정한다. 
# 옵티마이저는 그데리언트 디센트 알고리즘을 개선한 것들 중에서 선택하면 된다. 
# 그레디언트 디센트는 오차가 최소가 될 때의 W값을 찾는 알고리즘이다. 

# loss는 오차함수를 말한다. 
# 분류의 문제는 2가지로 나뉜다. 
# 1. 2개로 분류하는 문제 : binary_crossentropy
# 2. 3개 이상으로 분류하는 문제 : categorical_crossentropy
# 위의 2개 중에 하나를 설정해 준다. 
# 딥러닝은 분류, 예측(regression) 둘다 해결 가능

# metrics 분류의 문제는 보통 정확도를 측정한다. 따라서 accuracy를 설정해준다. 
 
model.compile(optimizer= 'adam', loss='binary_crossentropy', metrics=['accuracy'])
 
 
# 만든 모델을 요약
model.summary()
 
 
# 학습할때, 파라미터를 2개만 세팅했을때의 결과

# model.fit(X_train, y_train)
# 250/250 [==============================] - 0s 2ms/step - loss: 0.4826 - accuracy: 0.7960
# <keras.callbacks.History at 0x7fcdee571910>
 
# 컴파일이 끝나면 학습 # loss = 오차, accuracy = 정확도
model.fit(X_train, y_train, epochs=20, batch_size=10)
 
7. 평가
# 학습이 끝나면, 평가해야 한다. 
y_pred = model.predict(X_test)
 
# 0 ~ 1 사이의 실수로 나온다. 
# 이유는? 아웃풋 레이어의 액티베이션 함수로 시그모이드를 사용했기 때문에!
 
# y_pred 값이 실수로 나왔기 때문에 컨퓨젼 매트릭스에 넣을 수가 없다.
# 따라서 0.5를 기준으로 크면 1로, 작으면 0으로 맞춰줘야 한다. 
y_pred = (y_pred > 0.5).astype(int)
 
# y_pred는 2차원 이므로, 컨퓨젼 매트릭스에 넣을 수 없기 때문에 
# 1차원으로 만들어준다.
y_pred.shape
(2000, 1)
 
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)
 
# 적용
new_data = np.array([038900002000500000])
new_data = new_data.reshape(1,5)
new_data= scaler.transform(new_data)
model.predict(new_data)
반응형