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


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을 막을 수 있습니다. 


/* 2018/03/18 추가 */


validation test set과의 차이점은 test set은 모델의 '최종 성능' 을 평가하기 위해서 쓰이며, training의 과정에 관여하지 않는 차이가 있습니다. 반면 validation set은 여러 모델 중에서 최종 모델을 선정하기 위한 성능 평가에 관여한다 보시면됩니다. 따라서 validation set은 training과정에 관여하게 됩니다. 즉, validation set은 training 과정에 관여를 하며, training이 된 여러가지 모델 중 가장 좋은 하나의 모델을 고르기 위한 셋입니다. test set은 모든 training 과정이 완료된 후에 최종적으로 모델의 성능을 평가하기 위한 셋입니다. 만약 test set이 모델을 개선하는데 쓰인다면, 그건 test set이 아니라 validation set입니다. 만약 여러 모델을 성능 평가하여 그 중에서 가장 좋은 모델을 선택하고 싶지 않은 경우에는 validation set을 만들지 않아도 됩니다. 하지만 이 경우에는문제가 생길 것입니다. (test accuracy를 예측할 수도 없고, 모델 튜닝을 통해 overfitting을 방지할 수도 없습니다.)

  • 머신러닝 2017.09.05 00:36

    감사합니다.

  • 닥터케빈 2017.12.26 10:56

    좋은 글 잘 읽었습니다.
    그리고, 한 가지 궁금한 것이 있어 여쭤보고자 합니다.
    훈련셋과 검증셋을 이용하여 모델 피팅을 마무리 한 후 unseen 데이터로 예측을 한다고 할 때, 지도학습이라면 시험셋(test dataset) 역시 라벨을 가지고 있으므로 과적합 여부를 판단할 수 있을 것 같습니다.
    제가 궁금한 부분은 최종 모형의 성능과 시험셋을 적용한 결과가 다르지 않다는 것을 어떤 기준으로 판단할 수 있을까요?
    그러니까, 예를 들어 선형회귀모형을 적합한다고 할 때 검증셋을 적용한 mse와 시험셋을 적용한 mse가 서로 통계적으로 유의하다고 판단할 수 있는 기준은 무엇일까요?? 혹시 t-test로도 가능한 것일까요??
    이 내용에 대해서 찾고 있는데, 아직 찾지 못해서 여쭤본 것입니다.
    편하실 때 답변주시면 큰 도움이 될 것 같습니다. 감사합니다!

    • Deepplay 2017.12.31 15:15 신고

      검증셋이 테스트셋으로부터 임의추출되었다고 가정하면, 검증셋의 성능으로 테스트셋의 성능을 추정할 수 있을 것 같습니다. 예를 들어, 질문주신 선형회귀분석의 경우 검증셋의 MSE가 카이제곱분포를 따른다고 가정하면, 테스트셋의 MSE의 신뢰구간을 구할 수 있을 것 같습니다. classification문제의 경우에도 테스트셋에서 정답을 맞출 비율이 정규분포를 따른다고 가정하고 검증셋을 통해 비율 추정을 하면 될 것 같네요. 이부분은 저도 reference가 있는건 아니고 개인적인 생각이니 확실하진 않을 수 있습니다.

  • 딥초보 2018.03.16 11:36

    test set도 "모델의 성능을 평가하기 위해서" 사용하는 set 아닌가요? test set하고 validation set 차이가 뭔가요?

    • Deepplay 2018.03.18 16:50 신고

      네 test set도 모델의 성능을 평가하기 위해 사용하는 set이 맞습니다. 하지만 test set은 모델의 '최종 성능' 을 평가하기 위해서 쓰이며, training의 과정에 관여하지 않는 차이가 있습니다. 반면 validation set은 여러 모델 중에서 최종 모델을 선정하기 위한 성능 평가에 관여한다 보시면됩니다. 따라서 validation set은 training과정에 관여하게 됩니다.

      즉, validation set은 training 과정에 관여를 하며, training이 된 여러가지 모델 중 가장 좋은 하나의 모델을 고르기 위한 셋입니다.

      test set은 모든 training 과정이 완료된 후에 최종적으로 모델의 성능을 평가하기 위한 셋입니다. 만약 test set이 모델을 개선하는데 쓰인다면, 그건 test set이 아니라 validation set입니다.

  • hynkis 2018.03.26 19:41

    Hyperparameter tuning 등 네트워크의 모델을 개선할 때 테스트로 사용하는 set을 validation set이라고 보면 되는 것이군요!
    좋은 글 감사합니다.

  • DUBHE 2018.05.04 15:54

    좋은 글 감사합니다^^

  • 사공용협 2018.05.20 02:07

    정말 큰 도움이 된 자료입니다. validation과 test의 차이를 찾고 있었는데, 이제 명확히 알게 되었습니다.
    정말 감사합니다.

    혹시 validation accuracy가 test accuracy보다 낮을 때(test : validation = 100% : 89%, 큰 차이인진 모르겠지만 overfitting이 된 듯 하네요)
    validation accuracy를 향상시키는 방법은 뭐가 있나요?
    제 판단으로는 우선 train data를 늘리거나 epoch를 줄이는 방법이 있다고 생각하는데,
    두 지표의 변화 양상을 그래프로 그렸을 때 epoch을 줄이면 test accuracy도 같이 내려가는 경향이 있어서 난감한 상황이라
    어떤 방법이 있을까요?(보유한 데이터는 24 x 24 크기의 images, 3 class, class당 20장, train : test = 15 : 5)
    감사합니다~

    추가적으로 굳이 validation accuracy를 test accuracy와 똑같이 만들어 줄 필요가 있을까요?

    • Deepplay 2018.05.20 23:49 신고

      안녕하세요~ 질문이 혹시 training accuracy를 말씀하시는 것인가요? test accuracy는 unseen 데이터에 대한 정확도이기 때문에 training 시에는 알 수 없습니다. training accuracy라고 가정하고 답변 드리면 우선 validation accuracy가 training accuracy보다 높기는 어렵습니다. 하지만 validation accuracy를 최대한 training accuracy에 가깝게 만드는 건 매우 중요하고 머신러닝을 통해 예측 모형을 만들 때 해결해야할 한 가지 큰 과제입니다. 이를generalization이라고도 부르죠.

      말씀해주신 validation accuracy가 training accuracy보다 낮은 문제는 overfitting의 영향이며, 이를 해결하기위해 보통 모델 아키텍쳐를 바꾸거나 하이퍼 파라미터 튜닝을 하게됩니다. grid search와 같은 하이퍼파라미터 튜닝 방법을 이용해 보시면 좋을 것 같습니다. 또는 validation set과 training set의 구성이 비슷한지도 체크해보시기 바랍니다. validation set이 적절하게 샘플링되지 못하면 그러한 문제가 발생할 수 있습니다.

  • 안재광 2018.05.23 10:31

    모델을 빌드하고 학습시키는 과정에대해서 질문드립니다.
    (1)initial model 을 training set으로 학습시키고
    (2)validation 으로 정확도를 산출해내어 오버피팅 또는 다양한 하이퍼파라미터를 조정하고
    (3) 다시 (1)로 돌아가 이과정을 반복후 최종 모델에 대해서 unseen한 test set으로 acc을 산출해내어 모델을 평가함으로써 모델의 보편성?을 얻는건가요?

    + 추가로 validation 설명 해주실때 좋은 모델을 선택하실때 (2)와 같이 fitting 하는 과정으로 이해해도 될까요?

    • Deepplay 2018.05.28 03:02 신고

      네 맞습니다.
      (1)(2)를 반복하면서 가장 validation accuracy가 높은 모델, 하이퍼파라미터를 찾게 됩니다. 실제로는 이 과정에서 cross validation을 많이 사용합니다. 모델의 보편성은 validation 과정 (2) 과정에서 얻게되며, test set으로는 원칙적으로 accuracy를 알 수 없습니다. 예제에서는 test set이 주어지는 경우가 많지만 실제로는 test set은 label이 없는 데이터입니다.

  • 정현규 2019.03.04 17:06

    감사합니다.

  • 박준호 2019.03.26 17:15

    모델을 만들 때 같은 hyperparameter를 써도 Neural Network에 초기 값을 random하게 주게 되면 training 할 때 마다 다른 모델이 만들어진다고 봐야 되나요? 그러면 이것도 validation set을 통하여 더 좋은 모델을 선택할 수 있게 될까요? 그리고 좋은 모델을 선택했으면 그 모델에 validation set도 넣어서 training을 시켜서 더 좋게 만드는것도 가능한 방법인가요?

    • Deepplay 2019.03.30 17:02 신고

      안녕하세요.

      1) 네 맞습니다. deep learning 에서 쓰이는 weight initialization 방법도 모델의 일부라고 볼 수 있고 validation 과정을 통해서 hyper parameter 와 마찬가지로 최적의 방법을 선택할 수 있습니다.

      2) 네 가능합니다. validation 과정을 통해 가장 잘 작동하는 모델을 선정한 후에, 그 모델을 그대로 사용할 수도 있지만, 질문 주신 것처럼 전체 데이터를 사용해서 다시 training 하는 경우도 많습니다. 즉, validation 과정은 단지 모델을 검증하는 과정이며, 데이터를 통해 최종 예측 모형을 선정할 때는 모든 데이터를 다 사용할 수 있습니다. 또는 K-fold cross validation 후에 생성된 K 개의 모델을 앙상블하는 방법도 있습니다.

  • 최성규 2019.09.02 21:37

    좋은글 감사합니다. 몇가지 궁금한 점이 있어서 글을 남기게 되었습니다.
    첫번째로, data set을 train/valid/test로 나누었을때, h2o packages의 경우 모델을 만들때 training_frame / validation_frame을 설정할 수가 있습니다. 또한, nfolds의 옵션을 통해 교차 검증까지 가능하게 됩니다. 여기서 궁금한 점은 Train/Valid/Test를 0.7/0.2/0.1의 비율로 나누고 nfolds = 10을 주었습니다.
    이때, 교차검증에 사용되는 train의 비율은 0.63이 되는 건가요 ? 0.07은 교차검증의 유효성을 검증하는데 사용되는지요..
    또, validation_frame의 옵션을 주게 되면 training_frame에 설정된 trainingdata로 모델을 만들고 검증을 사용하는데에만 쓰이는지요.. 너무 헷갈려서 질문도 뒤죽박죽 된것 같네요..

    정리를 하면 train/valid/test가 0.7/0.2/0.1로 나누어져 있다. 예를 들어 h2o.gbm(..., training_frame = "", validation_frame="",..,nfolds = 10,..)이렇게 주어졌다면 교차 검증에 필요한 모델을 만들때 사용되는 데이터는 train의 0.9 즉 전체 데이터에서 0.63의 데이터를 사용하고 전체 데이터의 0.07의 데이터로 교차검증 모델을 검증하는데에 사용되는지 궁금합니다.
    validation_frame은 단순히 training_frame으로 만들어진 모델을 검증하는데에만 사용되는지도 궁금합니다. 감사합니다.

    • Deepplay 2019.09.08 03:47 신고

      안녕하세요. h2o document 를 보니 말씀하신것이 맞는것 같습니다. training set 의 10% 인 63 % 의 데이터가 cv 에서 training set 으로 쓰일것 같습니다. 그리고, h2o의 경우 최종 모델로 full data = 70%의 데이터를 통해 training 된 모델을 output 으로 내보내고, validation_frame 은 이 모델에 적용되는것 같습니다.

      결국, cross-validation 으로 하고 싶은 경우 nfolds를 지정하고, held-out validation 을 하고 싶으면 validation_frame 을 지정하면 되는것으로 보입니다. 만약 적어주신대로 nfolds 와 validation_frame 을 동시에 지정하게 되면, validation_frame 은 cv 에는 쓰이지 않고 test set 개념으로 쓰이는 것 같습니다. (다만 이 경우, validation_frame 의 performance 를 보고 모델을 tuning 하지 않고, cv score 만 보고 tuning 해야합니다.)

  • 장모나 2019.10.25 08:43

    Deepplay 님께,

    안녕하셔요?

    제 주변에 지식인을 찾을 수가 없어서, 여러모로 고민하다가, 윗 글을 읽고 속 후련하게 설명해 주시는 님의 모습을 보고 감동 받아서,
    실례를 무릎쓰고 고민을 털어놓게 되었습니다.

    다름 아니라, 현재 저는 대학원 경영정보학과에서 <고급연구방법론>을 수강 중입니다. 실제 저는 경영정보학과 소속이 아니고, 관광개발학과 소속입니다.
    같은 경상대에 있기도 하지만, 통계는 물론 관광학이긴 하지만 '기술수용론' 분야로 심층연구를 하고 있기에 이번 학기 머신러닝(딥러닝)에 도전하고 있습니다.
    안타깝게도 교수님께서는 딥러닝 전공자가 아니셔서, 저희들에게 직접 과제(소논문)에 필요한 딥러닝 데이터 분석(예측이겠죠)을 '자기주도학습'으로 하라고 하셨는데, 컴공과 출신이 아닌 일반 사회과학계열 출신인 제게는 무한한 도전입니다.
    R을 조금 알고, Python 기초에 발을 디딘 저는 여러 경로를 통해 고생끝에 Annconda를 설치하고 Jupyter Notebook을 통해 딥러닝 분석과정을 하는 (교재 및 온라인 상에 올린) 다른 여러 분들의 CNN 분석 예시를 보며 따라하는 정도의 수준에 다다르는데, 두달간 틈나는대로 검색과 독서를 통해 정말 힘겹게 진행 중입니다. (참고로 저는 공부하는데 시간이 오래 걸린 50대 아줌마입니다. 예전 전공이 영어교육이었고, 영어는 원어민 환경에서도 어려움이 별로 없는 것이 뭔가 도움이 되는지 어쩐지.. 그래도 통계를 공부하는 것 조차 힘겨운 싸움이었습니다. 문과 배경인지라 사조사 2급 취득하는데 1년 반이 걸렸습니다. ㅠㅠ)

    사설이 너무 길었습니다.
    아래 예시가 있는데, 이걸 흉내내어 제 사진 데이터를 실습하고자 했지만, 그대로 따라 하는 것 조차 매우 힘이 들었습니다.
    혹시 도움을 주실 수 있는지 (작서 중인 소논문을 보내드리려고 했는데, 파일 업로드가 되지 않는 군요.)

    저는 예시의 경우와 마찬가지로 테스트-훈련-확인 용 사진 데이터 들을
    깨끗한 해안가와 오염된(쓰레기가 있는) 해안가의 이미지로 대처했습니다.

    다른 분들의 예시를 따라하며서도 과정을 모두 해석하기에는 아직도 많이 모자라고 또한
    같은 이미지분석이라고 해도 각각 활성함수들을 다른 것들로 사용하기에,
    정말 그대로 따라하는 것 조차 (제 데이터를 직접 사용한다는 것은) 매우 힘든 일이네요.

    님의 답변을 기다리겠습니다. 제 이메일은 changmona4622@gmail.com 입니다.
    감사합니다.

    https://github.com/GuanqiaoDing/messy-room-classifier
    (messy-room-classifier-master)

    • 2019.11.12 19:59

      비밀댓글입니다

  • 익명 2020.07.29 15:07

    비밀댓글입니다

  • 감사합니다 2020.08.22 02:19

    대충 감으로만 이해하고 있었던 내용을 드디어 명확하게 이해하게 되었네요!
    좋은 글 감사합니다^^

  • 익명 2020.08.28 14:59

    비밀댓글입니다

  • 익명 2021.02.27 11:41

    비밀댓글입니다

  • 익명 2021.05.20 15:21

    비밀댓글입니다

  • Haekyung Im 2021.10.29 04:33

    data set의 크기가 작을때만 cross-validation을 사용할 수 있는건가요?