딥러닝

ANN 인공신경망을 이용해 자동차 연비 예측하기 EarlyStopping 콜백(callback) 사용

HooSL 2022. 3. 29. 11:27

필요한 라이브러리 import

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

구글 드라이브 마운트

from google.colab import drive
drive.mount('/content/drive')

 

auto-mpg.csv
0.01MB

csv파일 읽기

import os
# Working Direcctory Setting 워킹 디렉토리 세팅
os.chdir('/content/drive/csv파일 있는 위치')

df = pd.read_csv('auto-mpg.csv')

df

1. 빈데이터 확인

df.isna().sum()

 

2. 빈데이터 삭제

df=df.dropna()

 

3. X, y 설정

X=df.iloc[:,1:]
y=df['MPG']

 

4. 카테고리컬 데이터처리

Origin 컬럼은 다음과 같습니다. (1. American, 2. European,3. Japanese)

X=pd.get_dummies(X,columns=['Origin'])

더미삭제

X=X.drop('Origin_1',axis=1)

 

5. X 만 피처 스케일링 합니다. (차트 확인을 위해 y는 하지 않습니다.)

from sklearn.preprocessing import MinMaxScaler
scaler_X = MinMaxScaler()
scaler_X.fit_transform(X)
X = scaler_X.fit_transform(X)

6. Train / Test로 분리

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,random_state=7)
X_train

7. 딥러닝 모델링(모델링 해주는 함수만들고 모델링)

필요한 라이브러리

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

모델링 함수

def build_model():
  model = Sequential()
  model.add(Dense(64,'relu',input_dim=X_train.shape[1]))
  model.add(Dense(64,'relu'))
  model.add(Dense(1,activation='linear'))

  model.compile(optimizer = 'adam',loss = 'mse',metrics=['mse','mae'])

  return model

모델링

model=build_model()

 

 

중요!! 학습하기 (EarlyStopping 콜백(callback)사용하고 안하고의 차이)

이곳은 안따라하셔도 됩니다.(오래 걸림)

epoch_history = model.fit(X_train,y_train,epochs=1000,validation_split=0.2)

이렇게 에포크 1000개까지 학습합니다.

상당한 시간이 걸립니다.

이 학습한 내용을 시각화 한다면?

#학습한 후의 결과를, 보기 위해서 학습 결과의 변수에 history 변수안에 있는 데이터를 데이터 프레임으로 만들기
df_history = pd.DataFrame(epoch_history.history)
df_history

차트화

import matplotlib.pyplot as plt

def plot_history(history):
  hist = pd.DataFrame(history.history)
  hist['epoch'] = history.epoch

  plt.figure(figsize=(8,12))

  plt.subplot(2,1,1)
  plt.xlabel('Epoch')
  plt.ylabel('Mean Abs Error [MPG]')
  plt.plot(hist['epoch'], hist['mae'],
           label='Train Error')
  plt.plot(hist['epoch'], hist['val_mae'],
           label = 'Val Error')
  plt.ylim([0,5])
  plt.legend()

  plt.subplot(2,1,2)
  plt.xlabel('Epoch')
  plt.ylabel('Mean Square Error [$MPG^2$]')
  plt.plot(hist['epoch'], hist['mse'],
           label='Train Error')
  plt.plot(hist['epoch'], hist['val_mse'],
           label = 'Val Error')
  plt.ylim([0,20])
  plt.legend()
  plt.show()

plot_history(epoch_history)

그래프를 보면 수 백번 에포크를 진행한 이후에는 모델이 거의 향상되지 않는 것 같습니다.

model.fit 메서드를 수정하여 검증 점수가 향상되지 않으면 자동으로 훈련을 멈추도록 만들어줍니다.

 

그래서 !! EarlyStopping 콜백(callback)사용합니다!!

#위에 에포크 1000개 했다면 모델을 다시 만들어 줍니다.
model = build_model()
# 안했다면 윗부분은 건너뜁니다.

# patience= 파라미터는 성능향상을 체크할 에포크 수로서
# 10이라고 세팅하면 에포크가 10번 지났는데도 성능향상없으면, 멈추라는 뜻입니다.
early_stop=tf.keras.callbacks.EarlyStopping(monitor='val_loss',patience=10)

epoch_history = model.fit(X_train,y_train,epochs=1000,validation_split=0.2,
                          callbacks = [early_stop])

이번엔 에포크 172까지만 수행하고 종료됐습니다.

 

import matplotlib.pyplot as plt

def plot_history(history):
  hist = pd.DataFrame(history.history)
  hist['epoch'] = history.epoch

  plt.figure(figsize=(8,12))

  plt.subplot(2,1,1)
  plt.xlabel('Epoch')
  plt.ylabel('Mean Abs Error [MPG]')
  plt.plot(hist['epoch'], hist['mae'],
           label='Train Error')
  plt.plot(hist['epoch'], hist['val_mae'],
           label = 'Val Error')
  plt.ylim([0,5])
  plt.legend()

  plt.subplot(2,1,2)
  plt.xlabel('Epoch')
  plt.ylabel('Mean Square Error [$MPG^2$]')
  plt.plot(hist['epoch'], hist['mse'],
           label='Train Error')
  plt.plot(hist['epoch'], hist['val_mse'],
           label = 'Val Error')
  plt.ylim([0,20])
  plt.legend()
  plt.show()

plot_history(epoch_history)

몇번 동일한 값이 나오니 자동으로 종료했습니다.