[Keras] 튜토리얼6 - train, test, validation DATA
- -
● train, test, validation DATA
train, test, validation data에 대한 설명 이전 포스팅 참고
2019/12/17 - [SW개발/Python Keras] - [케라스] 무작정 튜토리얼4 - RMSE, R2 (feat.회귀모델)
● Test set과 Validation set 차이점
validation data set은 하이퍼 파라미터를 튜닝하면서 모델 스킬의 추정치를 제공하는데 사용되는 모델학습에서 사용되는 데이터 입니다. validation set은 모델 학습에서 사용된 test set과 다르지만, 최정 모델을 비교하거나 선택할 때 최종 튜닝 된 모델의 기술에 대해 unbiased된 추정치를 제공하는데 사용됩니다.
응용 머신 러닝에서 유효성 검사 데이터(validation)가 정확히 무엇이고 테스트 데이터(test)와 어떻게 대해 많은 혼란이 있습니다. 일반적으로 validation set는 test set과 상호 교환 가능하게 사용되며 모델 학습에서 사용되는 데이터 셋의 샘플을 나타냅니다.
train data set에 대한 모델 성능 평가는 bias된 점수를 초래하게 됩니다. 따라서 모델은 unbiased 모델 기술의 추정치를 제공하기 위해 validation set을 사용하는 것 입니다. 즉, validation set은 모델의 성능을 평가하기 위해 train data의 일부를 사용하여 train한 모델이 잘 예측을 하는지 평가하는데 쓰입니다.
이상적으로는 모델을 구축하거나 미세 조정하는 데 사용되지 않은 샘플에 대해 모델을 평가하여 편견없는 모델 효과를 제공해야합니다. 많은 양의 데이터가있는 경우 최종 모델을 평가하기 위해 샘플 세트를 따로 보관할 수 있습니다. "훈련"데이터 세트는 모델을 작성하는 데 사용되는 샘플의 일반적인 용어이며 "테스트"또는 "유효성 검증"데이터 세트는 성능을 검증하는 데 사용됩니다.
— Max Kuhn 및 Kjell Johnson, 67 페이지,Applied Predictive Modeling , 2013
- Train set :
학습에 사용되는 모델에 맞는 예제 세트
- Test set :
완전히 지정된 분류기의 성능을 평가하기 위해서만 사용되는 예제 세트
교육 데이터 세트에 대한 최종 모델 적합에 대한 편견없는 평가를 제공하는 데 사용되는 데이터 샘플입니다.
- Validation set :
신경망에서 히든 유닛의수를 선택하기 위해 분류기의 매개변수를 조정하는데 사용되는 예제세트
모델 하이퍼 파라미터를 튜닝하면서 훈련 데이터 셋에 대한 모델의 편견없는 평가를 제공하는 데 사용되는 데이터 샘플. 유효성 검증 데이터 세트에 대한 기술이 모델 구성에 통합됨에 따라 평가가 더 편향됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# split data
data = ...
train, validation, test = split(data)
# tune model hyperparameters
parameters = ...
for params in parameters:
model = fit(train, params)
skill = evaluate(model, validation)
# evaluate final model for comparison with other models
model = fit(train)
skill = evaluate(model, test)
|
cs |
○ validation data를 사용하면 좋은점
- validation set을 통해 성능을 평가하게 되면 test acc를 예측하여 새로운 데이터(unseen data)에 대해 얼마나 잘 동작하는지 예측할 수 있는 것 입니다.
- 모델을 튜닝하여 성능을 높일 수 있습니다. 예를 들어 training acc는 높은데 validation acc가 낮다면 데이터의 train set에 오버피팅이 일어났을 가능성을 생각해 볼 수 있습니다. 오버피팅을 막아 train acc를 희생하더라도 validation acc와 train acc를 비슷하게 맞춰줄 필요가 있습니다. (regularization, down epoch,... etc)
만약 여러 모델을 성능 평가하여 그 중에서 가장 좋은 모델을 선택하고 싶지 않을 경우에는 validation set을 이용하지 않아도 되지만, test acc를 예측할 수도 모델 튜닝을 통해 오버피팅을 방지할 수도 없게 됩니다.
하지만 데이터셋의 크기가 작다면 cross-validation이라는 방법을 쓰기도 합니다.
- cross-validation : train set을 k-fold방식을 통해 쪼개서 모든 데이터를 training과 validation과정에서 사용할 수 있게 하는 것
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
# 1. 데이터
import numpy as np
x_train = np.array([1,2,3,4,5,6,7,8,9,10])
y_train = np.array([1,2,3,4,5,6,7,8,9,10])
x_test = np.array([11,12,13,14,15,16,17,18,19,20])
y_test = np.array([11,12,13,14,15,16,17,18,19,20])
x_val = np.array([101,102,103,104,105])
y_val = np.array([101,102,103,104,105])
# 2. 모델 구성
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(10, input_shape=(1, ), activation='relu'))
model.add(Dense(10))
model.add(Dense(8))
model.add(Dense(1))
# 3. 훈련
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.fit(x_train, y_train, epochs=100, batch_size=1, validation_data=(x_val, y_val))
# 4. 평가 예측
loss, mse = model.evaluate(x_test, y_test, batch_size=1)
print('acc : ', mse)
y_predict = model.predict(x_test)
print(y_predict)
# RMSE 구하기
from sklearn.metrics import mean_squared_error
def RMSE(y_test, y_predict):
return np.sqrt(mean_squared_error(y_test, y_predict))
print('RMSE : ', RMSE(y_test, y_predict))
# R2 구하기
from sklearn.metrics import r2_score
r2_y_predict = r2_score(y_test, y_predict)
print('R2 : ', r2_y_predict)
|
cs |
model.fit(x_train, y_train, epochs=100, batch_size=1, validation_data=(x_val, y_val)
fit의 파라미터인 validation_data=(x_val, y_val) 부분을 살펴보면,
validation set으로 일단 x_val, y_val을 주고 epoch 1번을 돌때마다 검사하여 w를 수정하게 됩니다.
fit(훈련)은 [x_train, y_train] 와 [x_val, y_val] 사용
evaluate(평가)는 [x_test, y_test] 사용
결과
RMSE : 0.03347951925477618
R2 : 0.9998641359746023
x와 y의 데이터가 같기 때문에 사실 정확도는 거의 100프로가 나올 수 밖에 없는 예제 코드입니다.
여기서 우리는 y_val의 데이터를 마구잡이로 수정하여 RMSE와 R2가 어떻게 달라지는지 살펴봅시다.
y_val = np.array([101,107,103,104,105])
RMSE : 0.08659847941388593
R2 : 0.9990909943470548
y_val = np.array([101,107,108,102,103])
RMSE : 0.5028245397860179
R2 : 0.9693536342047248
y_val = np.array([111,777,1852,20,9876])
RMSE : 0.021329208645483013
R2 : 0.9999448563464918
y_val = np.array([11111,7322277,1814552,1,987655454])
RMSE : 0.1171493412302428
R2 : 0.9983364887090085
RMSE의 소숫점 4, 5번째가 바뀌는 것도 사실상 영향이 크다고 볼 수 있습니다. 사실 이렇게 임의로 데이터를 수정하는 것은 데이터 조작이므로 실제로 이렇게 쓸일은 없지만, y_val데이터의 무작위성에 따른 성능의 차이를 보기 위해 추가하였습니다. 다음 포스팅에서는 train, test, validation데이터를 전체 데이터에서 잘라서 사용하는 방법을 알아보도록 하겠습니다.
'AI 개발' 카테고리의 다른 글
[Keras] 튜토리얼8 - 함수형으로 모델 구축(functional API) (1) | 2019.12.21 |
---|---|
[Keras] 튜토리얼7 - 데이터 자르기(train_test_split) (1) | 2019.12.20 |
[Keras] 튜토리얼5 - summery()로 모델 구조 확인 (1) | 2019.12.18 |
[Keras] 튜토리얼4 - RMSE, R2 (feat.회귀모델) (1) | 2019.12.17 |
[Keras] 튜토리얼3 - 검증손실 값(acc, loss) (2) | 2019.12.16 |
소중한 공감 감사합니다