본문 바로가기

Deep Learning

Deep Learning : validation data란 무엇이고, code에서 사용하는 방법 / 파라미터 validation_split

 

validation set을 사용하는 이유는 간단합니다. 바로 "모델의 성능을 평가하기 위해서" 입니다.  training을 한 후에 만들어진 모형이 잘 예측을 하는지 그 성능을 평가하기 위해서 사용합니다. training set의 일부를 모델의 성능을 평가하기 위해서 희생하는 것입니다. 하지만 이 희생을 감수하지 못할만큼 data set의 크기가 작다면 cross-validation이라는 방법을 쓰기도 합니다. cross-validation은 training set을 k-fold 방식을 통해 쪼개서 모든 데이터를 training과 validation 과정에 사용할 수 있게 합니다. 

 

그러면 모델의 성능을 평가하면 뭐가 좋을까요? 첫 번째는 test accuracy를 가늠해볼 수 있다는 것입니다. machine learning의 목적은 결국 unseen data 즉, test data에 대해 좋은 성능을 내는 것입니다. 그러므로 모델을 만든 후 이 모델이 unseen data에 대해 얼마나 잘 동작할지에 대해서 반드시 확인이 필요합니다. 하지만 training data를 사용해 성능을 평가하면 안되기 때문에 따로 validation set을 만들어 정확도를 측정하는 것입니다. 두 번째는 모델을 튜닝하여 모델의 성능을 높일 수 있습니다. 예를 들어 overfitting 등을 막을 수 있습니다. 예를 들어 training accuracy는 높은데 validation accuracy는 낮다면 데이터가 training set에 overfitting이 일어났을 가능성을 생각해볼 수 있습니다. 그렇다면 overfitting을 막아서 training accuracy를 희생하더라도 validation accuracy와 training accuracy를 비슷하게 맞춰줄 필요가 있습니다. 예를 들어 Deep learing을 모델을 구축한다면 regularization 과정을 한다거나 epoch을 줄이는 등의 방식으로 overfitting을 막을 수 있습니다.

X = df.iloc[:,1:-1]

y = df['mpg']

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer

ct = ColumnTransformer( [ ('encoder',OneHotEncoder(), [6] ) ] , remainder='passthrough' )
X = ct.fit_transform(X)

X = X[:,1:]

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

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=0)

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_shape= (8,)))
  model.add(Dense(64,'relu'))
  model.add(Dense(1,'linear'))
  # 옵티마이저의 learning rate설정하는방법
  model.compile(tf.keras.optimizers.RMSprop(learning_rate=0.001), loss= 'mse',metrics= ['mse','mae'])
  return model

model = build_model()

model.summary()

X_train.shape

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