[머신러닝/사이킷런] 교차 검증(K-Fold, Stratified K-Fold)
학습 자료: 파이썬 머신러닝 완벽 가이드(개정2판), 위키북스
교차 검증
개요
고정된 학습 데이터와 테스트 데이터로 학습할 시 나타나는 과적합(Overfitting) 문제를 개선하기 위한 방법.
ML 알고리즘이 데이터를 선별해 학습함으로써 생기는 데이터 편중을 막기 위해 별도의 여러 세트로 구성된 학습 데이터셋과 검증 데이터셋에서 학습과 평가를 수행한다.
프로세스
교차 검증 기반으로 1차 평가 -> 최종적으로 테스트 데이터셋에 적용
(테스트셋에서 분할된 학습 데이터셋을 다시 분할하여 검증 데이터셋을 만들기도 한다.)
1. K-Fold 교차 검증
개요
K 개의 데이터 폴드 세트를 만들어 K번만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행하는 방법
K번 만큼 평가를 수행한 뒤 이 K개의 평가를 평균한 결과를 가지고 예측 성능을 평가
프로세스(K=5)
1. 데이터 세트를 5등분한다.
2. 첫 번째 반복에서는 처음 4개의 등분을 학습 데이터셋, 마지막 5번째 등분 하나를 검증 데이터셋으로 설정하고 학습과 평가를 수행한다.
3. 첫 번째 평가가 끝나면 두 번째 반복에서 다시 학습과 평가 작업을 수행한다. 단, 이번에는 4번째 등분 하나를 검증 데이터셋으로 설정하도록 변경한다.
4. 마지막 5번째까지 학습과 평가를 수행하고 나면 5개의 예측 평가를 평균하여 K-Fold 평가 결과로 반영한다.
사이킷런
KFold(n_splits=K): K는 원하는 폴드 세트의 개수
split(X): 분리 수행
cross_val_score(estimator, X, y, scoring, cv): 간편한 방식의 교차 검증 방식
- estimator: Classifier or Regressor
- scoring: 예측 성능 평가 지표
- cv: 교차 검증 폴드 수
2. Stratified K-Fold
개요
불균형한(imbalanced) 분포도를 가진 레이블(y) 데이터 집합을 위한 K-Fold 방식
중요한 레이블이 매우 작은 확률로 들어 있을 때, K-Fold 방식은 각 세트의 레이블 비율을 제대로 반영하지 못한다는 문제점을 개선
원본 데이터의 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습과 검증 데이터셋을 분배
사이킷런
StratifiedKFold(n_splits=K)
split(X, y): 레이블 데이터셋도 반드시 필요
cross_val_score(): K-Fold와 동일(Fold 방식은 Estimator에 따라 달라짐, 하단 참조)
중요) 회귀와 분류에서 K-Fold 교차 검증 방식의 차이
회귀: K-Fold
분류: Stratified K-Fold
회귀의 결정값은 연속된 숫자값이기 때문에 분포를 정하는 의미가 없기 때문이다.
반면 분류에서는 데이터 불균형 및 부족 개선, 신뢰성 확보, 성능의 일관성 등 다양한 이점이 있기 때문에 일반적으로 Stratified K-Fold를 사용한다.
사용하지 말아야 할 경우는 시계열 데이터, 중복 데이터가 포함된 경우, 다중 레이블 분류, 데이터의 크기가 극단적으로 작은 경우 정도이다.
사이킷런의 cross_val_score()에서는 회귀, 분류에 따라 Fold 방식이 자동으로 정해진다.