Skip to content
PART 3 · 18장

정규화와 과적합

왜 완벽한 학습이 나쁜가?

시험 답안지를 통째로 암기한다면?

중간고사 대비로 기출문제 답안을 한 글자도 빠짐없이 외웠다고 합시다. 그 시험지가 다시 나온다면? 100점입니다. 하지만 새로운 문제가 출제된다면? 거의 확실히 망합니다.

머신러닝에서도 같은 일이 벌어집니다. 모델이 훈련 데이터를 "암기"하면 훈련 성적은 완벽하지만, 처음 보는 데이터 앞에서는 엉망이 됩니다. 이것을 과적합(overfitting)이라 부릅니다.

쉽게 말하면: 과적합은 시험 공부의 함정과 정확히 같습니다.
- 암기형 학생(과적합): 작년 기출 답안을 토씨 하나 안 틀리고 외움. 같은 시험이 나오면 100점이지만, 문제가 조금만 바뀌면 0점.
- 이해형 학생(적절한 적합): 원리를 이해하고 응용력을 기름. 어떤 시험이 나와도 80점 이상.
- 대충형 학생(과소적합): 교과서를 펼치지도 않음. 어떤 시험이든 40점.

우리가 원하는 모델은 "이해형 학생"입니다. 정규화는 모델에게 "무조건 외우지 말고 핵심만 이해하라"고 강제하는 도구입니다.

이 장에서는 과적합이 왜 발생하는지, 어떻게 감지하는지, 그리고 정규화(regularization)라는 "적당히 단순하게 만드는 벌칙"으로 어떻게 해결하는지를 직접 체험합니다.

과적합 = 암기, 일반화 = 이해

모델의 목표는 일반화(generalization)입니다. 훈련 데이터에서 패턴을 배워, 아직 보지 못한 새 데이터에서도 좋은 예측을 하는 것이죠.

과소적합 (Underfitting)

너무 단순한 모델. 교과서를 대충 훑고 시험 치는 학생.

훈련 성적 나쁨 / 시험 성적 나쁨

적절한 적합 (Good Fit)

핵심 원리를 이해한 모델. 개념을 이해하고 시험 치는 학생.

훈련 성적 좋음 / 시험 성적 좋음

과적합 (Overfitting)

너무 복잡한 모델. 답안지를 통째로 외운 학생.

훈련 성적 완벽 / 시험 성적 나쁨

비유로 이해하기: 친구의 취향을 배운다고 합시다. "이 친구는 매운 음식을 좋아한다"는 일반화입니다. "이 친구는 화요일 12시 32분에 신촌역 2번 출구 옆 가게에서 불닭볶음면을 먹었다"는 암기입니다. 전자는 새로운 상황에서도 유용하지만, 후자는 완벽히 일치하는 상황이 아니면 쓸모가 없습니다.
총 오차 = 편향(Bias)2 + 분산(Variance) + 줄일 수 없는 오차
과소적합: 높은 편향, 낮은 분산 | 과적합: 낮은 편향, 높은 분산
쉽게 말하면 -- 편향-분산 트레이드오프: 양궁 과녁으로 비유해봅시다.
높은 편향 + 낮은 분산: 화살이 항상 비슷한 곳에 모이지만, 과녁 중심에서 벗어남. 일관되게 빗나감 (너무 단순한 모델).
낮은 편향 + 높은 분산: 화살의 평균 위치는 과녁 중심에 가깝지만, 사방으로 흩어짐. 때로는 맞고 때로는 크게 빗나감 (너무 복잡한 모델).
적절한 균형: 화살이 과녁 중심 근처에 모여 있음. 편향도 낮고 분산도 낮은 "딱 좋은" 복잡도 (최적의 모델).

정규화는 분산을 줄이는 대신 편향을 약간 허용하여, 전체 오차(편향^2 + 분산)를 최소화하는 전략입니다.

실습 1: 다항식 차수와 과적합

산점도에 곡선을 맞춰봅시다. 차수가 1이면 직선, 차수가 올라갈수록 곡선이 점점 구불구불해집니다. 훈련 오차는 계속 줄어들지만, 테스트 오차는 어떻게 될까요?

목표: 슬라이더를 움직여 차수를 바꿔보세요. 훈련 오차(파란선)와 테스트 오차(빨간선)가 갈라지는 지점을 찾으세요. 그 지점이 바로 "적당한 복잡도"입니다.
차수: 1

데이터 + 적합 곡선

오차 곡선 (U자형)

훈련 MSE
-
테스트 MSE
-
현재 차수
-
최적 차수
-
핵심 관찰: 차수를 올리면 훈련 오차는 0에 가까워지지만, 테스트 오차는 특정 지점 이후 급격히 증가합니다. 이 U자형 곡선이 과적합의 전형적인 신호입니다. 최적의 복잡도는 테스트 오차가 가장 낮은 지점입니다.

실습 2: 편향-분산 트레이드오프

같은 데이터에 모델 복잡도를 바꿔 적합해봅시다. 너무 단순하면 데이터의 패턴을 못 잡고(높은 편향), 너무 복잡하면 노이즈까지 학습합니다(높은 분산).

목표: 세 가지 모델을 비교하세요. 과소적합, 적절한 적합, 과적합이 눈에 보이는 차이를 만듭니다. 복잡도 슬라이더를 조절해 "딱 좋은" 지점을 찾아보세요.
복잡도: 3
편향(Bias)
-
모델이 놓치는 패턴
분산(Variance)
-
데이터 바뀌면 얼마나 흔들리나
총 오차
-
편향^2 + 분산
분산이 높다는 것은 데이터를 조금만 바꿔도 모델이 완전히 달라진다는 뜻입니다. "데이터 재생성" 버튼을 연속으로 눌러보세요. 과적합 모델은 데이터가 바뀔 때마다 곡선 모양이 크게 달라집니다. 반면 적절한 모델은 대체로 비슷한 형태를 유지합니다.

