과적합과 과소적합 (Overfitting and Underfitting)¶
난이도: 초급~중급
선수 지식: 기초 ML 개념 (훈련/테스트 분할)
관련 문서: 정규화 이론 | 오컴의 면도날 | VC 차원 | 앙상블 방법
개요¶
과적합(Overfitting)과 과소적합(Underfitting)은 머신러닝에서 가장 핵심적인 개념이다. 편향-분산 트레이드오프(Bias-Variance Tradeoff)를 통해 이 두 현상을 이해하면, 모델의 성능을 진단하고 개선하는 체계적인 방법을 갖게 된다.
- 과적합: 모델이 훈련 데이터의 노이즈까지 학습 (낮은 훈련 오류, 높은 테스트 오류)
- 과소적합: 모델이 데이터의 패턴을 충분히 학습하지 못함 (높은 훈련 오류, 높은 테스트 오류)
핵심 개념¶
1. 정의¶
| 과소적합 (Underfitting) | 적정 (Good Fit) | 과적합 (Overfitting) | |
|---|---|---|---|
| 훈련 오류 | 높음 | 낮음 | 매우 낮음 |
| 테스트 오류 | 높음 | 낮음 | 높음 |
| 모델 상태 | 너무 단순 | 적절 | 너무 복잡 |
| 편향 | 높음 | 적정 | 낮음 |
| 분산 | 낮음 | 적정 | 높음 |
2. 편향-분산 분해 (Bias-Variance Decomposition)¶
공식¶
\[E\left[(y - \hat{f}(x))^2\right] = \underbrace{\text{Bias}[\hat{f}(x)]^2}_{\text{편향}^2} + \underbrace{\text{Var}[\hat{f}(x)]}_{\text{분산}} + \underbrace{\sigma^2}_{\text{불가축 오류}}\]
| 요소 | 의미 | 원인 |
|---|---|---|
| 편향 (Bias) | 잘못된 가정으로 인한 오류 | 과소적합 |
| 분산 (Variance) | 훈련 데이터 변동에 대한 민감도 | 과적합 |
| 불가축 오류 (\(\sigma^2\)) | 데이터 자체의 노이즈 | 줄일 수 없음 |
직관적 비유: 과녁 맞추기¶
높은 편향 + 낮은 분산 낮은 편향 + 높은 분산 낮은 편향 + 낮은 분산
(과소적합) (과적합) (이상적)
○ ○ ○
· · · · · ···
· · · · ···
· · · · · ···
·
일관되게 빗나감 흩어져 있음 과녁 중앙에 모임
3. 진단 (Detection)¶
학습 곡선 (Learning Curves)¶
훈련 세트 크기에 따른 오류 변화:
graph LR
subgraph "과소적합"
A1["훈련 오류: 높고 평탄<br/>검증 오류: 높고 평탄<br/>둘 다 높은 수준에서 수렴"]
end
subgraph "과적합"
A2["훈련 오류: 매우 낮음<br/>검증 오류: 높음<br/>큰 격차"]
end
subgraph "적정"
A3["훈련 오류: 낮음<br/>검증 오류: 낮음<br/>작은 격차"]
end | 패턴 | 진단 |
|---|---|
| 둘 다 높음, 격차 작음 | 과소적합 (높은 편향) |
| 훈련 낮음, 검증 높음, 격차 큼 | 과적합 (높은 분산) |
| 데이터 추가로 격차 감소 | 분산 문제 (더 많은 데이터 도움) |
| 데이터 추가해도 변화 없음 | 편향 문제 (모델 변경 필요) |
검증 곡선 (Validation Curves)¶
모델 복잡도(하이퍼파라미터)에 따른 오류 변화를 플롯: - 복잡도 증가 --> 훈련 오류 감소, 검증 오류 U자형
교차 검증 (Cross-Validation)¶
- 폴드 간 성능이 일관적 --> 좋은 일반화
- 폴드 간 큰 편차 --> 불안정한 모델 (높은 분산)
4. 과적합의 원인¶
| 원인 | 설명 |
|---|---|
| 데이터 대비 과도한 파라미터 | 모델이 노이즈까지 암기 |
| 과도한 학습 (에폭) | 후반 에폭에서 노이즈 학습 |
| 노이즈/오류 레이블 | 잘못된 패턴 학습 |
| 데이터 누출 (Data Leakage) | 테스트 정보가 훈련에 유입 |
| 과도하게 복잡한 아키텍처 | 불필요한 표현력 |
5. 과적합 방지 전략¶
| 전략 | 유형 | 메커니즘 |
|---|---|---|
| 더 많은 데이터 | 데이터 | 분산 감소 |
| 데이터 증강 | 데이터 | 효과적 데이터셋 증가 |
| 특성 선택 | 모델 | 차원 축소 |
| 정규화 (L1, L2) | 모델 | 가중치 제약 |
| 드롭아웃 | 모델 | 뉴런 무작위 비활성화 |
| 조기 종료 | 학습 | 학습 반복 제한 |
| 교차 검증 | 평가 | 더 나은 모델 선택 |
| 앙상블 | 모델 | 노이즈 평균화 |
| 단순한 모델 | 모델 | 용량 감소 |
| 배치 정규화 | 모델 | 학습 안정화 |
자세한 정규화 기법은 정규화 이론 참조.
6. 과소적합의 원인¶
| 원인 | 해결 방법 |
|---|---|
| 모델이 너무 단순 | 더 복잡한 모델 사용 |
| 특성 부족 / 특성 공학 미흡 | 더 많은/좋은 특성 추가 |
| 과도한 정규화 | 정규화 강도 감소 |
| 불충분한 학습 | 에폭 수 증가, 학습률 조정 |
| 잘못된 모델 유형 | 문제에 맞는 모델로 변경 |
7. 진단 의사결정 흐름¶
flowchart TD
A[모델 성능이 부족] --> B{훈련 오류가 높은가?}
B -->|예| C[과소적합<br/>높은 편향]
B -->|아니오| D{검증 오류가 높은가?}
D -->|예| E[과적합<br/>높은 분산]
D -->|아니오| F[모델 적정!]
C --> G[더 복잡한 모델]
C --> H[더 많은 특성]
C --> I[정규화 감소]
C --> J[더 오래 학습]
E --> K[더 많은 데이터]
E --> L[정규화 추가]
E --> M[단순한 모델]
E --> N[드롭아웃/조기종료] 상세 내용¶
편향-분산 트레이드오프의 예시: 다항 회귀¶
같은 데이터에 다항 함수를 적합할 때:
| 차수 | 편향 | 분산 | 상태 |
|---|---|---|---|
| 1 (직선) | 높음 | 낮음 | 과소적합 |
| 4 | 적정 | 적정 | 적정 |
| 15 | 매우 낮음 | 매우 높음 | 과적합 |
- 1차: 비선형 패턴을 잡지 못함 (편향 오류 지배)
- 15차: 모든 훈련 포인트를 통과하지만 새 데이터에서 극심한 진동 (분산 오류 지배)
모델별 과적합/과소적합 신호¶
| 모델 | 과적합 신호 | 과소적합 신호 |
|---|---|---|
| 결정 트리 | 매우 깊은 트리, 많은 리프 | 매우 얕은 트리 |
| 신경망 | 훈련 손실 계속 감소, 검증 손실 증가 | 훈련 손실도 높음 |
| 선형 모델 | 상관없는 특성의 큰 계수 | 비선형 패턴 미포착 |
| k-NN | k=1일 때 | k=n일 때 |
| 부스팅 | 라운드가 많고 학습률이 높을 때 | 라운드가 적을 때 |
언제 사용하는가¶
편향-분산 분석은 모든 ML 프로젝트의 핵심 진단 도구이다:
- 모델 성능이 기대에 미치지 못할 때 원인 진단
- 다음 단계 결정 (데이터 추가? 모델 변경? 정규화?)
- 하이퍼파라미터 튜닝의 방향 설정
- 모델 복잡도 결정
흔한 오해와 함정¶
1. "훈련 데이터를 더 추가하면 과소적합이 해결된다"¶
- 아니다. 과소적합은 모델이 너무 단순한 것이 원인이다. 더 많은 데이터는 과적합 해결에 도움이 된다. 과소적합에는 더 복잡한 모델이나 더 좋은 특성이 필요하다.
2. "과적합은 항상 나쁘다"¶
- 약간의 과적합은 허용 가능할 수 있다. 훈련 오류와 테스트 오류의 격차가 작으면서 둘 다 낮다면 약간의 과적합은 문제되지 않는다.
3. "정규화 강도는 높을수록 좋다"¶
- 과도한 정규화는 과소적합을 유발한다. 적절한 강도를 교차 검증으로 찾아야 한다.
4. "테스트 세트에서 성능이 좋으면 일반화가 잘 되는 것이다"¶
- 테스트 세트를 반복적으로 사용하여 모델을 선택하면, 테스트 세트에 대한 과적합이 발생한다. 별도의 최종 테스트 세트를 유지해야 한다.
5. "편향과 분산을 동시에 줄일 수 없다"¶
- 앙상블, 더 좋은 특성, 더 많은 데이터 등으로 동시 개선이 가능할 수 있다. 트레이드오프는 고정된 모델 복잡도에서의 이야기이다.
다른 주제와의 연결¶
- 정규화 이론: 과적합 방지의 핵심 도구
- VC 차원: 모델 복잡도와 일반화 격차의 이론적 관계
- 오컴의 면도날: 적절한 복잡도 선택의 원리
- 앙상블 방법: 배깅(분산 감소), 부스팅(편향 감소)
- 하이퍼파라미터 최적화: 최적 복잡도를 찾는 실무 방법
- 학습률: 학습률과 과적합/과소적합의 관계
자주 묻는 면접 질문¶
- 학습 곡선에서 과적합과 과소적합을 어떻게 구분하는가?
- 과적합: 훈련 오류 낮고 검증 오류 높음 (큰 격차)
-
과소적합: 둘 다 높음 (작은 격차)
-
검증 오류가 높을 때, 편향인지 분산인지 어떻게 진단하는가?
-
훈련 오류도 높으면 편향 문제. 훈련 오류는 낮지만 검증 오류가 높으면 분산 문제.
-
더 많은 훈련 데이터가 과소적합에 도움이 되는가?
-
아니다. 과소적합은 모델 용량 부족이 원인. 더 복잡한 모델이나 더 좋은 특성이 필요.
-
정규화 강도가 편향-분산에 미치는 영향은?
- 정규화 강도 증가: 편향 증가, 분산 감소. 감소: 편향 감소, 분산 증가. 교차 검증으로 최적 균형 탐색.
코드 예시¶
from sklearn.model_selection import learning_curve, validation_curve
import numpy as np
import matplotlib.pyplot as plt
# 학습 곡선 (과적합 vs 과소적합 진단)
train_sizes, train_scores, val_scores = learning_curve(
estimator=model,
X=X_train, y=y_train,
train_sizes=np.linspace(0.1, 1.0, 10),
cv=5, scoring='accuracy'
)
plt.plot(train_sizes, train_scores.mean(axis=1), label='훈련')
plt.plot(train_sizes, val_scores.mean(axis=1), label='검증')
plt.xlabel('훈련 세트 크기')
plt.ylabel('정확도')
plt.legend()
plt.title('학습 곡선')
# 검증 곡선 (하이퍼파라미터 vs 성능)
param_range = [0.001, 0.01, 0.1, 1, 10, 100]
train_scores, val_scores = validation_curve(
estimator=model,
X=X_train, y=y_train,
param_name='C', # 또는 'alpha', 'max_depth' 등
param_range=param_range,
cv=5, scoring='accuracy'
)
plt.plot(param_range, train_scores.mean(axis=1), label='훈련')
plt.plot(param_range, val_scores.mean(axis=1), label='검증')
plt.xscale('log')
plt.xlabel('하이퍼파라미터 C')
plt.ylabel('정확도')
plt.legend()
plt.title('검증 곡선')
용어 정리¶
| 영어 | 한국어 |
|---|---|
| Overfitting | 과적합 |
| Underfitting | 과소적합 |
| Bias | 편향 |
| Variance | 분산 |
| Bias-Variance Tradeoff | 편향-분산 트레이드오프 |
| Irreducible Error | 불가축 오류 |
| Learning Curve | 학습 곡선 |
| Validation Curve | 검증 곡선 |
| Generalization | 일반화 |
| Data Leakage | 데이터 누출 |
참고 자료¶
- Hastie, Tibshirani, Friedman - The Elements of Statistical Learning (Ch. 7: Model Assessment and Selection)
- Geman, Bienenstock, Doursat (1992) - "Neural Networks and the Bias/Variance Dilemma"
- Belkin et al. (2019) - "Reconciling Modern Machine-Learning Practice and the Classical Bias-Variance Trade-off"
- Andrew Ng - "Advice for Applying Machine Learning" (Stanford CS229)