모델을 만들고 나서 훈련 데이터 정확도는 99%인데 테스트 데이터에서는 70%대로 뚝 떨어지는 경우가 있습니다. 모델이 훈련 데이터를 이해한 게 아니라 외워버린 겁니다. 과적합(Overfitting)은 머신러닝에서 가장 자주 마주치는 문제 중 하나인데, 왜 생기는지를 알면 어떻게 막을지도 보입니다.
오늘은 과적합이 발생하는 구조적 이유와 대응 방법을 정리해보겠습니다. 📉
1. 편향-분산 트레이드오프

과적합을 이해하려면 편향(Bias)과 분산(Variance) 개념을 먼저 알아야 합니다. 모델의 예측 오류는 크게 이 두 가지로 분해됩니다.
편향은 모델이 데이터의 실제 패턴을 얼마나 단순하게 표현하는지를 나타냅니다. 편향이 높으면 훈련 데이터에서도 성능이 낮습니다. 너무 단순한 모델이 복잡한 패턴을 잡지 못하는 상황입니다. 이걸 과소적합(Underfitting)이라고 합니다.
분산은 훈련 데이터가 달라질 때 모델 예측이 얼마나 흔들리는지를 나타냅니다. 분산이 높으면 훈련 데이터에는 잘 맞지만 새로운 데이터에서 성능이 급격히 떨어집니다. 모델이 훈련 데이터의 노이즈까지 학습한 상태입니다. 이게 과적합입니다.
편향을 낮추면 분산이 올라가고, 분산을 낮추면 편향이 올라갑니다. 둘 사이의 균형점을 찾는 것이 모델링의 핵심입니다.
| 항목 | 과소적합 (High Bias) | 과적합 (High Variance) |
|---|---|---|
| 훈련 성능 | 낮음 | 높음 |
| 테스트 성능 | 낮음 | 낮음 |
| 훈련-테스트 성능 차이 | 작음 | 큼 |
| 원인 | 모델이 너무 단순 | 모델이 너무 복잡 |
| 대응 | 모델 복잡도 높이기 | 정규화, 데이터 추가 |
2. 과적합이 생기는 이유
2.1 모델이 너무 복잡하다
결정 트리의 깊이를 제한하지 않으면 훈련 데이터의 모든 패턴을 분기로 표현하려 합니다. 극단적으로는 각 데이터 포인트마다 하나의 리프가 생겨서 훈련 데이터를 완벽하게 외우는 모델이 만들어집니다. 훈련 정확도는 100%지만 새로운 데이터에 대해서는 아무것도 일반화하지 못한 상태입니다.
파라미터 수가 많은 신경망도 같은 이유로 과적합이 생깁니다. 모델의 표현력이 데이터의 실제 복잡도보다 훨씬 클 때, 모델은 패턴이 아닌 노이즈를 학습합니다.
2.2 데이터가 부족하다
같은 복잡도의 모델이라도 데이터가 적으면 과적합이 쉽게 생깁니다. 100개의 데이터로 1000개의 파라미터를 가진 모델을 학습하면, 모델이 데이터를 외우는 것 외에 선택지가 없습니다. 데이터가 많아질수록 모델은 특정 샘플에 의존하지 않고 일반적인 패턴을 학습할 수 있습니다.
2.3 너무 오래 학습한다
부스팅 계열 모델에서 트리 수를 지나치게 크게 잡거나, 신경망에서 에포크를 너무 많이 주면 초반에는 일반적인 패턴을 학습하다가 후반부에는 노이즈를 학습하기 시작합니다. 검증 손실이 더 이상 줄지 않고 올라가기 시작하는 지점이 과적합의 시작점입니다.
3. 과적합 감지
훈련 성능과 검증 성능의 차이를 학습 곡선(Learning Curve)으로 시각화하면 과적합 여부를 직관적으로 파악할 수 있습니다. 훈련 손실은 계속 내려가는데 검증 손실이 어느 지점에서 다시 올라가기 시작한다면 그 지점이 과적합의 시작입니다.
from sklearn.model_selection import learning_curve
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
import numpy as np
data = load_breast_cancer()
X, y = data.data, data.target
model = DecisionTreeClassifier(random_state=42)
train_sizes, train_scores, val_scores = learning_curve(
model, X, y,
cv=5,
train_sizes=np.linspace(0.1, 1.0, 10),
scoring='accuracy'
)
train_mean = train_scores.mean(axis=1)
val_mean = val_scores.mean(axis=1)
plt.figure(figsize=(8, 5))
plt.plot(train_sizes, train_mean, label='훈련 정확도', color='#2196F3')
plt.plot(train_sizes, val_mean, label='검증 정확도', color='#FF5722')
plt.xlabel('훈련 샘플 수')
plt.ylabel('정확도')
plt.title('학습 곡선')
plt.legend()
plt.grid(alpha=0.3)
plt.tight_layout()
plt.savefig('learning_curve.png', dpi=150)
plt.show()
4. 과적합 대응 방법

