개발공부

텐서플로우로 분류(Classification)의 문제 모델링 하는 방법 실습 본문

Python/Deep Learning

텐서플로우로 분류(Classification)의 문제 모델링 하는 방법 실습

mscha 2022. 6. 10. 17:49

 

Churn_Modelling.csv
0.64MB

고객 정보와 해당 고객이 금융상품을 갱신했는지 안했는지의 여부에 대한 데이터가 있다.
이 데이터를 가지고 갱신여부를 예측 (분류) 하는 딥러닝을 구성해보자.
 
먼저 csv파일을 판다스 데이터 프레임으로 읽어온다.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

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

 

 

NAN 값이 있는지 확인한다.

df.isnull().sum()

 

X 를 설정한다.

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

 

y를 설정한다.

y = df['Exited']
y

 

문자열 데이터는 숫자로 바꿔준다. (인코딩)

 

Gender는 레이블 인코딩한다.

from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
X['Gender'] = encoder.fit_transform(X['Gender'])
X

 

Geography는 원 핫 인코딩 한다.

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

ct = ColumnTransformer( [ ('encoder', OneHotEncoder(), [1]) ],
                    remainder= 'passthrough')
X = ct.fit_transform(X)
X

X의 첫 컬럼은 없어도 그 뒤의 두개 컬럼만으로도 Geography를 구분할 수 있으니 제거한다.

X = X[:, 1: ]
X

 

피처 스케일링한다. MinMaxScaler를 이용해보자.

from sklearn.preprocessing import MinMaxScaler

sc_X = MinMaxScaler()
X = sc_X.fit_transform(X)
X

 

데이터를 학습용과 검증용으로 나눈다. ex (train - 80%, test - 20%)

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 )

 

이제 DNN 모델을 만들어보자.

import tensorflow as tf
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.engine import input_layer

# 빈 틀을 만든다.
model = Sequential()

# Dense == Layer, 레이어를 추가한다.
# units - 레이어한의 유닛 수
# activation - activation function
# input_shape - 들어오는 데이터의 컬럼 수
model.add(Dense(units = 6, activation = 'relu', input_shape = (11, )))
model.add( Dense(units = 8, activation = tf.nn.relu))
model.add( Dense(units=1, activation='sigmoid'))

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

model.summary()

 

만든 모델을 학습시키자.

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

 

test 데이터로 검증해보자.

model.evaluate(X_test, y_test)

 

컨퓨전 매트릭스로 확인해보자.

from sklearn.metrics import confusion_matrix, accuracy_score
y_pred = model.predict(X_test)

# 시그모이드 함수를 사용했기 때문에 0.5이상인 값은 1, 아닌것은 0으로 바꾼다.
y_pred = (y_pred > 0.5).astype(int)

cm =confusion_matrix(y_test, y_pred)
cm

 

정확도를 확인해보자

accuracy_score(y_test, y_pred)

 

이제 학습과 테스트가 끝났으니,

임의의 데이터를 가지고 결과를 예측해보자.

- Geography: France
- Credit Score: 600
- Gender: Male
- Age: 40
- Tenure: 3
- Balance: 60000
- Number of Products: 2
- Has Credit Card: Yes
- Is Active Member: Yes
- Estimated Salary: 50000

이를 X 와 매칭되게 바꾸면 아래와 같다.

new_data = np.array([600, 'France', 'Male', 40, 3, 60000, 2, 1, 1, 50000])
new_data = new_data.reshape(1,-1)

 

인코딩을 하자.

new_data[:, 2] = encoder.transform(new_data[:,2])
new_data

new_data = ct.transform(new_data)

new_data = new_data[:, 1: ]

new_data

피처 스케일링 하자.

new_data = sc_X.transform(new_data)

 

이제 예측해보자.

y_pred = model.predict(new_data)
y_pred

y_pred = (y_pred>0.5).astype(int)

y_pred