모델을 만들다 보면 이상한 순간이 찾아옵니다. 학습 데이터에서는 거의 완벽한데, 검증 데이터나 테스트 데이터로 가면 갑자기 성능이 무너지는 순간입니다. 처음에는 억울하게 느껴집니다. 분명 열심히 학습했고, 숫자도 좋았으니까요. 하지만 바로 그 지점에서 머신러닝의 핵심이 드러납니다. 모델의 목적은 과거 데이터를 외우는 것이 아니라, 처음 보는 데이터에서도 그럴듯하게 판단하는 것입니다.
이 장에서 다룰 주제는 바로 그 차이입니다. 학습 데이터에 지나치게 맞춰진 모델을 우리는 과적합되었다고 말합니다. 반대로 새로운 데이터에서도 비교적 안정적으로 잘 작동하는 능력을 일반화라고 부릅니다. 결국 좋은 모델은 훈련셋 점수가 높은 모델이 아니라, 낯선 상황에서도 덜 흔들리는 모델입니다.

과적합은 시험 범위만 외운 모델이다
과적합을 가장 쉽게 이해하는 방법은 학생 비유입니다. 어떤 학생은 기출문제를 거의 통째로 외웁니다. 그래서 연습 시험에서는 아주 높은 점수를 받습니다. 그런데 문제가 조금만 바뀌면 갑자기 실력이 무너집니다. 개념을 이해한 것이 아니라, 본 문제를 기억했기 때문입니다.
머신러닝 모델도 비슷합니다. 데이터 안에는 진짜 패턴만 있는 것이 아닙니다. 우연한 잡음, 측정 오류, 일시적 유행, 특정 기간에만 나타난 특수한 상황도 섞여 있습니다. 모델이 이런 것들까지 "법칙"이라고 믿어 버리면 학습 성능은 올라갈 수 있습니다. 하지만 현실 데이터는 늘 조금씩 다르기 때문에, 그 믿음은 금방 깨집니다.
여기서 중요한 감각은 이것입니다. 과적합은 모델이 너무 열심히 공부해서 생기는 실패라는 점입니다. 공부를 안 해서 망한 것이 아니라, 연습장에 너무 집착해서 망한 것입니다.
과적합의 전형적인 징후
과적합은 대개 조용히 시작됩니다. 처음에는 학습 성능도 오르고 검증 성능도 함께 좋아집니다. 문제는 어느 시점부터입니다. 학습 점수는 계속 더 좋아지는데, 검증 점수는 제자리이거나 오히려 나빠지기 시작합니다. 이때 모델은 새 패턴을 배우는 것이 아니라, 학습 데이터의 구체적인 흔적을 외우고 있을 가능성이 큽니다.
실무에서 자주 보이는 신호는 몇 가지가 있습니다.
학습 점수는 매우 높은데 검증 점수와 테스트 점수는 눈에 띄게 낮다.
실험할 때마다 점수가 크게 흔들려, 어떤 분할에서는 좋고 어떤 분할에서는 갑자기 나빠진다.
예측 확률은 매우 자신만만한데 실제 정답과는 자주 어긋난다.
특성을 조금만 바꾸거나 데이터를 조금만 바꿔도 결과가 크게 달라진다.
이 중 마지막 두 가지는 특히 중요합니다. 초보자는 평균 점수만 보고 넘어가기 쉽지만, 실제 서비스에서는 흔들리는 모델이 가장 위험합니다. 어떤 날은 잘 맞고 어떤 날은 갑자기 무너지는 모델은 운영하기 어렵습니다. 모델은 똑똑해야 하지만, 동시에 성격도 안정적이어야 합니다.
과소적합과 과적합 사이에 좋은 구간이 있다
모델의 실패는 과적합만 있는 것이 아닙니다. 반대편에는 과소적합이 있습니다. 과소적합은 모델이 너무 단순해서 데이터 속 기본 패턴조차 충분히 잡아내지 못하는 상태입니다. 학습 데이터에서도 성능이 낮고, 검증 데이터에서도 당연히 좋지 않습니다.
예를 들어 관계가 매우 복잡한 문제를 지나치게 단순한 직선 하나로만 설명하려 하면 과소적합이 생길 수 있습니다. 반대로 데이터 하나하나에 맞게 복잡한 경계를 끝없이 만들어 버리면 과적합이 생깁니다.
좋은 모델은 이 둘 사이 어딘가에 있습니다. 너무 둔하지도 않고, 너무 예민하지도 않은 상태입니다. 현실에서는 이 균형이 중요합니다. 세상의 패턴을 어느 정도는 잡아야 하지만, 세상의 모든 우연에 반응해서는 안 됩니다.
쉽게 말해 모델은 다음 두 가지를 동시에 해야 합니다.
첫째, 중요한 신호에는 민감해야 합니다. 둘째, 우연한 잡음에는 둔감해야 합니다. 일반화란 결국 이 두 감각의 균형입니다.
모델 복잡도는 일반화에 어떤 영향을 줄까
과적합을 이야기할 때 가장 먼저 떠오르는 요소가 모델 복잡도입니다. 보통 더 복잡한 모델은 더 많은 패턴을 표현할 수 있습니다. 이 능력 자체는 나쁜 것이 아닙니다. 오히려 어려운 문제에서는 복잡한 모델이 꼭 필요합니다.
문제는 표현 능력이 커질수록, 진짜 패턴뿐 아니라 잡음까지 설명할 힘도 함께 커진다는 점입니다. 결정 트리를 너무 깊게 키우면 잎사귀마다 소수의 샘플만 남아 버릴 수 있고, 아주 유연한 모델은 학습 데이터의 사소한 굴곡까지 따라가 버릴 수 있습니다.
여기서 자주 생기는 오해가 하나 있습니다. "복잡한 모델은 무조건 더 좋다"는 생각입니다. 하지만 실제로는 그렇지 않습니다. 복잡한 모델은 잠재력이 큰 대신, 잘못 다루면 쉽게 과민해집니다. 작은 변화에도 출렁이고, 학습 데이터의 우연한 패턴을 진실처럼 받아들이기 쉽습니다.
그래서 실무에서는 강한 모델을 쓰더라도 늘 같은 질문을 붙여야 합니다.
이 모델은 정말 구조를 배운 것인가, 아니면 흔적을 외운 것인가?
데이터 크기는 모델을 차분하게 만든다
같은 모델이라도 데이터가 충분할 때와 부족할 때의 성격은 크게 다릅니다. 데이터가 적으면 모델은 제한된 예시 몇 개를 보고 세상을 이해해야 합니다. 이때는 우연한 패턴이 진짜 법칙처럼 보이기 쉽습니다.
예를 들어 고객 이탈 예측 데이터가 겨우 몇백 건뿐이라면, 특정 연령대나 특정 지역의 우연한 편차가 모델에 크게 새겨질 수 있습니다. 하지만 데이터가 수만 건으로 늘어나면 그런 우연은 평균 속으로 조금씩 녹아 사라집니다. 모델은 더 자주 반복되는 패턴과 덜 반복되는 잡음을 구분하기 쉬워집니다.
물론 데이터가 많다고 자동으로 문제가 해결되지는 않습니다. 대표성이 없는 데이터, 편향된 데이터, 레이블 품질이 낮은 데이터는 양이 많아도 여전히 위험합니다. 그래도 일반적으로는 좋은 데이터가 충분히 많을수록 과적합을 견디는 힘이 커집니다. 모델이 덜 조급해지는 것입니다.
잡음이 많을수록 일반화는 더 어려워진다
일반화 성능은 모델만의 문제가 아니라 데이터 품질의 문제이기도 합니다. 입력에 오류가 많거나, 레이블이 들쭉날쭉하거나, 같은 조건에서도 결과가 크게 흔들리는 문제라면 모델은 본질적으로 어려운 세계를 배우게 됩니다.
예를 들어 상품 리뷰 감성 분석에서 사람이 붙인 레이블이 서로 자주 엇갈린다면 어떨까요. 어떤 리뷰는 한 annotator에게는 긍정이고 다른 사람에게는 중립일 수 있습니다. 이런 데이터에서는 모델이 완벽하게 배우기 어렵습니다. 데이터 자체가 애매하기 때문입니다.
잡음이 많을수록 복잡한 모델은 더 큰 유혹에 빠집니다. 애매한 샘플 하나하나를 억지로 설명하려 들기 때문입니다. 그래서 데이터가 거칠고 불안정할수록, 모델을 더 복잡하게 만드는 것이 오히려 성능을 해칠 수 있습니다.
결국 일반화는 세 요소의 상호작용으로 결정됩니다. 모델이 얼마나 복잡한지, 데이터가 얼마나 충분한지, 데이터 안에 잡음이 얼마나 많은지가 함께 작동합니다. 어느 하나만 보고 판단하면 자주 틀립니다.
학습 곡선은 모델의 상태를 말없이 알려준다
과적합을 감으로만 판단하면 자주 헷갈립니다. 이럴 때 도움이 되는 것이 학습 곡선입니다. 학습이 진행될수록 학습 성능과 검증 성능이 어떻게 변하는지를 보는 방식입니다.
만약 학습 성능은 계속 올라가는데 검증 성능이 어느 순간부터 멈추거나 떨어진다면, 모델은 그 시점부터 세부 흔적을 외우기 시작했을 가능성이 큽니다. 반대로 학습 성능도 낮고 검증 성능도 낮은데 둘의 차이마저 작다면, 모델이 아직 충분히 배우지 못한 과소적합 상태일 수 있습니다.
이런 곡선을 보는 습관은 중요합니다. 숫자 하나만 보면 지금 모델이 부족한지, 과한지, 아니면 아직 더 학습해도 되는지 판단하기 어렵습니다. 하지만 흐름을 보면 모델의 성격이 보입니다. 좋은 모델링은 정적인 점수표보다 움직이는 추세를 읽는 일에 더 가깝습니다.
규제는 모델이 너무 과격해지지 않게 잡아 준다
과적합을 줄이는 대표적인 방법이 규제입니다. 이름은 조금 딱딱하지만 직관은 단순합니다. 모델이 너무 복잡한 방향으로 치닫지 못하게 제동을 거는 장치입니다.
선형 모델을 예로 들면, 규제는 특정 특성의 가중치가 과도하게 커지는 것을 막아 줍니다. 어떤 열 하나에 지나치게 기대는 모델은 학습 데이터에선 좋아 보여도 새 데이터에서는 쉽게 흔들릴 수 있습니다. 규제는 이렇게 말하는 셈입니다.
"설명은 하되, 너무 과하게 설명하지는 마."
이 감각은 중요합니다. 규제는 모델의 자유를 조금 줄이는 대신, 새 데이터에서의 안정성을 얻으려는 타협입니다. 학습 점수만 보면 약간 손해처럼 보일 수 있습니다. 하지만 검증 점수와 테스트 점수까지 보면 오히려 더 나은 경우가 많습니다. 일반화에서는 종종 약간의 불편함이 더 큰 신뢰를 만든다는 사실을 기억해야 합니다.
조기 종료는 잘될 때 멈추는 기술이다
특히 반복 학습을 하는 모델에서는 조기 종료가 매우 실용적입니다. 학습을 오래 하면 할수록 모델이 더 좋아질 것 같지만, 실제로는 어느 시점 이후부터 검증 성능이 나빠질 수 있습니다. 그때까지 계속 학습하면 모델은 점점 더 학습 데이터의 세부에 집착하게 됩니다.
조기 종료는 검증 성능을 보면서 가장 좋았던 시점에서 멈추는 방법입니다. 더 오래 달릴 수 있지만, 굳이 끝까지 달리지 않는 것입니다. 마라톤을 뛰는 것이 아니라 가장 적절한 지점에서 브레이크를 밟는 기술에 가깝습니다.
이 방법이 좋은 이유는 단순합니다. 과적합은 자주 "너무 많이 배워서" 생기기 때문입니다. 조기 종료는 바로 그 과잉 학습을 막아 줍니다. 입문자에게도 특히 유용한 이유는, 복잡한 이론보다 검증 성능의 변화를 차분히 보는 습관을 길러 주기 때문입니다.
드롭아웃은 한 부분에 과하게 의존하지 않게 만든다
드롭아웃은 주로 신경망에서 쓰이는 방법입니다. 학습할 때 일부 연결이나 뉴런을 무작위로 잠시 꺼 두는 방식입니다. 처음 들으면 이상합니다. 열심히 배워야 하는데 왜 일부를 꺼 버릴까요.
직관은 이렇습니다. 모델이 항상 같은 연결만 믿고 답을 내면, 특정한 조합에 지나치게 의존하게 됩니다. 그러면 학습 데이터에는 잘 맞아도 조금 다른 데이터에는 약해질 수 있습니다. 드롭아웃은 학습 과정에서 일부 연결을 가끔 빼 버림으로써, 모델이 여러 경로를 통해 더 튼튼하게 배우도록 만듭니다.
학생으로 치면 특정 문제집의 특정 힌트에만 기대지 못하게 만드는 훈련과 비슷합니다. 조금 불편하지만, 결과적으로는 더 탄탄한 실력을 만들게 됩니다.
딥러닝 장에서 다시 자세히 다루겠지만, 지금 단계에서 기억할 것은 하나면 충분합니다. 드롭아웃은 모델의 지나친 의존성과 과도한 자신감을 완화하는 장치라는 점입니다.
데이터 증강은 더 많은 현실을 보여 주는 방법이다
과적합을 막는 가장 좋은 방법 중 하나는 결국 더 다양한 데이터를 보여 주는 것입니다. 하지만 현실에서는 데이터를 쉽게 더 모을 수 없는 경우가 많습니다. 이때 자주 쓰는 발상이 데이터 증강입니다.
이미지라면 약간 회전하거나, 밝기를 바꾸거나, 일부를 잘라 보는 방식이 있을 수 있습니다. 텍스트라면 표현을 조금 바꾸거나, 문장 일부를 가리는 방식이 쓰일 수 있습니다. 시계열이라면 노이즈를 조금 주거나 구간을 다르게 잘라 보는 방식도 생각할 수 있습니다.
핵심은 원래 정답의 본질은 유지하면서, 모델에게 "현실은 한 가지 모양만 있는 게 아니다"라는 사실을 가르치는 것입니다. 학습 데이터가 너무 정갈하고 단조로우면 모델은 그 모습 자체를 외워 버릴 수 있습니다. 반면 다양한 변형을 함께 보면, 조금 더 본질적인 특징을 배우게 됩니다.
즉 데이터 증강은 단순히 샘플 수를 늘리는 트릭이 아닙니다. 모델이 세상을 더 넓게 보게 만드는 훈련입니다.
평균 성능만 좋다고 안심하면 안 된다
여기서부터가 실무 감각입니다. 어떤 모델의 교차 검증 평균 점수가 더 높다고 해서, 그 모델이 언제나 더 좋은 것은 아닙니다. 평균은 좋아도 분산이 크면, 다시 말해 실험할 때마다 결과가 크게 흔들리면 실제 운영에서는 불안한 모델일 수 있습니다.
예를 들어 A 모델은 평균 F1 점수가 0.84이고, B 모델은 0.82라고 해 봅시다. 숫자만 보면 A가 낫습니다. 그런데 A는 분할이 바뀔 때마다 0.76에서 0.89 사이를 크게 오가고, B는 0.81에서 0.83 사이에서 거의 흔들리지 않는다면 어떨까요. 서비스 환경에서는 오히려 B가 더 믿을 만할 수 있습니다.
이것이 안정성의 문제입니다. 현실의 데이터는 고정되어 있지 않습니다. 기간이 바뀌고, 사용자 구성이 달라지고, 입력 품질이 흔들립니다. 이런 환경에서 중요한 것은 최고 점수보다 평소에 얼마나 덜 무너지느냐입니다.
좋은 모델은 평균이 높은 모델인 동시에, 변동성도 관리되는 모델이어야 합니다.
분산을 보면 모델의 성격이 보인다
모델의 성능 분산은 여러 방식으로 볼 수 있습니다. 데이터 분할을 바꾸었을 때 점수가 얼마나 달라지는지, 랜덤 시드를 바꿨을 때 결과가 얼마나 흔들리는지, 특정 사용자 집단이나 특정 기간에서 성능이 유난히 떨어지지는 않는지를 확인하는 것입니다.
이 과정을 거치면 평균 점수 뒤에 숨어 있던 사실이 드러납니다. 어떤 모델은 전체 평균은 높지만 특정 집단에서만 유난히 약할 수 있습니다. 어떤 모델은 대부분의 경우 괜찮지만 특정 시점에만 갑자기 망가질 수 있습니다. 또 어떤 모델은 재현은 잘되는데 확률의 크기가 들쭉날쭉할 수 있습니다.
즉 일반화를 평가할 때는 "전체적으로 얼마나 맞는가"뿐 아니라, "어디서 얼마나 흔들리는가"를 같이 봐야 합니다. 모델은 평균으로만 사는 존재가 아닙니다. 제품에 들어가는 순간, 모델은 다양한 상황과 사용자 앞에서 일해야 합니다.
캘리브레이션은 모델의 자신감이 믿을 만한지 묻는다
분류 모델은 종종 확률을 출력합니다. 예를 들어 어떤 고객이 이탈할 확률 0.8, 어떤 거래가 사기일 확률 0.9 같은 식입니다. 그런데 여기서 중요한 질문이 생깁니다. 이 0.8이라는 숫자를 정말 80% 정도로 믿어도 되는가?
이 질문이 바로 캘리브레이션입니다. 캘리브레이션이 잘된 모델이라면, 0.8이라고 예측한 사례들을 모아 보았을 때 실제로도 대략 80% 정도가 양성에 가깝게 나타납니다. 반대로 캘리브레이션이 나쁜 모델은 확률은 자신만만하게 내놓지만, 실제 빈도는 전혀 다를 수 있습니다.
이 차이는 제품에서 아주 중요합니다. 예측 확률을 기준으로 고객에게 혜택을 주거나, 사람 검토 대상을 정하거나, 경고 강도를 조절할 때는 단순한 순위뿐 아니라 확률의 신뢰도도 중요하기 때문입니다. 순위는 잘 매기는데 확률은 엉망인 모델도 있습니다. 이런 모델은 "누가 더 위험한가"는 알려 줄 수 있지만, "얼마나 위험한가"를 믿고 의사결정하기는 어렵습니다.
그래서 좋은 일반화는 단지 맞히는 능력만이 아닙니다. 자신감이 현실과 얼마나 맞는지까지 포함합니다.
성능보다 중요한 안정성이라는 말의 진짜 뜻
"성능보다 안정성이 더 중요하다"는 말은 성능이 필요 없다는 뜻이 아닙니다. 낮은 성능의 안정적인 모델이 항상 좋은 것도 아닙니다. 이 말의 진짜 뜻은, 운영 가능한 모델은 높은 점수와 낮은 흔들림을 함께 가져야 한다는 것입니다.
실무에서는 아주 미세한 점수 향상을 위해 모델을 지나치게 복잡하게 만드는 경우가 자주 있습니다. 그런데 그 대가로 재현성이 떨어지고, 학습 시간이 늘고, 특정 구간에서 성능이 출렁이고, 확률 해석까지 어려워진다면 그 개선은 생각보다 값비쌀 수 있습니다.
모델은 대회 점수판에만 존재하지 않습니다. 배포되고, 모니터링되고, 설명되어야 합니다. 그러므로 좋은 모델은 다음 질문에 함께 답할 수 있어야 합니다.
평균적으로 잘 맞는가?
데이터가 조금 달라져도 버티는가?
특정 집단에서만 유난히 약하지 않은가?
확률이나 점수가 실제 위험도와 비슷한가?
다시 학습해도 비슷한 결과가 나오는가?
이 질문들에 대체로 "그렇다"고 답할 수 있을 때, 비로소 모델은 제품 안에서 살아남을 준비를 갖춥니다.
일반화를 높이기 위한 실전 사고방식
과적합을 줄이는 일은 마법의 버튼을 누르는 일이 아닙니다. 여러 장치와 태도를 함께 가져가는 일에 가깝습니다. 실무에서 특히 도움이 되는 사고방식은 다음과 같습니다.
먼저 단순한 베이스라인부터 시작해, 복잡도를 천천히 올린다.
학습 점수보다 검증 점수와 그 변동 폭을 더 중요하게 본다.
데이터가 부족하면 모델을 더 세게 만들기보다 데이터 품질과 표현 방식을 먼저 점검한다.
조기 종료, 규제, 드롭아웃, 데이터 증강처럼 과적합을 막는 장치를 문제 특성에 맞게 사용한다.
최종 선택에서는 평균 성능뿐 아니라 안정성, 분산, 캘리브레이션까지 함께 본다.
이 다섯 가지는 아주 화려하지는 않지만, 많은 실패를 막아 줍니다. 머신러닝에서 진짜 실력은 복잡한 모델 이름을 많이 아는 데서보다, 좋아 보이는 숫자를 의심하고 더 튼튼한 모델을 고르는 감각에서 드러납니다.
이 장에서 가져가야 할 감각
과적합은 모델이 학습 데이터를 너무 잘 기억한 나머지, 새로운 데이터에 약해진 상태입니다. 일반화는 그 반대로, 이미 본 데이터를 넘어 낯선 데이터에서도 비교적 안정적으로 작동하는 능력입니다.
이 차이는 단지 모델 선택의 문제가 아닙니다. 모델 복잡도, 데이터 크기, 데이터 잡음, 학습 방식, 규제 방법이 모두 얽혀 있습니다. 규제는 모델의 과한 반응을 줄이고, 조기 종료는 과잉 학습을 멈추게 하며, 드롭아웃은 특정 연결에 대한 과도한 의존을 줄이고, 데이터 증강은 모델이 더 넓은 현실을 보게 만듭니다.
무엇보다 중요한 것은, 좋은 모델을 평균 점수 하나로 판단하지 않는 태도입니다. 높은 성능보다 더 귀한 것은 낯선 데이터 앞에서도 크게 흔들리지 않는 안정성입니다. 그리고 그 안정성에는 분산, 재현성, 캘리브레이션 같은 요소가 함께 들어 있습니다.
이제 우리는 지도학습 모델을 어떻게 만들고, 어떻게 평가하고, 왜 어떤 모델이 현실에서 무너지는지까지 살펴보았습니다. 다음 장부터는 시선을 조금 바꿔, 정답이 없는 데이터에서 패턴을 찾는 비지도학습의 세계로 들어가 보겠습니다. 먼저 살펴볼 주제는, 비슷한 것끼리 자연스럽게 묶어 보는 방법인 군집화입니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
