본문 바로가기
Machine Learning/데이터 전처리

[데이터 전처리] 교차 검증

by 블루드래곤 2022. 11. 4.
728x90

교차 검증이란 무엇이고 왜 사용해야 하는가?

데이터 분석에서 널리 사용되는 홀드아웃 검증(Holdout Validation) 방법은 직관적이고 편리하다는 장점이 있다. 이러한 방법은 일반적으로 전체 데이터를 모델 훈련을 위한 훈련 데이터와 모델 성능을 검증하기 위한 테스트 데이터로 분할한다. 그중에서 훈련 데이터의 일부를 분할하여 최적의 파라미터를 탐색하기 위한 검증 데이터로 사용한다.

 

그러나, 모델 훈련에 사용할 수 있는 훈련 데이터가 작으면 잠재적으로 모델의 정확도를 감소시키는 문제가 발생한다. 반대로 검증 데이터가 지나치게 작으면 모델을 효과적으로 평가하기 어려운 문제가 존재한다. 이를 해결하기 위한 방법으로는 모델을 반복적으로 검증하기 위해 전체 훈련 데이터를 분할하여 여러 개의 훈련 및 검증 데이터 조합을 만들 수 있다. 각 데이터 조합에서 훈련 데이터는 모델 훈련에 사용되고 검증 데이터는 성능 평가에 사용된다. 여기서 모든 데이터는 적어도 한번 이상 모델의 훈련 및 검증에 사용된다. 최종적으로 각 데이터 조합에서 평가된 모델 성능의 평균을 사용하기 때문에 성능을 정확하고 효과적으로 측정할 수 있다. 

K-fold 교차 검증

교차 검증을 수행할 수 있는 몇가지 다른 방법이 존재하지만 데이터 분석에서는 직관적이고 우수한 성능으로 알려진 K-fold 교차 검증 방법을 널리 사용하고 있다. 이 방법은 전체 훈련 데이터를 K개의 크기가 동일한 데이터(또는 Fold)로 분할하고, 그중에서 한 개 데이터는 검증 데이터로 사용하고 나머지는 훈련 데이터로 사용한다. 그런 다음 

K번 훈련하고 검증할때 까지 검증 데이터를 순차적으로 사용하여 교차 검증을 수행한다. K-fold 교차 검증의 과정을 그림으로 나타내면 다음과 같다. 여기서 K 값은 임의로 설정할 수 있지만 일반적으로 5 혹은 10으로 설정할 때 가장 효과적인 성능을 나타내는 것으로 알려져 있다.

 

출처: https://scikit-learn.org/stable/modules/cross_validation.html

계층적 K-fold 교차 검증

K-fold 교차 검증 방법은 우수한 성능을 보여주고 있지만 데이터의 구조 또는 분포에 따라 편향을 발생시킬 수 있다. 예를 들어, 분류 작업에서 일부 클래스(class)는 주로 검증 또는 테스트 데이터에만 존재한다고 가정하자. 이 경우에는 모델의 학습 과정에서 해당 클래스가 제대로 반영되지 않을 가능성이 크기 때문에 만족스러운 성능을 나타내기 어려울 수 있다. 마찬가지로 회귀 작업에서 극단적으로 크거나 작은 값이 검증 또는 테스트 데이터만 존재하는 경우에도 만족스러운 성능을 기대하기 어렵다. 반대로, 이러한 극단적인 값이 테스트 데이터가 아닌 훈련 데이터에만 존재한다고 가정해보자. 이러한 경우에는 훈련된 모델이 테스트 데이터에 대해 지나치게 낙관적으로 추정할 수 있다. 이를 효과적으로 해결할 수 있는 방안은 계층적 K-fold 교차 검증 방법이다. 이 방법은 그림과 같이 클래스의 비율을 일정하게 설정하고  훈련, 검증 및 테스트 데이터를 분할한다. 다시 말해, 전체 데이터를 K개의 크기가 동일한 데이터(또는 Fold)로 분할했을 때 분할된 각 데이터의 클래스 분포가 전체 데이터의 클래스 분포와 거의 동일한 비율을 나타낸다.

출처: https://stats.stackexchange.com/posts/452798/revisions

Reference

[1] 핸즈온 머신러닝 (2 판): 사이킷런, 케라스, 텐서플로 2 를 활용한 머신러닝, 딥러닝 완벽 실무. 한빛미디어, 2020.

[2] Train/Test Split and Cross Validation – A Python Tutorial, https://algotrading101.com/learn/train-test-split/

댓글