05.08.23

정동겸·2023년 5월 8일
post-thumbnail

모델 성능 향상하기

1. 데이터의 확인과 검증셋

검증셋은 최적의 학습 파라미터를 찾기 위해 학습 과정에서 사용하는 데이터다.
검증셋을 설정하면 검증셋에 테스트한 결과를 추적하면서 최적의 모델을 만들 수 있다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
from sklearn.model_selection import train_test_split

import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

!git clone https://github.com/taehojo/data.git

# 와인 데이터를 불러옵니다.
df = pd.read_csv('./data/wine.csv', header=None)

# 와인의 속성을 X로 와인의 분류를 y로 저장합니다.
X = df.iloc[:,0:12]
y = df.iloc[:,12]

# 학습셋과 테스트셋으로 나눕니다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True)

# 모델 구조를 설정합니다.
model = Sequential()
model.add(Dense(30,  input_dim=12, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.summary()

# 모델을 컴파일합니다.
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

2. 모델 업데이트하기

에포크마다 모델의 정확도를 함께 기록하면서 저장하는 방법을 알아보겠다.

# 모델 저장의 조건을 설정합니다.
modelpath="./data/model/all/{epoch:02d}-{val_accuracy:.4f}.hdf5"
checkpointer = ModelCheckpoint(filepath=modelpath, verbose=1)

# 모델을 실행합니다. 
history=model.fit(X_train, y_train, epochs=50, batch_size=500, 
validation_split=0.25, verbose=0, callbacks=[checkpointer])

# 테스트 결과를 출력합니다.
score=model.evaluate(X_test, y_test)
print('Test accuracy:', score[1])

학습 중인 모델을 저장하는 함수는 케라스 API의 ModelCheckpoint()다.
모델이 저장될 곳을 정하고 진행되는 현황을 모니터할 수 있도록 verbose는 1로 설정한다.

3. 그래프로 과적합 확인하기

학습 반복 횟수가 너무 많다면 과적합이 일어날 수 있다. 적절한 학습 횟수를 정하기 위해서는 검증셋과 테스트셋의 결과를 그래프로 보는 것이 가장 좋다.

history에는 loss, accuracy, val_loss, val_accuracy가 있다.
loss는 예측 값과 실제 값의 차이
accuracy는 전체 샘플중 정답을 맞춘 샘플의 비율
val_loss와 val_accuracy는 검증셋으로 얻은 데이터다.

# 그래프 확인을 위한 긴 학습 
history=model.fit(X_train, y_train, epochs=2000, batch_size=500, validation_split=0.25)

# history에 저장된 학습 결과를 확인해 보겠습니다. 
hist_df=pd.DataFrame(history.history)
hist_df

# y_vloss에 테스트셋(여기서는 검증셋)의 오차를 저장합니다.
y_vloss=hist_df['val_loss']

# y_loss에 학습셋의 오차를 저장합니다.
y_loss=hist_df['loss']

#x 값을 지정하고 테스트셋(검증셋)의 오차를 빨간색으로, 학습셋의 오차를 파란색으로 표시합니다.
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, "o", c="red", markersize=2, label='Testset_loss')
plt.plot(x_len, y_loss, "o", c="blue", markersize=2, label='Trainset_loss')

plt.legend(loc='upper right')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

위 그래프를 보면 학습을 오래 진행될수록 학습셋의 오차는 줄어들지만 검증셋의 오차는 다시 커지는걸 확인할 수 있다.

4. 학습의 자동 중단

케라스 API에선 EarlyStopping() 함수를 제공한다. 학습이 진행되어도 테스트셋 오차가 줄어들지 않으면 학습을 자동으로 멈추게 하는 함수다.

# 학습이 언제 자동 중단될지를 설정합니다.
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=20)

# 최적화 모델이 저장될 폴더와 모델의 이름을 정합니다.
modelpath="./data/model/Ch14-4-bestmodel.hdf5"

# 최적화 모델을 업데이트하고 저장합니다.
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', 
verbose=0, save_best_only=True)

# 모델을 실행합니다.
history=model.fit(X_train, y_train, epochs=2000, batch_size=500, 
validation_split=0.25, verbose=1, callbacks=
[early_stopping_callback,checkpointer])

# 테스트 결과를 출력합니다.
score=model.evaluate(X_test, y_test)
print('Test accuracy:', score[1])
41/41 [==============================] - 0s 1ms/step - loss: 0.0472 - accuracy: 0.9885
Test accuracy: 0.9884615540504456

98.84%의 정확도로 모델 성능이 대폭 향상된걸 확인할 수 있다.

0개의 댓글