- 레드 와인과 화이트 와인을 구분하는 모델 생성해보기
1. 데이터의 확인과 검증셋
- 샘플 6,497개, 피처 12개
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
import pandas as pd
# 깃허브에 준비된 데이터 호출
!git clone https://github.com/taehojo/data.git
# 와인 데이터를 호출
df = pd.read_csv('./data/wine.csv', header=None)
df
- 0~11번째 열에 해당하는 속성 12개를 X, 13번째 열을 y에 저장
X = df.iloc[:,0:12]
y = df.iloc[:, 12]
- 최적의 파라미터를 찾기 위해 학습과정에서 사용하는 검증셋을 model.fit() 함수 안에 validation_split 옵션으로 설정
history = model.fit(X_train, y_train, epochs=50, batch_size=500,
validation_split=0.25)
- 전체 코드 실행
# 학습셋과 테스트셋 설정
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'])
# 모델 실행
history=model.fit(X_train, y_train, epochs=50, batch_size=500,
validation_split=0.25) # 0.8 x 0.25 = 0.2
# 테스트 결과 출력
score=model.evaluate(X_test, y_test)
print('Test accuracy:', score[1])
[output]
Epoch 1/50
8/8 [==============================] - 1s 23ms/step - loss: 2.9423 - accuracy: 0.7519 - val_loss: 2.2360 - val_accuracy: 0.7562
Epoch 2/50
8/8 [==============================] - ETA: 0s - loss: 2.0859 - accuracy: 0.76 - 0s 6ms/step - loss: 1.7741 - accuracy: 0.7729 - val_loss: 1.3866 - val_accuracy: 0.7892
Epoch 3/50
8/8 [==============================] - 0s 6ms/step - loss: 1.0029 - accuracy: 0.8181 - val_loss: 0.6412 - val_accuracy: 0.8469
...
Epoch 49/50
8/8 [==============================] - 0s 6ms/step - loss: 0.1193 - accuracy: 0.9564 - val_loss: 0.1593 - val_accuracy: 0.9446
Epoch 50/50
8/8 [==============================] - 0s 6ms/step - loss: 0.1161 - accuracy: 0.9574 - val_loss: 0.1523 - val_accuracy: 0.9500
41/41 [==============================] - 0s 1ms/step - loss: 0.1438 - accuracy: 0.9415
Test accuracy: 0.9415384531021118
2. 모델 업데이트하기
- epoch를 적절히 설정해주기위해 에포크마다 모델의 정확도를 함께 기록하면서 저장하는 방법 이용
- 다음 코드는./data/model/all 폴더에 모델 지정하는 저장 조건 설정(ex) 50-0.9346.hdf5 50번째 에포크의 검증셋의 정확도가 0.9346)
modelpath="./data/model/all/{epoch:02d}-{val_accuracy:.4f}.hdf5"
- 학습 중인 모델을 저장하는 함수는 케라스 API의 ModelCheckpoint()
checkpointer = ModelCheckpoint(filepath=modelpath, verbose=1)
- 모델을 실행시켜 파일명을 통해 에포크 수와 정확도를 알 수 있음
- 테스트 결과로는 93.9% 정확도 출력
# 모델 실행
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])
[output]
Epoch 00001: saving model to ../data/model/all\01-0.7646.hdf5
Epoch 00002: saving model to ../data/model/all\02-0.7646.hdf5
...
Epoch 00048: saving model to ../data/model/all\48-0.9408.hdf5
Epoch 00049: saving model to ../data/model/all\49-0.9408.hdf5
Epoch 00050: saving model to ../data/model/all\50-0.9408.hdf5
41/41 [==============================] - 0s 2ms/step - loss: 0.1686 - accuracy: 0.9392
Test accuracy: 0.939230740070343
3. 그래프로 과적합 확인하기
- 적절한 학습 횟수를 정하기 위해 검증셋과 테스트셋의 결과를 그래프로 확인
- 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()는 학습이 진행되어도 테스트셋 오차가 줄어들지 않으면 학습을 자동으로 멈추게 하는 함수
- monitor 옵션은 model.fit()의 실행 결과 중 어떤 것을 이용할지 결정
- patience 옵션은 지정된 값이 몇 번 이상 향상되지 않으면 학습을 종료시킬지 결정
# 학습이 언제 자동 중단될지 설정
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])
[output]
Epoch 1/2000
8/8 [==============================] - 0s 18ms/step - loss: 21.4771 - accuracy: 0.2494 - val_loss: 14.8183 - val_accuracy: 0.2462
Epoch 2/2000
8/8 [==============================] - 0s 5ms/step - loss: 11.2518 - accuracy: 0.2494 - val_loss: 7.2853 - val_accuracy: 0.2462
Epoch 3/2000
8/8 [==============================] - 0s 5ms/step - loss: 4.9423 - accuracy: 0.2476 - val_loss: 1.8426 - val_accuracy: 0.2200
...
Epoch 392/2000
8/8 [==============================] - 0s 6ms/step - loss: 0.0487 - accuracy: 0.9836 - val_loss: 0.0656 - val_accuracy: 0.9823
Epoch 393/2000
8/8 [==============================] - 0s 5ms/step - loss: 0.0485 - accuracy: 0.9828 - val_loss: 0.0632 - val_accuracy: 0.9846
Epoch 394/2000
8/8 [==============================] - 0s 5ms/step - loss: 0.0500 - accuracy: 0.9828 - val_loss: 0.0651 - val_accuracy: 0.9846
- 테스트 결과, 기본 소스가 94.15%의 정확도를 보였던 것과 비교하면 모델 성능이 대폭 향상된 것을 확인
# 테스트 결과를 출력합니다.
score=model.evaluate(X_test, y_test)
print('Test accuracy:', score[1])
[output]
41/41 [==============================] - 0s 1ms/step - loss: 0.0472 - accuracy: 0.9885
Test accuracy: 0.9884615540504456
'데이터 > 딥러닝' 카테고리의 다른 글
[모두의 딥러닝] Chapter 5 | 딥러닝 활용하기 - 자연어처리(NLP) (0) | 2023.02.21 |
---|---|
[모두의 딥러닝] Chapter 5 | 딥러닝 활용하기 - 컨볼루션 신경망(CNN) (0) | 2023.02.20 |
[모두의 딥러닝] Chapter 4 | 딥러닝 기본기 다지기 - 모델 성능 검증하기 (0) | 2023.02.14 |
[모두의 딥러닝] Chapter 4 | 딥러닝 기본기 다지기 - 모델 설계, 다중분류 문제 해결 (0) | 2023.02.13 |
[모두의 딥러닝] Chapter 3 | 신경망의 이해 - 오차 역전파 (0) | 2023.02.04 |