안녕하세요, 헤오니 입니다.
오늘은 Cross Validation(교차검증)의 종류와 그 특징에 대해서 알아보려고 합니다.
Cross Validation은 ML/DL 모델링 과정에서 모델이 overfitting(과적합)이 되는 현상을 방지하기 위해 사용하는 기법입니다. 만약 CV를 하지 않는다면, 우리는 임의로 train set과 test set을 나누어 모델 성능 평가를 진행합니다. 즉, train set 한 개, test set 한 개로 성능평가를 진행하는 것으로, 이렇게 되면 모델 성능이 해당 test set에만 과도하게 적합될 가능성이 높습니다. 그러면 새로운, 기존의 test set과 다른 test set으로 예측을 하면 성능 저하가 나타나는 것이죠!
이를 방지하기 위해 머신러닝, 딥러닝에서는 CV를 사용합니다. 사실 CV의 종류는 매우 많지만, 어떤 CV가 어떤 데이터에 적합한지를 판단하는 것이 헷갈리는 경우가 많습니다. 그래서 이번 포스팅에서는 대표적인 CV의 종류, 그리고 각 CV 기법이 어떤 경우게 사용되는지 그 특징을 낱낱이 파헤쳐보려고 합니다.
1. KFold Cross Validation
KFold CV는 가장 기본적인 CV의 형태입니다. 예를 들어 5-fold CV를 시행한다고 가정합시다. 5-fold CV를 하게 되면, 각 폴드에서 train set과 test set은 아래 그림과 같이 나눠집니다.
5-fold CV의 경우 각 폴드에서 train set : test set = 4 : 1 의 비율로 나누어 생성합니다. 이 때 각 폴드에서 생성한 test set은 모두 다른 index로 구성하게 됩니다. 아래 그림과 같이 첫번째 폴드에서는 처음 20%에 해당하는 데이터를 test set으로, 두 번째 폴드에서는 그 다음 20%에 해당하는 데이터를 test set으로 설정합니다.
이러한 원리로 총 5가지의 다른 test set으로 모델 성능 평가를 함으로써 한 번만 train test split을 한 경우보다는 overfitting을 방지할 수 있습니다.
2. Stratified KFold Cross Validation
KFold는 가장 기본적인 CV 방법인데, 데이터의 특징에 따라 KFold CV도 overfitting을 충분히 방지하지 못하거나 성능을 잘 내지 못하는 경우도 있습니다. 예를 들어 반응변수 y가 0과 1을 target으로 가지는 binary 변수라고 가정합시다. 만약 0과 1의 비율이 8 : 1 로 매우 불균형(imbalanced data)한 상황이라면, 한 폴드의 test set에 클래스 1에 해당하는 데이터가 몰리는 경우가 발생할 수 있습니다. 이렇게 되면 성능평가에 문제가 발생합니다.
StratifiedKFold CV는 KFold 의 이러한 단점을 보완한 CV 기법입니다. StratifiedKFold CV에서는 각 클래스의 비율만큼 각 클래스에 해당하는 데이터가 test set에 속하도록 데이터셋을 나눕니다. 예를 들어 class 가 0, 1, 2 로 구성되어있고 각 클래스가 차지하는 비율이 0.1, 0.3, 0.6 이라고 가정해봅시다. StratifiedKFold 를 시행하면 각 폴드에서 test set에 속하는 데이터의 class 0, 1, 2 가 차지하는 비율은 0.1, 0.3, 0.6 으로, 전체 데이터셋에서 class 의 비율과 동일합니다. 즉, 요약하면 test set에서의 클래스 비율은 전체 데이터에서의 클래스 비율과 동일하므로, test set을 최대한 전체 데이터셋과 유사하게 구성할 수 있다는 것이죠!
따라서 보통 분류 모델링을 할 경우, KFold 보다는 StratifiedKFold를 적용하는 것이 더 좋은 성능을 내는 경우가 많습니다.
3. GroupKFold Cross Validation
GroupKFold CV 는 모델의 일반화성능을 더 높이기 위해 사용되는 CV 기법입니다. 예를 들어 기존의 환자 데이터를 가지고 새로운 환자의 질병을 예측하는 모델을 만들 때, 이 모델은 완전히 새로운 데이터를 최대한 정확하게 예측할 수 있어야 합니다. 이것이 바로 GroupKFold를 사용하는 이유입니다.
GroupKFold는 각 폴드에서 동일한 그룹이 train set과 test set 둘 중 하나에만 포함되도록 train test split을 진행합니다. (여기서 주의할 점은 그룹 = 반응변수 class 가 아니라는 점입니다) 이렇게 되면 train set과 test set의 그룹 구성이 완전히 달라지므로 모델의 일반화 성능을 더욱 높일 수 있습니다.
4. Time Series Split
Time Series Split CV 는 시계열 데이터에 주로 사용하는 CV 기법입니다. 이 CV는 앞서 다룬 CV 기법들과 split 양상이 조금 다릅니다. 시계열 데이터분석에서는 과거 시점의 데이터를 이용하여 미래 시점의 target 값을 예측합니다. 따라서 만약 시계열 데이터분석 시 데이터를 랜덤하게 선택하여 train set, test set을 구성하게 되면 시간이 뒤죽박죽 되어 모델링 성능이 낮아질 수 있습니다.
이러한 특징으로 인해 Time Series Split 을 진행하면 각 폴드에서의 train set의 시점이 test set의 시점보다 항상 앞서있습니다. 즉 과거의 데이터를 이용하여 미래의 데이터를 예측하고 테스트 하는 포맷을 각 폴드에서 진행하는 것이죠!
그리고 이 CV 기법의 또 다른 특징은 폴드가 점점 누적되는 형태를 띈다는 것입니다. 아래 그림과 같이 1번째 폴드에서는 20번째 index 까지의 데이터를 이용해 20-40 index에 해당하는 test set을 예측/평가했다면, 2번째 폴드에서는 40번째 index 까지의 데이터를 이용해 40-60 index에 해당하는 test set을 예측/평가합니다. 따라서 TimeSeriesSplit 에는 chaining 원리가 포함되어 있다고 볼 수 있습니다.
'Machine Learning' 카테고리의 다른 글
[CatBoost] CatBoost 알고리즘에 대한 이해 (0) | 2021.08.04 |
---|