🚫 과적합 방지 가이드: 교차 검증과 데이터 분할 전략
- 머신러닝 모델을 만들다 보면, 학습 정확도는 높은데 실제로는 예측이 잘 되지 않는 현상을 경험한 적 있을 겁니다. 이것이 바로 과적합(Overfitting) 문제입니다.
- 과적합은 모델이 훈련 데이터에 너무 잘 적응한 나머지, 새로운 데이터에서는 성능이 떨어지는 현상입니다.
이 글에서는 과적합을 방지하는 대표적인 전략 두 가지를 정리합니다.
- ✅ 학습/검증/테스트셋 분할 방식
- ✅ K겹 교차 검증(K-Fold Cross Validation)
✅ 1. 과적합이란?
구분 | 설명 |
정의 | 모델이 학습 데이터를 너무 과하게 학습해 노이즈까지 외워버리는 현상 |
결과 | 학습 데이터에선 성능이 우수하지만, 새로운 데이터에서는 성능 저하 |
원인 | - 너무 복잡한 모델- 학습 데이터 부족- 평가 방식 미흡 |
✅ 2. 데이터 분할: 학습셋 / 검증셋 / 테스트셋
모델을 검증하고 과적합을 방지하기 위해 데이터는 보통 아래처럼 세 부분으로 나눕니다:
데이터셋 | 역할 |
학습셋 (Training set) | 모델 학습에 사용 |
검증셋 (Validation set) | 하이퍼파라미터 튜닝, 모델 평가에 사용 |
테스트셋 (Test set) | 최종 성능 측정 (실제 배포 전 테스트용) |
이렇게 나누면, 학습 중 평가와 최종 평가를 분리할 수 있어 과적합 여부를 쉽게 파악할 수 있습니다.
📌 예시 분할 (전체 데이터의 100% 기준):
- 70% 학습
- 15% 검증
- 15% 테스트
코드 예시 (scikit-learn 기준)
from sklearn.model_selection import train_test_split
# 1. train + temp 나누기 (temp = validation + test)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)
# 2. temp를 validation과 test로 다시 나누기
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
history=model.fit(X_train, y_train, epochs=2000, batch_size=500, validation_split=0.25, verbose=1, callbacks=[early_stopping_callback,checkpointer])
- validation_split=0.25 으로 훈련 데이터에서 25퍼센트는 검증셋으로 설정도 가능합니다.
✅ 3. K겹 교차 검증 (K-Fold Cross Validation)
검증셋을 따로 떼는 방식은 단순하지만, 데이터가 적거나 분할 운에 따라 결과가 달라질 수 있다는 단점이 있습니다. 이를 보완하는 방식이 K겹 교차 검증입니다.
✔️ 원리
- 데이터를 K개로 나눔
- 각 폴드를 한 번씩 테스트셋으로 사용 (총 K번 훈련)
- 모든 데이터가 학습/검증에 고르게 사용됨
- 결과를 평균 내어 최종 성능 평가
예:
K=5
일 때
✔️ 장점
항목 | 설명 |
정확성 | 분할 운의 영향 ↓, 평가 신뢰도 ↑ |
데이터 낭비 없음 | 모든 데이터를 훈련과 평가에 사용 |
과적합 탐지 | 반복 평가로 일관된 성능 확인 가능 |
코드 예시 (scikit-learn)
from sklearn.model_selection import KFold, cross_val_score
from sklearn.ensemble import RandomForestClassifier
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
model = RandomForestClassifier()
scores = cross_val_score(model, X, y, cv=kfold)
print("평균 정확도:", scores.mean())
✅ 비교 정리
항목 | 학습/검증/테스트셋 분할 | K겹 교차 검증 |
방식 | 고정된 1회 분할 | K번 분할 반복 |
속도 | 빠름 | 느림 (K배 연산) |
정확성 | 다소 불안정 | 평균화로 안정적 |
과적합 탐지 | 기본적인 방어 | 강력한 검증 가능 |
추천 상황 | 데이터 많을 때 | 데이터 적을 때 / 신중한 평가 필요 시 |
✨ 마무리
과적합은 머신러닝 모델의 일반화 성능을 떨어뜨리는 가장 흔한 문제 중 하나입니다.
이 문제를 피하려면 단순히 정확도를 높이는 데 집중하기보다는, 올바른 데이터 분할 전략과 검증 방식을 활용해야 합니다.
- 학습/검증/테스트셋 분리 → 모델 훈련과 평가의 구분
- K겹 교차 검증 → 신뢰성 높은 성능 측정 및 과적합 탐지
📌 좋은 모델은 훈련 성능이 아니라, '새로운 데이터에서도 잘 작동하는지'로 평가되어야 합니다.
Share article