[모두의 딥러닝] 18. 에포크(epochs), 과적합 그래프, 학습 자동 중단 - 와인 품질 예측 데이터

와인 품질 예측 데이터

- 레드 와인과 화이트 와인에 대한 화학적 특성과 품질 등급을 통해 와인의 종류 예측

 

 

1. 환경 및 데이터 준비

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
import pandas as pd

# 데이터 입력
df = pd.read_csv('./data/wine.csv', header=None)

# 데이터를 미리 봄
df.head()

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

 

2. 검증셋 포함하여 모델 실행

  • 검증셋

: 최적의 학습 파라미터를 찾기 위해 학습 과정에서 사용하는 것

: 검증셋에 테스트한 결과를 추적하면서 최적의 모델 만들 수 있음

#학습셋과 테스트셋으로 나눔
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'])

 

  • fit()

- validation_split : 훈련 데이터 중 n%를 검증셋으로 사용하여 훈련 중에 모델의 성능을 평가

# 모델 실행
# 0.8 x 0.25 = 0.2
history=model.fit(X_train, y_train, epochs=50, batch_size=500, validation_split=0.25)

학습셋:검증셋:테스트셋의 비율이 60:20:20

 

3. 결과 출력

# 테스트 결과 출력
score=model.evaluate(X_test, y_test)
print('Test accuracy:', score[1])
41/41 [==============================] - 0s 4ms/step - loss: 0.1557 - accuracy: 0.9438
Test accuracy: 0.9438461661338806

 

 

 

에포크(epochs)마다 모델의 정확도 기록

! 와인 품질 예측 데이터 코드에서 model.compile() 부분까지는 동일

 

 

  • 에포크(epochs)

: 학습을 몇 번 반복할 것인지 결정

: 많이 반복한다고 해서 모델 성능이 지속적으로 좋아지지는 않음

 

  • ModelCheckpoint()

: 학습 중인 모델을 저장

: keras에 존재

# 모델 저장의 조건을 설정
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])
41/41 [==============================] - 0s 4ms/step - loss: 0.1891 - accuracy: 0.9346
Test accuracy: 0.9346153736114502

 

 

 

과적합 그래프

- 적절한 학습 횟수를 정하기 위해 검증셋과 테스트셋의 결과를 그래프로 나타냄

! 와인 품질 예측 데이터 코드에서 model.compile() 부분까지는 동일

 

 

  • compile()

- metrics : accuracy 지정하면 accuracy(정확도) 출력 / 검증셋 지정하면 val_accuracy(검증셋으로 얻은 정확도) 값도 출력

 

  • fit()

: 학습을 진행하면서 매 에포크(epochs)마다 결과 출력

: 일반적으로 loss(오차) 값 출력 / 검증셋 지정하면 val_loss(모델을 검증셋에 적용해 얻은 오차) 값도 출력

history=model.fit(X_train, y_train, epochs=2000, batch_size=500, validation_split=0.25)

 

 

  • history

: model.fit()의 결과를 가진 파이썬 객체

- history.history : loss, accuracy, val_loss, val_accuracy 들어있음

# 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()

학습이 오래 진행될수록 검증셋의 오차 감소, 테스트셋의 오차 증가 -> 과적합

 

 

 

학습 자동 중단

- 검증셋의 오차가 커지기 직전까지 학습한 모델 = 최적의 횟수로 학습한 모델

! 와인 품질 예측 데이터 코드에서 model.compile() 부분까지는 동일

 

 

  • EarlyStopping()

: 학습이 진행되어도 테스트셋 오차가 줄어들지 않으면 학습을 자동으로 멈추게 하는 함수

: 특정 조건이 충족되면 모델의 훈련을 중지하여 과적합을 방지하고, 훈련 시간을 단축

: keras에 존재

- monitor : model.fit()의 실행 결과 중 조기 종료를 결정할 지표를 결정하는 옵션

- patience : 성능이 향상되지 않더라도 몇 번의 에포크 동안 추가로 훈련을 진행할지를 결정

from tensorflow.keras.callbacks import EarlyStopping

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

 

  • ModelCheckpoint()

- save_best_only : 최상의 성능을 나타내는 모델만 저장

# 최적화 모델이 저장될 폴더와 모델의 이름을 결정
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])

에포크(epochs)를 2000번으로 설정했지만 49번에서 멈춤

 

# 테스트 결과를 출력
score=model.evaluate(X_test, y_test)
print('Test accuracy:', score[1])
41/41 [==============================] - 0s 2ms/step - loss: 0.0376 - accuracy: 0.9931
Test accuracy: 0.9930769205093384

 

 

 

'모두의 딥러닝 개정 3판'의 내용과 https://github.com/taehojo/deeplearning의 코드 참고