딥러닝/정형데이터

DNN이용하여 thin, normal, fat 분류

씩씩한 IT블로그 2020. 6. 27. 20:57
반응형

1. 데이터 전처리

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers  #모듈(변수나 함수를 포함)만 불러오기

# BMI 데이터를 읽어 들이고 정규화하기
csv = pd.read_csv("bmi.csv")

# 몸무게와 키 데이터(정규화)
csv["weight"] /= 100   
csv["height"] /= 200   
X = csv[["weight", "height"]].as_matrix()

print(csv)

# 레이블
bclass = {"thin":[1,0,0], "normal":[0,1,0], "fat":[0,0,1]}
y = np.empty((20000,3))     # 2000x3 크기의 다차원 벡터 생성
for i, v in enumerate(csv["label"]):
    y[i] = bclass[v]        #"thin'이면, y[i]=[1,0,0] 와 같이 할당
    
# 훈련 전용 데이터와 테스트 전용 데이터로 나누기 --- (※2)
X_train, y_train = X[0:15000], y[0:15000]
X_test,  y_test  = X[15000:20000], y[15000:20000]

 

2. 모델 구조정의

# 모델 구조 정의하기
model = tf.keras.Sequential()  #순차적 계층화 준비
model.add(layers.Dense(8, input_shape=(2,)))  #입력 2개로부터 전달받는 8개 노드의 layer 생성
model.add(layers.Activation('relu'))  #ReLU 활성화함수 채택
model.add(layers.Dropout(0.1))        #dropout ratio=10% (배치 훈련시 10% arc 무시)

model.add(layers.Dense(4))         #4개 노드의 layer 생성
model.add(layers.Activation('relu'))
model.add(layers.Dropout(0.1))

model.add(layers.Dense(3))
model.add(layers.Activation('softmax')) #분류(classification)을 위해 softmax 함수 사용

# 모델 구축하기
model.compile(
    loss='categorical_crossentropy',  #다중 교차엔트로피
    optimizer="rmsprop",   #최적화 기법 중 하나
    metrics=['accuracy'])  #정확도 측정

 

3. 모델 구조정의

# 데이터 훈련하기 --- (※5)
hist = model.fit(
    X_train, y_train,
    batch_size=100,  #100개에 한 번씩 업데이터 실행
    epochs=800,       #훈련 데이터셋을 총 50회 반복 실험. 단, 조기중지될 수 있음
    validation_split=0.2,  
      #validation data 분할 비율. 즉, 15000개 중에서 20%인 3000개를 validation용으로 분할 (데이터에 잘학습되었는지 확인)
    callbacks=[tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=50)],  
      #'val_loss'를 monitor하여 감소하면 한 번 더(1) 참고 조기중지
    verbose=1)  #전 과정을 화면에 출력(1) 또는 미출력(0) 모드

# 테스트 데이터로 평가하기 --- (※6)
score = model.evaluate(X_test, y_test)
print('test_loss: ', score[0])
print('test_acc: ', score[1])

 

4. 모델 시각화

import matplotlib.pyplot as plt

fig, loss_ax = plt.subplots()

acc_ax = loss_ax.twinx()

loss_ax.plot(hist.history['loss'], 'y', label='train loss')
loss_ax.plot(hist.history['val_loss'], 'r', label='val loss')

acc_ax.plot(hist.history['accuracy'], 'b', label='train acc')
acc_ax.plot(hist.history['val_accuracy'], 'g', label='val acc')

loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')
acc_ax.set_ylabel('accuray')

loss_ax.legend(loc='upper left')
acc_ax.legend(loc='lower left')

plt.show()

 

5. 모델 저장

#모델 save
model.save("dnn_BMI.h5")

 

6. 모델 구조 확인

#load and evaluate the saved model
from numpy import loadtxt
from tensorflow.python.keras.models import load_model

#load model
loaded_model = load_model("dnn_BMI.h5")
loaded_model.summary()

score = loaded_model.evaluate(X_test, y_test)
print('test_loss: ', score[0])
print('test_acc: ', score[1])

 

7. X_test값들의 확률, class분류 확인.

#X_test의 예측 클래스 확인하기
print("input값")
print(X_test)

print()

print("예측 확률")
y_pred_prob = model.predict_proba(X_test)
print(y_pred_prob)

print()

print("예측 class")
y_pred = model.predict_classes(X_test)
print(y_pred)

 

8. 임의의 값의 확률, class 분류확인

#임의의 값을 에측

X_new = [175, 75]
X_new[0]/=200
X_new[1]/=100

y_pred = model.predict_classes(np.array([X_new,]))
y_pred_prob = model.predict_proba(np.array([X_new,]))
print(y_pred, y_pred_prob)

 

9. 평균,최소,최대값들의 class 분류확인

#각종 임의의 값 예측

def predict_bmi(X_new):
    y_pred = model.predict_classes(np.array([X_new,]))
    y_pred_prob = model.predict_proba(np.array([X_new,]))
    print(y_pred, y_pred_prob)
    
X_mean = [X_train[:,0].mean(), X_train[:,1].mean()] #normal (1)
X_min = [X_train[:,0].min(), X_train[:,1].min()] #normal (1)
X_max = [X_train[:,0].max(), X_train[:,1].max()] #normal (1)
X_min_max = [X_train[:,0].min(), X_train[:,1].max()]  #thin (0)
X_max_min = [X_train[:,0].max(), X_train[:,1].min()]  #fat (2)

print("새로운값 input값")
print("X_mean : ", X_mean)
print("X_min : ", X_min)
print("X_max : ", X_max)
print("X_min_max : ", X_min_max)
print("X_max_min : ", X_max_min)

print()

print("새로운값 class와 class별 확률")
predict_bmi(X_mean)
predict_bmi(X_min)
predict_bmi(X_max)
predict_bmi(X_min_max)
predict_bmi(X_max_min)

 

반응형