과적합(Overfitting) 방지

KangHo Lee's avatar
Jun 20, 2025
과적합(Overfitting) 방지

🚫 과적합 방지 가이드: 교차 검증과 데이터 분할 전략

  • 머신러닝 모델을 만들다 보면, 학습 정확도는 높은데 실제로는 예측이 잘 되지 않는 현상을 경험한 적 있을 겁니다. 이것이 바로 과적합(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일 때
notion image

✔️ 장점

항목
설명
정확성
분할 운의 영향 ↓, 평가 신뢰도 ↑
데이터 낭비 없음
모든 데이터를 훈련과 평가에 사용
과적합 탐지
반복 평가로 일관된 성능 확인 가능

코드 예시 (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

devleekangho