과적합
Overfitting
개념
가르칠 때 쓴 데이터에만 지나치게 맞춰져 처음 보는 데이터에서는 예측이 어긋나는 상태를 말합니다.
등장 배경
모델을 만들고 채점하던 초기 관행은 가르칠 때 쓴 데이터로 그대로 시험을 보는 것이었습니다. 페이지덱이 스팸 계정을 자동으로 걸러 내려고 만든 첫 모델도 그렇게 채점해 98퍼센트를 받았습니다. 배포한 다음 주에 스팸 신고는 오히려 늘었습니다.
같은 자리에서 대화는 늘 어긋났습니다. 태오가 98퍼센트라는 숫자를 들고 오면 지현이 "그럼 신고가 왜 늘었나요" 하고 묻고, 태오는 숫자를 다시 확인해도 98퍼센트가 나오니 어디가 틀렸는지 말할 수 없었습니다. 점수는 맞았습니다. 다만 그 점수가 답한 질문이 "새 계정을 맞힐 수 있는가" 가 아니라 "이미 본 계정을 기억하는가" 였습니다.
그래서 데이터를 처음부터 갈라 놓는 방식이 자리를 잡았습니다. 가르치는 데 쓰는 학습 데이터와 채점에만 쓰는 데이터를 나누고, 채점용은 학습 과정에서 한 번도 보여 주지 않습니다. 두 점수를 나란히 놓고 보면 문제가 눈에 보입니다. 학습에서 98점, 채점용에서 71점. 이 27점 차이에 붙은 이름이 과적합입니다.
작동 방식
모델은 학습 데이터에서 틀린 개수를 줄이는 방향으로만 조정됩니다. 그 데이터에 우연히 섞여 있던 특징까지 규칙으로 받아들이는 까닭이 여기 있습니다. 스팸으로 표시된 계정 400개 중 340개가 하필 같은 무료 메일 도메인이었다면, 모델은 그 도메인이면 스팸이라는 규칙을 만들어 학습 점수를 몇 점 올립니다. 규칙이 틀렸다는 신호는 학습 데이터 안에 없습니다.
시험 범위를 이해하는 대신 기출문제의 답 번호만 외운 것과 같습니다. 본 문제는 전부 맞히고 새 문제는 틀립니다.
이 상태로 기우는 조건은 셋입니다.
- 데이터가 적습니다. 계정 500개로 가르치면 그 500개에만 있는 우연이 전체의 규칙처럼 보입니다. 같은 모델에 5만 개를 넣으면 우연은 서로 상쇄됩니다.
- 피처가 많습니다. 피처는 기록에서 뽑아낸 개별 입력 값으로, 계정이라면 가입 후 경과일이나 하루 평균 문서 수 같은 숫자입니다. 이 숫자를 40개 넣고 계정은 500개뿐이면 모델이 500개를 하나씩 외울 여지가 생깁니다.
- 모델이 지나치게 유연합니다. 구부러질 수 있는 여지가 큰 모델은 점이 몇 개든 그 사이를 다 지나는 선을 그려 냅니다.
고치는 순서는 대개 데이터부터입니다. 더 모을 수 있으면 모으고, 못 모으면 피처를 줄이고, 그래도 남으면 모델을 단순한 쪽으로 바꿉니다. 판정은 두 점수의 차이로 합니다. 학습 98점에 채점용 71점이면 과적합이고, 둘 다 68점이면 반대쪽 문제, 즉 모델이 너무 단순해 규칙 자체를 못 찾은 상태입니다.
쓰이는 곳
모델 점수를 보고받는 자리에서 가장 먼저 나오는 질문이 이것입니다. 지도 학습으로 만든 모델, 곧 정답이 붙은 데이터로 가르친 모델이면 예외 없이 물어봅니다. 점수가 높을수록 더 묻습니다. 학습 데이터에서 99퍼센트가 나왔다는 보고는 잘 만들었다는 신호보다 채점 방식을 확인하라는 신호에 가깝습니다.
정밀도와 재현율처럼 점수를 둘로 쪼개 보는 자리에서도 같은 질문이 따라옵니다. 두 값을 어느 데이터에서 쟀는지가 먼저이고, 학습에 쓴 데이터에서 잰 값이면 두 숫자 다 의미가 없습니다.
머신러닝 밖에서도 같은 말을 씁니다. 지난 분기 데이터를 들여다보며 만든 규칙에 대해 "이건 지난 분기에 과적합된 것 같다" 고 말하는 식입니다. 이탈 위험 계정을 고르는 규칙을 만들 때 지난 분기 이탈 팀 30곳의 공통점을 다 모으면 조건이 열 개쯤 붙는데, 그 조건 묶음이 이번 분기 이탈 팀에도 걸리는지는 별개입니다. 데이터를 여러 방향으로 잘라 보다가 유의해 보이는 조합을 찾아낸 분석도 마찬가지입니다.
실무 용례
"학습에서 98점인데 검증에서 71점이에요. 과적합부터 보죠."
두 점수 차이가 크다는 말로, 모델이 새 데이터에서는 쓸 수 없는 상태라는 판정입니다.
"피처를 40개 넣었는데 계정이 500개뿐이잖아요. 과적합이 안 나는 게 이상하죠."
데이터 양에 비해 입력 값이 너무 많아 원인이 구조에 있다는 지적입니다.
"이 규칙은 지난 분기에 과적합된 것 같아요. 이번 분기 데이터로도 걸리는지 먼저 봅시다."
머신러닝 모델이 아닌 수작업 규칙에도 같은 문제가 있다는 말로, 다른 기간에서 확인하자는 제안입니다.
페이지덱의 스팸 판정 모델 검토 자리가 전형적인 장면입니다. 태오가 이번 버전의 점수를 올리면 지현이 먼저 묻는 것은 점수가 아니라 어느 데이터에서 잰 값인지입니다. 학습과 검증 점수를 나란히 놓고 차이가 10점 안쪽이면 다음 항목으로 넘어가고, 20점을 넘으면 그 자리에서 피처 목록을 열어 봅니다. 지난번에는 계정 생성 시각이라는 피처가 문제였습니다. 스팸 계정을 모아 표시한 작업이 특정 주에 몰려 있어서, 모델이 그 주에 만들어진 계정을 스팸으로 읽고 있었습니다.
흔한 오해
점수가 높으면 좋은 모델이라고 읽는 오해가 가장 흔합니다. 점수는 잘 만들었는지를 재려고 붙인 숫자이니 높을수록 좋다고 보는 것이 자연스럽습니다. 그런데 어느 데이터에서 쟀는지를 빼고는 점수를 읽을 수 없습니다. 학습 데이터에서 잰 100점은 아무 뜻이 없고, 오히려 외우기만 했다는 신호일 수 있습니다. 이 구분을 빼고 점수만 보고받으면 배포 뒤에 성능이 뚝 떨어지는 모델을 매번 통과시키게 됩니다.
모델을 단순하게 만들면 해결된다는 생각도 자주 봅니다. 과적합의 원인 중 하나가 지나친 유연함이니 반대로 가면 될 것 같지만, 너무 단순한 모델은 규칙 자체를 못 찾습니다. 스팸 판정에 피처를 하나만 남기면 학습과 검증 점수가 나란히 62점으로 내려앉습니다. 차이는 사라졌는데 쓸 수는 없습니다. 단순화를 답으로 붙들면 두 점수가 같아지는 것을 개선으로 착각하고, 실제로는 쓰지 못할 모델을 들고 배포 회의에 들어가게 됩니다.
자주 헷갈리는 용어
| 용어 | 언제 드러나는가 | 과적합과의 차이 |
|---|---|---|
| 모델 드리프트 | 배포 뒤 몇 달에 걸쳐 성능이 서서히 내려갈 때 | 과적합은 만드는 시점에 이미 들어 있는 결함이고, 드리프트는 잘 맞던 모델의 바깥 환경이 바뀌어 생깁니다. 과적합은 채점 데이터를 나눠 잡고, 드리프트는 배포 후 감시로 잡습니다 |
같이 보면 좋은 페이지
마지막 업데이트 2026-09-16