K-Fold Cross Validation(K-겹 교차 검증)은 머신러닝 모델의 성능을 평가하는데 사용되는 중요한 기법입니다. 일반적인 데이터셋을 훈련 데이터와 테스트 데이터로 단순 분할하는 방식보다 더 신뢰성 높은 성능 평가를 제공합니다.
1. K-Fold Cross Validation 개념
K-Fold Cross Validation은 다음과 같은 단계로 진행됩니다.
- 데이터 분할
- 전체 데이터를 K개의 서브셋(폴드, Fold)으로 균등하게 분할합니다.
- 모델 학습 및 검증
- K번 반복하여 모델을 학습하고 평가합니다.
- 각 반복에서 K개의 서브셋 중 하나를 테스트 데이터로 사용하고, 나머지 K-1개의 서브셋을 훈련 데이터로 사용합니다.
- 평균 성능 평가
- K번 수행한 테스트 결과의 성능을 평균 내어 최종 성능 평가 값을 결정합니다.
2. K-Fold Cross Validation의 장점
- 모델 평가의 안정성
- 데이터 분할에 따른 편향(Bias)과 분산(Variance)을 줄일 수 있음
- 특정 데이터에만 의존하는 모델을 방지하여 일반화 성능을 높임
- 데이터 활용 극대화
- 데이터셋을 훈련과 테스트로 나누는 과정에서 낭비되는 데이터가 적음
- 모든 데이터가 한 번씩은 테스트 데이터로 사용됨
- Overfitting 방지
- 다양한 데이터 조합에서 테스트하므로 과적합(Overfitting)을 방지하는 효과가 있음
3. K 값(K-Fold의 개수) 선택 기준
- K 값이 작을 경우 (예: K=2, K=5)
- 훈련 데이터가 많아서 모델의 학습이 잘 되지만, 테스트 데이터의 개수가 적어 평가의 신뢰도가 낮아질 수 있음
- K 값이 클 경우 (예: K=10, K=20)
- 테스트 데이터가 많아 평가의 신뢰도가 증가하지만, 훈련 데이터가 줄어들어 모델 학습이 어려울 수 있음
- K가 너무 크면 연산 비용이 증가하여 시간이 오래 걸림
- 일반적인 선택
- K=5 또는 K=10이 가장 많이 사용됨
- 데이터 양이 많을 경우 K=10이 좋은 선택일 수 있음
4. K-Fold Cross Validation의 유형
1) 일반 K-Fold Cross Validation
- 가장 기본적인 방식으로 K개의 Fold로 나누어 모든 데이터를 한 번씩 테스트 데이터로 사용
2) Stratified K-Fold Cross Validation
- 분류(Classification) 문제에서 각 클래스의 비율을 균등하게 유지하도록 K개로 분할
- 데이터 불균형이 있는 경우 유용
3) Leave-One-Out Cross Validation (LOO-CV)
- K를 데이터셋 크기(N)만큼 설정하여 한 개의 데이터를 테스트 데이터로 사용하고, 나머지 데이터를 훈련 데이터로 사용
- 데이터셋이 작을 때 사용 가능하지만, 연산량이 매우 큼
4) Repeated K-Fold Cross Validation
- K-Fold Cross Validation을 여러 번 반복하여 평균 성능을 측정
- 모델 성능 평가의 안정성을 높일 수 있음
5. K-Fold Cross Validation 구현 (Python 코드 예제)
아래는 Scikit-Learn을 사용하여 K-Fold Cross Validation을 적용하는 코드 예제입니다.
from sklearn.model_selection import KFold, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
# 데이터셋 로드
data = load_iris()
X, y = data.data, data.target
# K-Fold 설정 (K=5)
kf = KFold(n_splits=5, shuffle=True, random_state=42)
# 모델 선택
model = LogisticRegression(max_iter=200)
# 교차 검증 수행
scores = cross_val_score(model, X, y, cv=kf)
# 결과 출력
print(f"K-Fold Cross Validation Accuracy Scores: {scores}")
print(f"Mean Accuracy: {scores.mean():.4f}")
6. 결론
- K-Fold Cross Validation은 데이터셋을 여러 개의 폴드로 나누어 모델의 일반화 성능을 평가하는 방법입니다.
- 데이터 활용도를 높이며, 모델이 과적합되는 것을 방지하는 효과가 있습니다.
- 일반적으로 K=5 또는 K=10을 사용하며, 데이터 분포가 불균형할 경우 Stratified K-Fold를 활용하는 것이 좋습니다.
- Scikit-Learn의
KFold
와cross_val_score
을 사용하여 간단하게 구현할 수 있습니다.