작성
·
215
0
조기 중단을 위한 eval_set에 test를 넣으면 안된다는 이야기를 들었는데, 어떤 이야기인지는 알겠습니다.
그런데 실제 실무에서는 어떤식으로 학습시키는지를 잘 모르겠습니다.
1) x_train과 x_test를 나눠 x_test를 테스트데이터로 잡고, x_train에서 일부를 때서 교차검증을 하든, 검증데이터를 따로 빼서 eval_set으로 넘겨주는 것이 맞는건가요?
2) 검증데이터로 조기 중단을 한 뒤, 테스트 데이터로 점검을 하는 방향으로 가는 것이라고 생각합니다. 그런데 Grid_Search_CV에서 나오는 최적 파라미터는 1개이고, 학습된 모델도 1개입니다.
그렇다면 테스트 데이터를 넣어서 점검을 하였을 때 비교할 것이 없는데 테스트 데이터를 따로 빼놓는 이유를 모르겠습니다. 무엇이 좋다 나쁘다를 확인하려면 비교대상이 있어야 되는 게 아닌가요? 테스트 데이터를 따로 빼놓아 편향이 이뤄지지 않게 하는 것 까진 이해했으나, 어디에 쓰기 위해, 무엇을 위해 빼놓는지를 잘 모르겠습니다.
실무에서 테스트 데이터가 무엇을 위해 사용되는지가 궁금합니다.
답변 2
1
안녕하십니까,
1. 네 맞습니다. 일반적으로 학습 데이터에서 검증 데이터를 따로 빼서 eval_set으로 넘겨 줍니다.
Xgboost와 같은 boosting 계열에서 인자로 부여하는 검증 데이터는 K-fold 교차검증과는 살짝 성질이 다른 부분이 있습니다. Xgboost에서 iteration을 수행하여 오류값을 줄이는 방향성을 가지고 weight를 update할 때 학습 데이터가 아닌 검증 데이터를 기반으로 오류가 지속적으로 줄어드는 지 판단합니다. 이렇게 함으로서 모델이 학습할 때 오버피팅을 어느정도는 회피 할 수 있도록 합니다.
2. 질문하신 '그런데 Grid_Search_CV에서 나오는 최적 파라미터는 1개이고, 학습된 모델도 1개입니다. 그렇다면 테스트 데이터를 넣어서 점검을 하였을 때 비교할 것이 없는데 테스트 데이터를 따로 빼놓는 이유를 모르겠습니다.'의 의미를 제가 잘 파악하지 못했습니다만 테스트 데이터의 중요성과 활용에 대해서 말씀드리겠습니다.
교차 검증을 수행하면 1차적으로 모델에 대한 평균적인 검증을 수행하게 됩니다. 더욱이 교차 검증을 수행하면 여러번 검증 데이터를 분리하면서 수행하기 때문에 반복적인 검증이 가능하여 신뢰도도 높습니다. 그럼에도 별도의 테스트 데이터를 준비하여 최종 테스트를 하는 것은 그만큼 테스트가 가지는 중요성이 있기 때문입니다. 더구나 교차 검증의 경우는 일반적으로 테스트 데이터 세트보다 데이터가 작습니다.
잘 아시다 시피 테스트 데이터는 학습된 모델을 평가하는데 사용됩니다. 때문에 테스트 데이터가 충분히 있지 않으면 제대로 된 평가를 하기 어려울때가 있습니다. 여러가지 모델 학습과 최적화를 하다보면 반복되는 노가다로(?) 인해 테스트 데이터를 적절히 확보하지 않고 일부 데이터 만으로 테스트 결과가 좋으면 수용하고자 하는 욕구가 생길때도 있습니다(전체 데이터가 많다면 이런 걱정을 할 필요도 없습니다만)
데이터가 많다면, 예를 들어 전체 10년의 데이터가 있다면 과거 8년(또는 9년)의 데이터로 학습을 하고, 최근 2년(또는 1년) 데이터로 테스트 데이터를 확보하면 좋을 것입니다. 이렇게 해서 테스트 결과가 좋으면 9년 10개월의 데이터를 학습 데이터를 기반으로 최근 1~2개월 데이터를 테스트 데이터를 주기적으로 테스트 해보면서 모델의 성능을 주기적으로 검증할 수 있는 좋은 테스트 체계를 갖추게 될 것입니다.
과거 데이터가 아예 없고, 고객 데이터와 같이 id로 부여 되는 데이터가 있다면, random하게 데이터를 샘플링하여 테스트를 준비할 수 있습니다.
또한 좀 더 엄격한 테스트를 원한다면 학습 데이터의 중요 피처값의 분포도와 다른 분포도로 테스트 데이터를 구성하여 모델이 학습 상황에서 약간 변화된 환경에서 얼마나 잘 성능을 발휘하는 지 테스트 해볼 수도 있습니다.
이처럼 좀 더 실환경에 가까운 많은 테스트 데이터와 다양한 테스트 엄격성에 기반한 테스트 시나리오는 모델 성능의 여러가지 면을 테스트 할 수 있는 좋은 방법이므로 테스트 데이터의 중요성은 큽니다.
감사합니다.
0
이해하였습니다.
제가 궁금했던 것은 테스트 셋을 빼 놓았을 때 대체 어디에 쓰는가? 였는데 도움이 되었습니다.
지금까지 배운 걸로는 '모델을 학습시킨 이후 한 번만 테스트하는 것 같은데?' 라는 생각이 들어서, 테스트 데이터 셋이 따로 빠질 필요가 있는지 의구심을 가졌습니다.
그런데 한 번이 아니라 학습 이후 주기적으로 확인한다는 점을 보니 실무에서 왜 필요한지 알 것 같습니다.
감사합니다.^^