정규화와 과적합
왜 완벽한 학습이 나쁜가?
시험 답안지를 통째로 암기한다면?
중간고사 대비로 기출문제 답안을 한 글자도 빠짐없이 외웠다고 합시다. 그 시험지가 다시 나온다면? 100점입니다. 하지만 새로운 문제가 출제된다면? 거의 확실히 망합니다.
머신러닝에서도 같은 일이 벌어집니다. 모델이 훈련 데이터를 "암기"하면 훈련 성적은 완벽하지만, 처음 보는 데이터 앞에서는 엉망이 됩니다. 이것을 과적합(overfitting)이라 부릅니다.
- 암기형 학생(과적합): 작년 기출 답안을 토씨 하나 안 틀리고 외움. 같은 시험이 나오면 100점이지만, 문제가 조금만 바뀌면 0점.
- 이해형 학생(적절한 적합): 원리를 이해하고 응용력을 기름. 어떤 시험이 나와도 80점 이상.
- 대충형 학생(과소적합): 교과서를 펼치지도 않음. 어떤 시험이든 40점.
우리가 원하는 모델은 "이해형 학생"입니다. 정규화는 모델에게 "무조건 외우지 말고 핵심만 이해하라"고 강제하는 도구입니다.
이 장에서는 과적합이 왜 발생하는지, 어떻게 감지하는지, 그리고 정규화(regularization)라는 "적당히 단순하게 만드는 벌칙"으로 어떻게 해결하는지를 직접 체험합니다.
과적합 = 암기, 일반화 = 이해
모델의 목표는 일반화(generalization)입니다. 훈련 데이터에서 패턴을 배워, 아직 보지 못한 새 데이터에서도 좋은 예측을 하는 것이죠.
과소적합 (Underfitting)
너무 단순한 모델. 교과서를 대충 훑고 시험 치는 학생.
훈련 성적 나쁨 / 시험 성적 나쁨
적절한 적합 (Good Fit)
핵심 원리를 이해한 모델. 개념을 이해하고 시험 치는 학생.
훈련 성적 좋음 / 시험 성적 좋음
과적합 (Overfitting)
너무 복잡한 모델. 답안지를 통째로 외운 학생.
훈련 성적 완벽 / 시험 성적 나쁨
과소적합: 높은 편향, 낮은 분산 | 과적합: 낮은 편향, 높은 분산
높은 편향 + 낮은 분산: 화살이 항상 비슷한 곳에 모이지만, 과녁 중심에서 벗어남. 일관되게 빗나감 (너무 단순한 모델).
낮은 편향 + 높은 분산: 화살의 평균 위치는 과녁 중심에 가깝지만, 사방으로 흩어짐. 때로는 맞고 때로는 크게 빗나감 (너무 복잡한 모델).
적절한 균형: 화살이 과녁 중심 근처에 모여 있음. 편향도 낮고 분산도 낮은 "딱 좋은" 복잡도 (최적의 모델).
정규화는 분산을 줄이는 대신 편향을 약간 허용하여, 전체 오차(편향^2 + 분산)를 최소화하는 전략입니다.
실습 1: 다항식 차수와 과적합
산점도에 곡선을 맞춰봅시다. 차수가 1이면 직선, 차수가 올라갈수록 곡선이 점점 구불구불해집니다. 훈련 오차는 계속 줄어들지만, 테스트 오차는 어떻게 될까요?
데이터 + 적합 곡선
오차 곡선 (U자형)
실습 2: 편향-분산 트레이드오프
같은 데이터에 모델 복잡도를 바꿔 적합해봅시다. 너무 단순하면 데이터의 패턴을 못 잡고(높은 편향), 너무 복잡하면 노이즈까지 학습합니다(높은 분산).
정규화: "너무 복잡하면 벌점을 준다"
과적합을 막는 가장 대표적인 방법이 정규화(Regularization)입니다. 아이디어는 단순합니다. 모델이 데이터를 잘 맞추는 것도 중요하지만, 동시에 모델의 복잡도에 벌점(penalty)을 부여해서 불필요하게 복잡해지지 않도록 제한하는 것입니다.
정규화 회귀: Loss = 데이터 오차(MSE) + lambda x 계수의 크기(벌점)
lambda = 0 이면 벌점 없음 (일반 회귀와 동일)
lambda 가 크면 계수를 강하게 억제 (단순한 모델)
Ridge (L2 정규화)
벌점 = lambda x (계수2의 합)
계수를 골고루 줄이되 0으로 만들지는 않음. 모든 변수를 조금씩 사용.
비유: 오케스트라에서 모든 악기의 볼륨을 함께 낮추는 것. 아무 악기도 완전히 끄지는 않지만, 전체적으로 조용해진다.
Lasso (L1 정규화)
벌점 = lambda x (|계수|의 합)
일부 계수를 정확히 0으로 만듦. 자동으로 변수 선택 효과.
비유: 오케스트라에서 필요 없는 악기는 아예 퇴장시키고, 핵심 악기만 남기는 것. 불필요한 변수를 0으로 만들어 제거한다.
실습 3: Ridge vs Lasso -- 계수 변화 비교
같은 데이터에 Ridge와 Lasso를 적용합니다. lambda(정규화 강도)를 올리면서 각 변수의 계수가 어떻게 변하는지 관찰하세요.
Ridge (L2) 계수
Lasso (L1) 계수
실습 4: 교차 검증(Cross-Validation)
"테스트 오차"를 측정하려면 테스트 데이터가 필요합니다. 하지만 데이터가 부족한 상황에서는 어떻게 할까요? K-fold 교차 검증은 데이터를 K개 조각으로 나눠 돌아가며 테스트하는 방법입니다.
더 구체적으로: 데이터를 5조각으로 나누면 --
1회차: 1번 조각이 시험지, 나머지 2~5번으로 공부
2회차: 2번 조각이 시험지, 나머지 1,3,4,5번으로 공부
... 이렇게 5번 반복하면, 모든 데이터가 정확히 한 번씩 시험지가 됩니다. 이 5번의 시험 점수를 평균 내면, 모델의 "진짜 실력"을 공정하게 측정할 수 있습니다. 데이터를 한 번도 낭비하지 않으면서도, 편향 없는 성능 추정이 가능한 것이 교차 검증의 핵심입니다.
정규화의 실전 가이드
| 상황 | 추천 방법 | 이유 |
|---|---|---|
| 변수 > 관측치 | Lasso / Elastic Net | 자동 변수 선택이 필수 |
| 다중공선성 심함 | Ridge | 상관된 변수의 계수를 안정화 |
| 해석이 중요함 | Lasso | 불필요한 변수를 0으로 제거 |
| 모든 변수가 중요 | Ridge | 모든 변수를 유지하되 크기 조절 |
| 어떤 것이 좋을지 모름 | 교차 검증으로 비교 | 데이터가 말해주게 하자 |
- 과적합은 모델이 훈련 데이터를 "암기"하는 현상이다. 일반화가 목표이다.
- 편향-분산 트레이드오프: 모델이 단순할수록 편향은 높고 분산은 낮다. 그 반대도 성립한다.
- 정규화는 손실 함수에 계수 크기의 벌점을 추가하여 모델을 단순하게 유지한다.
- Ridge(L2)는 계수를 골고루 줄이고, Lasso(L1)는 일부 계수를 정확히 0으로 만든다.
- 교차 검증(K-fold CV)은 데이터를 효율적으로 활용하여 모델의 일반화 성능을 추정한다.
다음 장 예고: 시간에 따라 변하는 데이터는 어떻게 분석할까? 다음 장에서는 시계열 데이터의 추세, 계절성, 잔차를 분해하는 법을 배웁니다.