Skip to main content

과적합과 과소적합

모델이 학습 데이터에서는 뛰어나지만 새로운 데이터에서 성능이 떨어지면 과적합(Overfitting), 학습 데이터에서도 성능이 낮으면 과소적합(Underfitting)입니다.

학습 목표

  • 과적합과 과소적합의 원인과 증상을 식별할 수 있습니다.
  • 편향-분산 트레이드오프(Bias-Variance Tradeoff)를 이해합니다.
  • L1/L2 정규화(Regularization)를 적용할 수 있습니다.
  • 과적합을 방지하는 다양한 전략을 사용할 수 있습니다.

왜 중요한가

과적합은 ML에서 가장 흔한 실패 원인입니다. 학습 데이터에서 99%의 정확도를 달성해도, 실제 서비스에서 70%의 성능을 보인다면 실용 가치가 없습니다.

핵심 개념

과적합 vs 과소적합 진단

상태학습 성능테스트 성능원인해결
과소적합낮음낮음모델이 너무 단순복잡도 증가, 특성 추가
적정높음높음적절한 균형유지
과적합매우 높음낮음모델이 너무 복잡정규화, 데이터 추가

편향-분산 트레이드오프

  • 편향(Bias): 모델이 학습 데이터의 패턴을 포착하지 못하는 정도 (과소적합과 관련)
  • 분산(Variance): 모델이 학습 데이터의 변화에 민감한 정도 (과적합과 관련)

정규화 (Regularization)

from sklearn.linear_model import Ridge, Lasso, ElasticNet
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

# L2 정규화 (Ridge): 가중치를 작게 유지
ridge = Ridge(alpha=1.0)
ridge.fit(X_train_s, y_train)
print(f"Ridge R²: {ridge.score(X_test_s, y_test):.4f}")

# L1 정규화 (Lasso): 불필요한 특성의 가중치를 0으로
lasso = Lasso(alpha=0.01)
lasso.fit(X_train_s, y_train)
print(f"Lasso R²: {lasso.score(X_test_s, y_test):.4f}")
print(f"Lasso 0인 계수: {sum(lasso.coef_ == 0)}개")

# ElasticNet: L1 + L2 결합
elastic = ElasticNet(alpha=0.01, l1_ratio=0.5)
elastic.fit(X_train_s, y_train)
print(f"ElasticNet R²: {elastic.score(X_test_s, y_test):.4f}")

과적합 방지 전략

전략방법관련 레퍼런스
데이터 추가더 많은 학습 데이터 수집-
정규화L1/L2 페널티 적용Ridge/Lasso
교차검증K-Fold로 일반화 성능 추정교차검증
조기 종료검증 성능이 악화되면 학습 중단XGBoost early_stopping_rounds
드롭아웃신경망 노드 랜덤 비활성화DL 탭 참고
앙상블여러 모델 결합으로 분산 감소앙상블
특성 선택불필요한 특성 제거특성 선택
# 트리 모델의 과적합 방지: max_depth, min_samples_leaf 제한
from sklearn.tree import DecisionTreeClassifier

# 과적합된 모델 (제한 없음)
dt_overfit = DecisionTreeClassifier(random_state=42)
dt_overfit.fit(X_train, y_train)
print(f"학습: {dt_overfit.score(X_train, y_train):.4f}")
print(f"테스트: {dt_overfit.score(X_test, y_test):.4f}")

# 정규화된 모델 (깊이 제한)
dt_regular = DecisionTreeClassifier(max_depth=5, min_samples_leaf=10, random_state=42)
dt_regular.fit(X_train, y_train)
print(f"학습: {dt_regular.score(X_train, y_train):.4f}")
print(f"테스트: {dt_regular.score(X_test, y_test):.4f}")
학습 성능과 검증 성능의 차이를 확인합니다. 두 성능이 모두 낮으면 과소적합, 학습 성능은 높고 검증 성능이 낮으면 과적합입니다. 학습 곡선을 그리면 시각적으로 진단할 수 있습니다.
교차검증을 통해 최적의 alpha를 탐색합니다. scikit-learn의 RidgeCV, LassoCV는 자동으로 최적 alpha를 찾아줍니다. 하이퍼파라미터 튜닝을 참고하세요.

체크리스트

  • 과적합과 과소적합의 증상을 구분할 수 있다
  • 편향-분산 트레이드오프를 설명할 수 있다
  • L1과 L2 정규화의 차이를 설명할 수 있다
  • 과적합 방지 전략을 2가지 이상 적용할 수 있다

다음 문서