4.1 정규화 (Regularization)
모델 파라미터가 지나치게 커지는 것에 패널티를 부과해 모델을 단순하게 만드는 방법입니다. L1 정규화(Lasso)는 일부 파라미터를 아예 0으로 만들어 피처 선택 효과를 냅니다. L2 정규화(Ridge)는 파라미터를 0에 가깝게 줄이되 완전히 0으로 만들지는 않습니다. XGBoost의 reg_alpha, reg_lambda, 선형 모델의 C 파라미터가 이 역할을 합니다.
4.2 Early Stopping
검증 성능이 더 이상 개선되지 않을 때 학습을 조기 종료합니다. XGBoost, LightGBM, 신경망 모두 지원합니다. 트리 수나 에포크를 크게 잡아두고 Early Stopping으로 자동 조절하는 방식이 실무에서 가장 편합니다. 이전 글에서 다뤘던 XGBoost의 early_stopping_rounds가 바로 이 방법입니다.
4.3 드롭아웃 (Dropout)
신경망에서 학습 중 무작위로 일부 뉴런을 비활성화하는 방법입니다. 특정 뉴런에 의존하지 않도록 강제해서 더 일반화된 표현을 학습합니다. 추론 시에는 모든 뉴런을 사용합니다.
4.4 데이터 증강과 추가 수집
데이터가 근본적으로 부족한 상황에서는 정규화나 Early Stopping만으로 한계가 있습니다. 이미지 데이터라면 회전, 플립, 크롭 같은 증강 기법으로 데이터를 늘릴 수 있습니다. 정형 데이터라면 SMOTE 같은 합성 데이터 생성이나 추가 수집이 근본적인 해결책입니다.
| 방법 | 적용 대상 | 핵심 원리 | 주요 파라미터 |
|---|---|---|---|
| L1 / L2 정규화 | 선형 모델, 트리 계열 | 파라미터 크기에 패널티 | alpha, lambda, C |
| Early Stopping | 부스팅, 신경망 | 검증 성능 개선 없으면 조기 종료 | early_stopping_rounds |
| Dropout | 신경망 | 뉴런 무작위 비활성화 | dropout rate |
| 모델 단순화 | 트리 계열 | 깊이, 리프 수 제한 | max_depth, min_samples_leaf |
| 데이터 증강 / 추가 | 전체 | 학습 데이터 다양성 확보 | — |
5. 교차 검증과의 관계
과적합을 감지하고 모델을 공정하게 평가하려면 데이터를 어떻게 나누는지가 중요합니다. 단순히 훈련/테스트를 한 번만 나누면 운 좋게 쉬운 테스트 세트를 받을 수도 있습니다. 교차 검증(Cross Validation)은 데이터를 여러 폴드로 나눠 번갈아 검증 세트로 쓰는 방식으로, 더 신뢰할 수 있는 성능 추정을 줍니다. 다음 글에서 자세히 다룰 예정입니다.
정리
과적합은 모델 복잡도와 데이터 양의 불균형에서 시작합니다. 처음엔 훈련 정확도만 보고 좋은 모델이라고 생각했다가, 실제 데이터에서 성능이 안 나오는 경험을 몇 번 하고 나서 검증 성능을 같이 모니터링하는 게 습관이 됐습니다.
정규화 파라미터는 수치를 외우는 것보다 직접 값을 바꿔가며 훈련-검증 성능 차이가 어떻게 달라지는지 보는 게 감을 잡는 가장 빠른 방법입니다. 😊
'AI > ML' 카테고리의 다른 글
| [머신러닝] 교차 검증, 공정한 평가 기준 (1) | 2026.06.11 |
|---|---|
| [머신러닝] L1과 L2 정규화 (2) | 2026.06.05 |
| [머신러닝] 회귀 모델 오차 지표 비교 (0) | 2026.05.29 |
| [머신러닝] 분류 모델 평가 완전 정리 (0) | 2026.05.28 |
| [머신러닝] SVM, 마진을 설계하는 모델 (0) | 2026.05.28 |
HELLO WORLD
안녕하세요. 데이터로 말하는 분석가 모모입니다.
데이터를 구조화하고 분석하는 과정과 실무에 활용되는 도구 중심의 내용을 기록합니다.