와인 품질 예측 데이터
- 레드 와인과 화이트 와인에 대한 화학적 특성과 품질 등급을 통해 와인의 종류 예측
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)
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])
# 테스트 결과를 출력
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의 코드 참고
'AI > 모두의 딥러닝' 카테고리의 다른 글
[모두의 딥러닝] 20. 이미지 인식, 데이터 전처리 - MNIST 데이터 (2) | 2023.05.29 |
---|---|
[모두의 딥러닝] 19. 결측치 처리, 속성별 관련도 추출 - 부동산 가격 예측 데이터 (0) | 2023.05.29 |
[모두의 딥러닝] 17. k겹 교차 검증(k-fold cross validation) - 초음파 광물 예측 데이터 (2) | 2023.05.26 |
[모두의 딥러닝] 16. 과적합(overfitting), 테스트셋 구분, 모델 저장과 재사용 - 초음파 광물 예측 데이터 (0) | 2023.05.26 |
[모두의 딥러닝] 15. 원 - 핫 인코딩, 소프트맥스(softmax) - 아이리스(iris) 품종 데이터(다중 분류) (0) | 2023.05.25 |