딥러닝 시대의 train, validation, test set에 대한 고찰(70:30으로 나눠야하는가? train과 test가 서로 다른 분포? validation vs test는 무슨 차이인가?)
1. train set, validation set, test set
가지고 있는 모든 학습 데이터(training data)에서 전통적으로, 그 일부를 training set으로 사용하고
일부를 hold out cross validation set(development set)으로 쓰고 그 나머지는 test set으로 쓴다.
training set에서 어떤 모델의 training algorithm을 수행하고,
validation set은 후보로 고른 모델들의 성능을 평가하는데 사용한다.
위 과정을 충분히 반복하고 나서, 최종적으로 고른 모델이 얼마나 잘 편향없이 추론하는지(unbiased estimate) 평가하기 위해 test set을 이용하여 평가를 한다.
2. 70:30으로 데이터를 나누는 것이 정답인가?
머신러닝 시대에서는 가지고 있는 데이터를 70% train, 30% test set으로 나누거나,
60% train, 20% validation, 20% test set으로 나누는 것이 관례였다.
데이터가 100개, 1000개, 10000개정도면 합리적이지만 현대 빅데이터 시대에서는, 수백만개 정도 데이터가 있는데
validation, test set의 비율을 훨씬 작게 설정하는 것이 트렌드이다.
validation set이 여러 다른 알고리즘들 중 가장 좋은 알고리즘을 선택하는데 사용하는 set인데.. 그걸 위해 가지고 있는 데이터의 20%나 설정할 필요가 없을 수 있다.
예를 들어, 수백만개 데이터가 있을때, 10000개 정도만 validation set으로 사용해도 알고리즘을 평가하는데 사용할 수 있다.
비슷한 이유로 test set도 마찬가지로 20%나 설정할 필요가 없을 수 있다.
수백만개의 데이터가 있다면 10000개 정도면 모델을 평가하는데 충분할 수 있기 때문에..
이런 경우 98% train, 1% validation, 1% test set이 된다.
심지어 어떤 분야에서는 99.5% train, 0.25 % validation, 0.25% test set으로 설정하기도 한다.
요약하자면 상대적으로 작은 데이터 셋에서는 전통적인 관례로 70/30으로 설정하면 좋지만, 매우 큰 데이터셋에서는 훨씬 더 작게 설정해도 충분하다.
3. train data와 test data가 서로 다른 분포를 가진다면
현대 딥러닝 시대에 트렌드 중 하나는 train set과 test set의 분포가 다르다는 점이다.
예를 들어 유저들이 사진을 업로드하고, 당신이 유저들에게 보여주기 위해 고양이 사진을 찾는 앱을 만든다고 하자.
train set은 다양한 웹페이지에서 가져온 고양이 사진일 수 있다.
하지만 test set은 앱 사용자들이 올린 고양이 사진이 된다.
train set으로 다양한 웹페이지에서 가져온 고양이 사진들은 해상도가 높고 매우 전문적이며 잘 찍힌 사진일 가능성이 높지만,
test set으로 유저들이 올린 사진은 해상도가 낮을 수 있고 흐릿할수도 있으면서 평범하게 찍은 사진들일 것이다.
이런 경우 중요한 경험 법칙중 하나는 validation set과 test set의 분포를 동일하게 맞춰야한다는 점이다.
왜냐하면 validation set을 이용해서 서로 다른 모델들의 성능을 평가해서 최선의 모델을 선택하기 때문에,
validation set과 test set의 분포가 동일하다면 매우 좋을 것이다.
딥러닝 시대에 training data를 최대한 많이 확보하기 위해 web page crawling같은 다양한 창의적인 전략들을 사용할 것이다.
비록 그렇게 하더라도 validation, test set과 다른 분포를 가질지더라도, validation, test set의 분포를 동일하게 맞춘다면,
머신러닝 알고리즘이 더 빨라질 것이다.
----------------------------------------------------------------------------------------------------------------------------------------------
4. test data는 꼭 필요한가?
마지막으로, test set이 없어도 괜찮을 수 있다.
test set은 마지막으로 선택한 모델의 편향없는 추론(unbiased estimate) 성능을 평가하기 위함이다.
하지만 그럴 필요가 없다면 test set이 굳이 있지 않아도 된다.
당신이 test set은 없고 validation set을 가지고 있다면, training set에 train을 하고 서로 다른 모델들을 validation set에 대해 평가한다.
이 경우 validation set에 평가를 했기 때문에, 모델이 편향없는 추론(unbiased estimate)을 하지 않는다.
-------------------------------------------------------------------------------------------------------------------------------------------------------
5. validation set과 test set의 차이
validation set과 test set은 같은거 아닌가?
training set으로 학습을 하고, 모델의 가중치를 update한다.
여기서 학습된 모델의 중간 평가로 validation set으로 평가를 하는데...
모델의 update는 하지 않지만 train data에 overfitting된건 아닌지 validation error를 보고 평가를 해서,
hyperparameter등을 조정하고, 다시 training set으로 모델을 학습시키는 과정을 반복해서 validation error가 올라가지 않는 최적의 지점(파란색 부분)을 찾는 것이다.
이 과정이 validation set이 가중치를 update하는 건 아니지만 학습에 관여하는 것.
validation set에 맞춰서 hyperparameter가 조정되고 그러니 seen data라고 할 수 있겠다
아무튼 이렇게 찾아서 모든 학습과 검증이 끝난 마지막 모델을 test set에 평가를 하는 것
test set은 모델이 한번도 보지 않은 unseen data이다.
https://ganghee-lee.tistory.com/38
dacon같은 플랫폼에서 데이터 분석 과제를 할 때 생각하면 간단하다
주어진 train set만으로 train - validation으로 나누고 train set으로 학습 후 validation으로 평가해서, 만족할 만한 성능이 나올때,
test set에 예측 후에 제출해서 평가하는거잖아
---------------------------------------------------------------------------------------------------------------------------------------------------
validation과 test의 차이.. validation은 꼭 필요한가?라고 물어봤던 그 면접 질문에 대한 대답..
이제는 가능하겠지??
"""
validation set은 꼭 필요합니다.
가지고 있는 데이터에서 일부를 training set으로 사용하고 일부를 validation set, 나머지를 test set으로 사용합니다.
training set은 모델의 가중치를 update하는 학습을 위해 사용하고,
validation set은 학습된 서로 다른 모델들을 평가해서 가장 좋은 성능을 낸 모델을 찾는데 사용합니다.
모델의 가중치를 update하고 validation set으로 평가를 하면서 validation error가 너무 높다면,
epoch이 너무 낮아 학습이 덜 된 것은 아닌지, 혹은 오히려 epoch이 너무 높아 학습이 많이 된건 아닌지 평가를 합니다.
최적의 epoch을 찾아보고, 여러 다른 hyperparameter를 조정하거나, 구조가 다른 모델을 사용해보거나 하면서
학습 후에 validation set으로 가장 좋은 성능을 내는 모델을 찾는 과정을 수행합니다.
이런 train - validation이 끝나고 최종적으로 선택한 모델의 성능을 평가하는데 test set을 사용합니다.
validation set은 hyperparameter를 조정하는 등, 모델의 학습에 관여하게 됩니다.
가중치를 update하는 건 아니지만, 모델이 학습중에 보는 데이터(seen data)라고 할 수 있습니다.
하지만 test set은 모델의 학습에 전혀 관여하지 않습니다. 학습 중에 한번도 보지 않은 데이터(unseen data)가 됩니다.
때로는 학습 - 검증만 끝내고 모델이 학습 과정에서 한번도 보지 않은 data에 대한 일반화된 예측이 필요없다면, test set이 없어도 될 수 있습니다.
"""
---------------------------------------------------------------------------------------------------------------------------------------------------