정규화: "너무 복잡하면 벌점을 준다"

과적합을 막는 가장 대표적인 방법이 정규화(Regularization)입니다. 아이디어는 단순합니다. 모델이 데이터를 잘 맞추는 것도 중요하지만, 동시에 모델의 복잡도에 벌점(penalty)을 부여해서 불필요하게 복잡해지지 않도록 제한하는 것입니다.

비유: 에세이를 쓸 때 "A4 한 장 이내로 핵심만 쓰시오"라는 제한을 두면, 불필요한 수식어를 빼고 정말 중요한 내용만 남기게 됩니다. 정규화는 모델에 이런 "지면 제한"을 거는 것과 같습니다.
일반 회귀: Loss = 데이터 오차(MSE)
정규화 회귀: 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(정규화 강도)를 올리면서 각 변수의 계수가 어떻게 변하는지 관찰하세요.

목표: lambda 슬라이더를 올려보세요. Ridge는 모든 계수가 서서히 줄어들고, Lasso는 일부 계수가 먼저 0이 됩니다. "쓸모없는 변수"의 계수가 Lasso에서 먼저 사라지는 것을 확인하세요.
lambda: 0.10

Ridge (L2) 계수

Lasso (L1) 계수

Ridge 0이 아닌 계수
-
Lasso 0이 아닌 계수
-
Ridge MSE
-
Lasso MSE
-
언제 Ridge, 언제 Lasso? 변수가 많고 어떤 것이 중요한지 모를 때는 Lasso가 유리합니다 -- 자동으로 변수를 골라줍니다. 모든 변수가 골고루 기여한다고 생각되면 Ridge가 더 안정적입니다. 실무에서는 둘을 섞은 Elastic Net도 자주 사용합니다.

실습 4: 교차 검증(Cross-Validation)

"테스트 오차"를 측정하려면 테스트 데이터가 필요합니다. 하지만 데이터가 부족한 상황에서는 어떻게 할까요? K-fold 교차 검증은 데이터를 K개 조각으로 나눠 돌아가며 테스트하는 방법입니다.

쉽게 말하면 -- 돌아가며 시험보기: 5명이 돌아가며 발표 연습을 합니다. 한 명이 발표하면 나머지 4명이 평가합니다. 5번 반복하면 모든 사람이 한 번씩 평가를 받습니다. K-fold CV도 데이터 조각이 돌아가며 "시험 역할"을 합니다.

더 구체적으로: 데이터를 5조각으로 나누면 --
1회차: 1번 조각이 시험지, 나머지 2~5번으로 공부
2회차: 2번 조각이 시험지, 나머지 1,3,4,5번으로 공부
... 이렇게 5번 반복하면, 모든 데이터가 정확히 한 번씩 시험지가 됩니다. 이 5번의 시험 점수를 평균 내면, 모델의 "진짜 실력"을 공정하게 측정할 수 있습니다. 데이터를 한 번도 낭비하지 않으면서도, 편향 없는 성능 추정이 가능한 것이 교차 검증의 핵심입니다.
목표: K값(3, 5, 10)을 바꿔보면서 각 fold의 테스트 오차가 어떻게 다른지, 평균 오차는 어떻게 달라지는지 관찰하세요.
평균 CV 오차
-
CV 오차 표준편차
-
K
-
Fold당 테스트 크기
-
K값의 선택: K가 작으면(예: 3) 각 fold의 테스트 크기가 크고 빠르지만 추정이 부정확할 수 있습니다. K가 크면(예: 10) 더 정확한 추정이 가능하지만 계산량이 늘어납니다. 실무에서는 K=5 또는 K=10을 가장 많이 사용합니다.

정규화의 실전 가이드

상황 추천 방법 이유
변수 > 관측치Lasso / Elastic Net자동 변수 선택이 필수
다중공선성 심함Ridge상관된 변수의 계수를 안정화
해석이 중요함Lasso불필요한 변수를 0으로 제거
모든 변수가 중요Ridge모든 변수를 유지하되 크기 조절
어떤 것이 좋을지 모름교차 검증으로 비교데이터가 말해주게 하자
정규화 전에 반드시 할 것: 정규화는 계수의 크기에 벌점을 줍니다. 변수의 단위가 다르면(예: 연봉 수천만 vs 나이 수십) 단위가 큰 변수만 불이익을 받습니다. 따라서 정규화 전에 반드시 표준화(standardization)를 해야 합니다.
이 장의 핵심
  • 과적합은 모델이 훈련 데이터를 "암기"하는 현상이다. 일반화가 목표이다.
  • 편향-분산 트레이드오프: 모델이 단순할수록 편향은 높고 분산은 낮다. 그 반대도 성립한다.
  • 정규화는 손실 함수에 계수 크기의 벌점을 추가하여 모델을 단순하게 유지한다.
  • Ridge(L2)는 계수를 골고루 줄이고, Lasso(L1)는 일부 계수를 정확히 0으로 만든다.
  • 교차 검증(K-fold CV)은 데이터를 효율적으로 활용하여 모델의 일반화 성능을 추정한다.

다음 장 예고: 시간에 따라 변하는 데이터는 어떻게 분석할까? 다음 장에서는 시계열 데이터의 추세, 계절성, 잔차를 분해하는 법을 배웁니다.