👩‍💻LEARN : ML&Data/Book Study

[모두의 딥러닝] #4-14. 모델 성능 향상시키

쟈니유 2023. 2. 20. 14:29
728x90

와인데이터로 성능 향상시키기... 짤 아이디어도 슬슬 바닥난다...


#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


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