#4-14. 모델 성능 향상시키기
모델을 만들고 학습셋 - 테스트셋으로 나누어 성능을 확인해보았다 (k겹 교차검증 등등)
단순히 성능을 확인만 하는 것이 아니라 동일한 데이터 셋으로 성능을 향상시킬수도 있다 ㅇㅅㅇ!
이를 위해선 앞으로 다음과 같은 절차가 필요하다.
1. 학습셋-검증셋(new!)-테스트셋
- model.fit() 함수에 validation_split 넣어주기
: model.fit(X_train, y_train, epoch=50, batch_size = 500, validation_split = 0.25) #학습셋의 25%라는 의미
2. 모델 업데이트
- 가장 성능이 좋은 모델을 확인하기 위해 에포크 마다 모델의 정확도 기록하기
a. 모델 저장경로 정하기 : modelpath = '경로/{epoch:02d}-{val_accuracy:.4f}.hdf5'
b. 모델 저장하는 함수 사용하기 :
from tensorflow.keras.callbacks import ModelCheckpoint
checkpointer = ModelCheckpoint(filepath=modelpath, verbose = 1)
숫자열 포매팅 : 숫자 변수 받아서 넣기
- 방법 : {변수명}
- 의미 : :02d 두자리 정수, .4f 소수점아래4자리수 실수
- 고민 : 포매팅 함수는 앞에 f를 선언하고 진행하는 거 같은데 여기에서는 그냥 변수명을 넣고 다음에 원하는 숫자열 형태를 바로 넣었다. 이렇게 하는 것에 관한 문서는 아직 찾지 못했다 흑흑
verbose 역할
- 역할 : 해당 함수의 진행 사항을 자세히 알려주는 것
- model.fit() 에서는 해당 함수의 결과값을 출력하게 함
3. 그래프로 과적합 확인하기
- 적절한 학습횟수가 어디인지 보기 위해 검증셋과 테스트셋의 결과를 그래프로 보기
a. history = model.fit~~ 에서 history에 다음 값들이 저장됨 (history.history)
: loss - 오차, 학습을 통해 구한 예측값과 실제 값의 차이
: accuracy - 정확도, 전체 샘플 중 맞춘 샘플의 비율 / metrics = ['accuracy']로 지정 시 출력됨
: val_loss - 테스트셋의 오차
: val_accuracy - 테스트셋의 정확도.
b. history엔 history.params(설정 값), history.epoch(에포크 정보)도 저장됨
c. loss와 val_loss를 각각 별도로 저장하여 그래프로 표현
numpy에서 arange의 의미
- 형식 : numpy.arange([start, ] stop, [step, ] dtype=None)
- 의미 : 반열린구간 [start, stop] 에서 step 의 크기만큼 일정하게 떨어져 있는 숫자들을 array 형태로 반환해 주는 함수다.
stop 매개변수의 값은 반드시 전달되어야 하지만 start 는 step 은 꼭 전달되지 않아도 된다. start 값이 전달되지 않았다면 0 을 기본값으로 가지며, step 값이 전달되지 않았다면 1 값을 기본값으로 갖게 된다.
- 예시 : np.arange(3) -> (0,1,2)
plt.plot에서 "o"의 의미
- 그래프에서 마커 표시하는 것을 의미함
- 자세한 내용은 그래프 그릴 때 구글링 해보기 : https://codetorial.net/matplotlib/set_marker.html
plt.legend() 의미
- 범례 표시 어디에 할 지 위치 시키는 것 https://codetorial.net/matplotlib/set_legend.html
4. 학습 자동중단 시키기
- 학습이 진행되어도 테스트셋 오차가 줄어들지 않으면 학습 멈추게 하기
a. 학습을 언제 중단시킬 지 설정하기
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
early_stopping_callback = EarlyStopping(monitor = 'val_loss', patience=20) #val_loss가 20번이 넘어도 개선x일 경우
b. 최적화 모델이 저장될 경로 정해주기
modelpath = '경로/모델이름.hdf5'
c. 최적화 모델 업데이트 및 저장
checkpointer = ModelCheckpoint(filepath = modelpath , monitor='val_loss', verbose=0, save_best_only=True)
d. 모델 실행
history = model.fit(X_train, y_train, epochs=2000, batch_size =500, validation_split = 0.25, verbose = 1 , callbacks = [early_stopping_callback, checkpointer] )
위 내용들을 반영한 실습은 아래와 같다
1. 학습셋-검증셋(new!)-테스트셋 ~ 2. 모델 업데이트
#데이터 확인
import pandas as pd
!git clone https://github.com/taehojo/data.git
df = pd.read_csv('./data/wine.csv', header=None)
#데이터 배정
X = df.iloc[:,:12]
y = df.iloc[:,12]
#검증셋 넣어서 모델 만들기
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.2)
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'])
#모델을 저장
from tensorflow.keras.callbacks import ModelCheckpoint
modelpath = "./data/model/{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(score[1])
|
Epoch 1: saving model to ./data/model/01-0.9431.hdf5
Epoch 2: saving model to ./data/model/02-0.9454.hdf5
Epoch 3: saving model to ./data/model/03-0.9446.hdf5
...이렇게 나오다가
정확도는 아래처럼 출력된다
41/41 [==============================] - 0s 2ms/step - loss: 0.1523 - accuracy: 0.9385 0.9384615421295166
3. 그래프로 과적합 확인하기
#그래프 표현하기
history = model.fit(X_train, y_train, epochs = 2000, batch_size = 500, validation_split = 0.25)
hist_df = pd.DataFrame(history.history)
y_vloss = hist_df['val_loss']
y_loss = hist_df['loss']
import numpy as np
x_len = np.arange(len(y_loss))
import matplotlib.pyplot as plt
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. 학습 자동중단 시키기
#학습 자동 중단 시키기
from tensorflow.keras.callbacks import EarlyStopping
early_stopping_callbacks = 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_callbacks, checkpointer])
score = model.evaluate(X_test, y_test)
print(score[1])
|
Epoch 32/2000
8/8 [==============================] - 0s 12ms/step - loss: 0.0219 - accuracy: 0.9923 - val_loss: 0.1150 - val_accuracy: 0.9877
Epoch 33/2000
8/8 [==============================] - 0s 10ms/step - loss: 0.0198 - accuracy: 0.9931 - val_loss: 0.1198 - val_accuracy: 0.9862
41/41 [==============================] - 0s 2ms/step - loss: 0.0496 - accuracy: 0.9892 0.989230751991272
'👩💻LEARN : ML&Data > Book Study' 카테고리의 다른 글
[모두의 딥러닝] #5-16. 컨볼루션 신경망 (CNN) (0) | 2023.02.22 |
---|---|
[모두의 딥러닝] #4-15. 실제 데이터로 만들어보는 모델 (선형회귀) (0) | 2023.02.20 |
[모두의 딥러닝] #4-13. 모델 성능 검증하기 (0) | 2023.02.19 |
[모두의 딥러닝] #4-12 다중분류 (0) | 2023.02.17 |
[모두의 딥러닝] #4-11. 데이터 다루기 : 피마 인디언 데이터 예측하기 (0) | 2023.02.16 |