본문 바로가기
인공지능 개발하기/Machine Learning

[Tensorflow] 16. 데이터쪼개기 2) validation data

by 선의공 2024. 1. 13.

 

 

 

지금까지는 모델을 훈련 시킬때

훈련 데이터만 넣어 훈련시켰습니다.

 

해당 포스팅에서도 이 내용을 다뤘었죠!

https://aigaeddo.tistory.com/10

 

7. 데이터) 데이터 쪼개기 (훈련 데이터, 평가 데이터)

전에 코드들에서는 10개면 10개 전부 모델에 훈련시켰는데요,,, https://aigaeddo.tistory.com/9 6. 데이터) 입출력 데이터 개수 변경 안녕하세요. 학원에서 저는 텐서플로우 기초를 배우고 있습니다. 학습

aigaeddo.tistory.com

 그런데 위 방식으론

 

모델 자신이 훈련을 잘하고 있는지

평가를 한적이 없었어요.

 

그냥 정답과 답안지를 가지고만

학습을 해왔죠.

 

그렇다면 참고서를 주고

공부를 얼마나 잘하고있나

채점하면서 공부 하면

학습 능률이 더 올라가지 않을까요?

 

그래서

그런데 모델이 평가를 직접 하면서 훈련을 하도록 해주는

validation data을 소개하겠습니다.


 

 

1. Validation Data

 

validation set이란 이름은 다르지만

해당 포스팅에서 잘 설명해주셔서

참고해서 학습하겠습니다.

 

https://3months.tistory.com/118

 

Machine Learning에서 validation set을 사용하는 이유

validation set은 machine learning 또는 통계에서 기본적인 개념 중 하나입니다. 하지만 실무를 할때 귀찮은 부분 중 하나이며 간과되기도 합니다. 그냥 training set으로 training을 하고 test만 하면 되지 왜

3months.tistory.com

 

 

기존에 데이터를 쪼갤 때 

Train data, Test data로 쪼갰다면

 

Validation data까지 세개로 쪼개는겁니다.

위의 사진처럼

Train data, Test data, Validation data 이렇게요. 

 

이 Validation Data는 이제 모델이 훈련할때

평가를 하는 데이터가 됩니다.

 

훈련을 거치고 validation data란 알지 못하는 데이터로

자체적으로

평가를 해서 가장 좋은 모델을 선택한다고 합니다.

 

 


 

2. 사용하기

 

데이터를 나누는 방식은

두가지가 있습니다.

 

1) train_test_split 2번 사용하기 

 

scikitlearn의 train_test_split함수를 두 번 사용하는 겁니다.

train data, test data를 일정 부분 나눠준 후

 train data 중 일부를 validation data로 혹은,

test data 중 일부를 validation data로 나누는거죠.

x_train, x_test, y_train, y_test = train_test_split(x,y, shuffle=True, train_size=0.85, 
                                                        random_state=random_random_state)
x_train, x_test, x_val, y_val = train_test_split(x,y, shuffle=True, train_size=0.2, 
                                                        random_state=random_random_state)

 

이후 모델을 구성하고

훈련시킬때

fit() 함수의 validation_data라는 파라미터에

나눠준 값을 넣어 넣어서 훈련시킵니다.

model = Sequential()
model.add(Dense(64, input_dim = len(x.columns)))
model.add(Dense(32))
model.add(Dense(1))
    

#컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train, epochs=100, batch_size=100, validation_data= [x_val, y_val])

 

 

2) fit()함수의 validation_split 사용하기

 

이 방식은 좀 더 쉽습니다.

train_test_split 함수를 추가로 사용하지 않고

모델 구성시 fit() 함수의 validation_split 파라미터를 설정하는거에요.

model.fit(x_train, y_train, epochs=100, batch_size=100, validation_split=0.2)

 

이렇게 되면 모델의 fit progress log에

val_ loss가 추가로 찍히는 것을 확인할 수 있습니다.

->

 

 

 

 

 


3. 평가

 

 

val_loss는 훈련 loss 값보다 신뢰도가 더 높습니다.

학습된 데이터로 평가를 한게 아니기 때문이에요.

 

또한

val_loss보다 

model.eveluate(x_test, y_test)로 평가한

evaluate loss값이 신뢰도가 더 높을 거구요.

 

신뢰도: test evaluate losst > val loss > train loss

 

또 val loss와 train loss와의 

차이가 많이 없다면 이것도

신뢰도가 높은 모델이겠죠.

 

validation data를 많이 나눠주면 잘라준 만큼

train 혹은 test 데이터의 양이 줄어들어 훈련에 영향을 주기 떄문에

이것도 고려해야할 사항입니다.

 

이런 여러가지를 적절히 평가하면서

하이퍼파라미터 튜닝을 해야겠습니다.