과적합 첫걸음 (Overfitting: A First Look)
난이도: 초급
선수 지식: 훈련·검증·테스트
관련 문서: 과적합과 과소적합 | 편향-분산 트레이드오프 | 정규화 이론
핵심 요약: 과적합은 모델이 훈련 데이터를 “이해”하는 대신 “외워버리는” 것이다. 훈련 정확도는 100%로 오르는데 새 데이터에서는 오히려 나빠진다. 알아채는 방법은 하나다 — 훈련 점수와 검증 점수의 격차를 보면 된다. 격차가 벌어지기 시작하는 지점이 과적합의 시작이고, 그 전에 멈추는 것이 가장 간단한 해법이다.
초보자를 위한 핵심 용어
섹션 제목: “초보자를 위한 핵심 용어”- 과적합(Overfitting): 훈련 데이터에 지나치게 맞춰져 새 데이터에서 성능이 떨어지는 것.
- 과소적합(Underfitting): 모델이 너무 단순해 훈련 데이터조차 제대로 못 맞히는 것.
- 일반화 격차(Generalization Gap): 훈련 점수 − 검증 점수. 과적합의 크기를 재는 자다.
- 모델 복잡도(Model Complexity): 모델이 표현할 수 있는 패턴의 다양함. 트리 깊이, 파라미터 수 등으로 조절한다.
- 정규화(Regularization): 모델이 훈련 데이터를 너무 완벽히 맞히지 못하도록 일부러 제약을 거는 기법.
머신러닝을 처음 하면 반드시 겪는 일이 있다. 훈련 정확도가 99%인데 실제로 써 보면 형편없는 것이다.
이유는 단순하다. 모델은 “정확도를 높여라”라는 지시만 받았지 “이해해라”라는 지시는 받지 않았다. 그래서 가장 쉬운 방법 — 외우기 — 를 택한다. 데이터에 있는 진짜 규칙뿐 아니라 우연한 잡음까지 함께 외운다.
비유: 기출문제만 외운 학생이다. 작년 기출은 100점을 받지만, 숫자만 살짝 바꾼 문제가 나오면 0점이다. 문제를 푸는 법이 아니라 답을 외웠기 때문이다. 반대로 과소적합은 공부를 덜 한 학생이라 기출문제조차 못 푼다. 우리가 원하는 것은 원리를 이해한 학생 — 처음 보는 문제도 풀어내는 학생이다.
탄생 배경
섹션 제목: “탄생 배경”과적합은 머신러닝이 발명한 문제가 아니다. 통계학이 200년 전부터 알고 있던 문제다.
19세기 천문학자들은 관측 데이터에 곡선을 맞출 때, 차수를 높이면 모든 점을 정확히 지나가는 곡선을 만들 수 있다는 것을 알고 있었다. 개의 점은 차 다항식으로 완벽하게 통과시킬 수 있다. 그러나 그 곡선으로 다음 관측을 예측하면 터무니없는 값이 나왔다.
1901년 오컴의 면도날을 통계에 도입한 논의부터, 1974년 Stone의 교차 검증 정립, 1970년 Hoerl & Kennard의 Ridge 회귀까지 — 통계학의 상당 부분이 “어떻게 하면 데이터에 너무 맞추지 않을 것인가”를 다뤄 왔다.
딥러닝 시대에 와서 이 문제는 더 커졌다. 파라미터가 수십억 개인 모델은 훈련 데이터를 통째로 외울 능력이 충분하기 때문이다. 흥미롭게도 아주 큰 모델에서는 오히려 성능이 다시 좋아지는 이중 하강 현상도 관찰되어, 고전 이론만으로는 설명되지 않는 영역이 남아 있다.
핵심 개념
섹션 제목: “핵심 개념”1. 어떻게 알아채는가 — 격차를 본다
섹션 제목: “1. 어떻게 알아채는가 — 격차를 본다”과적합 진단은 숫자 두 개면 충분하다.
| 훈련 점수 | 검증 점수 | 진단 | 해야 할 일 |
|---|---|---|---|
| 낮음 | 낮음 | 과소적합 | 모델을 키운다, 특성을 늘린다 |
| 높음 | 낮음 | 과적합 | 모델을 줄인다, 데이터를 늘린다, 정규화 |
| 높음 | 높음 | 좋음 | 그대로 |
| 낮음 | 높음 | 이상함 | 분할이나 코드에 버그 |
핵심 지표는 정확도 자체가 아니라 격차다. 훈련 정확도 100%는 그 자체로 좋지도 나쁘지도 않다. 검증 정확도가 함께 높으면 좋은 것이고, 검증만 낮으면 외운 것이다.
2. 왜 생기는가
섹션 제목: “2. 왜 생기는가”세 가지 조건이 겹칠 때 심해진다.
- 모델이 데이터에 비해 너무 복잡할 때 — 파라미터가 데이터보다 많으면 외울 수 있다
- 데이터가 적을 때 — 우연한 패턴이 진짜 규칙처럼 보인다
- 데이터에 잡음이 많을 때 — 모델이 잡음까지 규칙으로 학습한다
3. 무엇부터 해 볼 것인가
섹션 제목: “3. 무엇부터 해 볼 것인가”효과와 비용을 함께 고려한 실무 순서다.
| 순서 | 방법 | 비용 | 효과 |
|---|---|---|---|
| 1 | 데이터를 더 모은다 | 높음 | 가장 확실 |
| 2 | 모델을 단순하게 (깊이·파라미터 축소) | 낮음 | 즉시 |
| 3 | 조기 종료 (검증 점수가 나빠지면 중단) | 매우 낮음 | 좋음 |
| 4 | 정규화 (L1/L2, 드롭아웃) | 낮음 | 좋음 |
| 5 | 데이터 증강 | 중간 | 이미지·음성에 효과적 |
| 6 | 앙상블 | 중간 | 분산 감소 |
데이터를 더 모으는 것이 가장 확실하지만 가장 비싸다. 그래서 실무에서는 2~4번을 먼저 시도한다.
숫자로 이해하기
섹션 제목: “숫자로 이해하기”결정 트리의 깊이를 늘려가며 훈련·테스트 정확도를 함께 재 보자. (데이터 600건, 잡음 10% 포함)
트리 깊이 훈련 정확도 테스트 정확도 격차 1 0.726 0.717 0.010 ← 과소적합 2 0.771 0.728 0.044 4 0.921 0.844 0.077 8 0.990 0.828 0.163 ← 과적합 16 1.000 0.867 0.133 제한 없음 1.000 0.867 0.133 세 가지가 보인다.
- 훈련 정확도는 끝까지 오른다(0.726 → 1.000). 깊이를 늘리면 언제든 훈련 데이터를 외울 수 있다.
- 테스트 정확도는 0.87 언저리에서 멈춘다. 아무리 깊게 파도 새 데이터 성능은 더 안 오른다.
- 격차는 0.010에서 0.163까지 벌어진다. 이 격차가 과적합의 크기다.
깊이 1은 훈련조차 0.726이라 과소적합이고, 깊이 8 이상은 훈련만 만점인 과적합이다. 실무에서 고를 지점은 테스트 성능이 가장 좋으면서 격차가 작은 구간이다.
상세 내용
섹션 제목: “상세 내용”훈련 정확도 100%는 항상 나쁜가?
섹션 제목: “훈련 정확도 100%는 항상 나쁜가?”아니다. 문제가 쉽거나 데이터가 깨끗하면 정상일 수 있다. MNIST 손글씨 분류처럼 패턴이 명확한 문제에서는 훈련·검증 정확도가 둘 다 99%를 넘는다.
판단 기준은 훈련 정확도의 절대값이 아니라 검증 점수와의 격차다. 훈련 100% / 검증 99%는 훌륭하고, 훈련 100% / 검증 70%는 심각한 과적합이다.
검증셋에도 과적합될 수 있다
섹션 제목: “검증셋에도 과적합될 수 있다”검증셋을 보며 하이퍼파라미터를 100번 조정하면, 사실상 검증셋에 맞춰 튜닝한 것이 된다. 이것이 테스트셋을 따로 봉인해 두는 이유다.
언제 사용하는가
섹션 제목: “언제 사용하는가”이 장의 진단법은 모든 지도 학습에 예외 없이 적용된다. 모델을 학습시켰다면 반드시 훈련·검증 점수를 함께 봐야 한다.
특히 다음 상황에서는 과적합을 먼저 의심한다.
- 검증 성능이 의심스러울 만큼 좋을 때 (이 경우 데이터 누수일 수도 있다)
- 배포 후 성능이 개발 때와 크게 다를 때
- 학습을 오래 돌릴수록 검증 손실이 다시 올라갈 때
실전 사례
섹션 제목: “실전 사례”훈련 정확도 100%로 보고했다가 배포 후 무너진 팀
섹션 제목: “훈련 정확도 100%로 보고했다가 배포 후 무너진 팀”한 팀이 고객 이탈 예측 모델을 만들어 경영진에게 보고했다. 슬라이드에는 “정확도 99.7%“가 적혀 있었고, 프로젝트는 승인되었다.
배포 후 첫 달 실제 정확도는 68%였다.
원인을 파헤쳐 보니 두 가지가 겹쳐 있었다.
- 보고한 99.7%가 훈련 정확도였다. 검증 점수는 애초에 재지 않았다.
- 데이터가 2,000건뿐인데 특성이 180개였다. 샘플보다 특성 조합이 훨씬 많아 모델이 개별 고객을 사실상 외울 수 있었다.
수습 과정에서 특성을 180개에서 22개로 줄이고 정규화를 적용하자, 훈련 정확도는 84%로 떨어졌지만 실제 운영 정확도는 81%로 올랐다.
교훈: 훈련 정확도는 보고할 숫자가 아니다. 그리고 훈련 정확도가 떨어졌는데 실제 성능이 오르는 일은 과적합을 고칠 때 정상적으로 벌어지는 일이다.
직접 해보기
섹션 제목: “직접 해보기”import numpy as npfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.datasets import make_classificationfrom sklearn.model_selection import train_test_split
X, y = make_classification(n_samples=600, n_features=20, n_informative=4, flip_y=0.1, random_state=0) # flip_y: 10% 잡음X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0)
print(f"{'트리 깊이':>8} {'훈련 정확도':>12} {'테스트 정확도':>14} {'격차':>8}")for d in (1, 2, 4, 8, 16, None): m = DecisionTreeClassifier(max_depth=d, random_state=0).fit(X_tr, y_tr) tr, te = m.score(X_tr, y_tr), m.score(X_te, y_te) print(f"{str(d):>8} {tr:>12.3f} {te:>14.3f} {tr-te:>8.3f}")
# 실행 결과:# 트리 깊이 훈련 정확도 테스트 정확도 격차# 1 0.726 0.717 0.010 <- 과소적합 (둘 다 낮음)# 2 0.771 0.728 0.044# 4 0.921 0.844 0.077# 8 0.990 0.828 0.163 <- 격차 최대# 16 1.000 0.867 0.133# None 1.000 0.867 0.133 <- 훈련 만점, 테스트 정체훈련 정확도는 0.726에서 1.000까지 끝까지 오르지만, 테스트 정확도는 0.87 언저리에서 멈춘다. 깊이를 아무리 늘려도 새 데이터 성능은 더 좋아지지 않는다 — 늘어난 것은 외우는 능력뿐이다.
flip_y=0.1로 일부러 넣은 10% 잡음이 이 현상의 원인이다. 깊은 트리는 이 잡음까지 규칙으로 학습하고, 그 규칙은 새 데이터에 존재하지 않는다.
숫자 하나만 본다면 격차 열을 보라. 0.010 → 0.163으로 벌어지는 것이 과적합이 진행되는 모습이다.
흔한 오해와 함정
섹션 제목: “흔한 오해와 함정”-
“훈련 정확도가 높으면 좋은 모델이다” — 훈련 정확도는 보고할 숫자가 아니다. 검증·테스트 점수와 함께 봐야 의미가 있다.
-
“과적합이면 무조건 데이터를 더 모아야 한다” — 가장 확실하지만 가장 비싸다. 모델 단순화·조기 종료·정규화를 먼저 시도하는 것이 실무적이다.
-
“데이터를 더 모으면 과소적합도 해결된다” — 아니다. 과소적합은 모델이 표현력이 부족한 것이므로, 데이터를 늘려도 거의 나아지지 않는다. 더 복잡한 모델이 필요하다.
-
“검증 점수로 튜닝했으니 그 점수가 최종 성능이다” — 검증셋에도 간접적으로 과적합된다. 최종 보고는 손대지 않은 테스트셋으로 해야 한다.
-
“딥러닝은 파라미터가 많으니 항상 과적합이다” — 실제로는 대규모 모델에서 오히려 성능이 다시 좋아지는 이중 하강이 관찰된다. 고전 이론이 전부를 설명하지는 못한다.
스스로 점검하기
섹션 제목: “스스로 점검하기”1. 훈련 정확도 0.72, 검증 정확도 0.71이다. 과적합인가 과소적합인가?
정답 보기
과소적합이다. 격차는 0.01로 거의 없지만 둘 다 낮다. 모델이 훈련 데이터조차 제대로 못 맞히고 있으므로 더 복잡한 모델이나 더 좋은 특성이 필요하다. 이 상황에서 데이터를 더 모아도 거의 도움이 되지 않는다.
2. 과적합을 고쳤더니 훈련 정확도가 0.99에서 0.84로 떨어졌다. 잘못한 것인가?
정답 보기
정상이다. 과적합을 줄이면 훈련 정확도는 대개 떨어진다. 중요한 것은 검증·테스트 점수가 올랐는가다. 올랐다면 올바른 방향이며, 훈련 정확도 하락은 “외우기를 그만뒀다”는 신호다.
3. 과적합을 의심할 때 가장 먼저 확인할 두 숫자는?
정답 보기
훈련 점수와 검증 점수, 그리고 그 격차다. 정확도의 절대값이 아니라 격차가 진단의 핵심이다. 훈련 100%/검증 99%는 훌륭하고, 훈련 100%/검증 70%는 심각한 과적합이다.
다른 주제와의 연결
섹션 제목: “다른 주제와의 연결”- 훈련·검증·테스트: 격차를 재려면 먼저 데이터를 나눠야 한다
- 과적합과 과소적합: 학습 곡선과 진단법 심화
- 편향-분산 트레이드오프: 과적합을 수학적으로 분해하기
- 정규화 이론: L1/L2·드롭아웃·조기 종료
- 데이터 누수: 검증 점수가 지나치게 좋을 때 의심할 다른 원인