성적은 좋은데 실전에는 약한 모델
머신러닝을 처음 배울 때 가장 달콤한 순간은 모델의 점수가 높게 나오는 때입니다. 집값 예측 모델을 만들었는데 오차가 아주 작고, 스팸 메일 분류기를 만들었는데 정확도가 99%라고 나오면 왠지 대단한 일을 해낸 것 같습니다. 화면 속 숫자만 보면 모델이 세상의 규칙을 거의 완벽하게 배운 것처럼 보입니다.
그런데 머신러닝에서는 바로 이 순간을 조심해야 합니다. 모델이 정말로 똑똑해진 것일 수도 있지만, 단지 연습 문제의 답을 외운 것일 수도 있기 때문입니다.
예를 들어 어떤 학생이 수학 시험을 준비한다고 해 봅시다. 이 학생은 개념을 이해하기보다 기출문제 답안지를 통째로 외웠습니다. 시험 전날까지 같은 문제만 반복해서 풀었기 때문에 기출문제를 다시 내면 거의 만점을 받습니다. 선생님이 "이 학생은 수학을 잘한다"고 착각할 수도 있습니다.
하지만 실제 시험에서 숫자만 조금 바뀐 문제가 나오면 어떻게 될까요? 학생은 갑자기 흔들립니다. 문제의 원리를 이해하지 못했기 때문에, 본 적 없는 형태의 문제에는 대응하지 못합니다. 겉으로는 열심히 학습한 것처럼 보였지만, 사실은 답안지를 외운 것에 가까웠던 셈입니다.
머신러닝에서도 같은 일이 일어납니다. 모델이 훈련 데이터에서는 매우 좋은 성능을 내지만, 처음 보는 데이터에서는 성능이 크게 떨어지는 현상을 과적합이라고 합니다. 영어로는 overfitting이라고 부릅니다. 말 그대로 데이터에 '너무 딱 맞게' 끼워 맞춘 상태입니다.
머신러닝의 목표는 훈련 데이터를 완벽히 맞히는 것이 아닙니다. 진짜 목표는 아직 보지 못한 새로운 데이터에서도 그럴듯하게 예측하는 것입니다. 이 능력을 일반화라고 합니다.

과적합은 왜 위험할까
지금까지 우리는 모델이 데이터를 보고 패턴을 배운다고 설명했습니다. 그렇다면 이런 질문이 자연스럽게 생깁니다.
"패턴을 많이 배울수록 좋은 것 아닌가요?"
항상 그렇지는 않습니다. 문제는 데이터 안에 진짜 패턴만 들어 있는 것이 아니라는 점입니다. 현실의 데이터에는 우연, 실수, 예외, 잡음이 섞여 있습니다.
집값 데이터를 생각해 봅시다. 일반적으로 집의 면적이 넓을수록 가격이 높을 가능성이 큽니다. 역과 가까울수록 가격이 높을 수도 있고, 학군이 좋으면 가격이 오를 수도 있습니다. 이런 관계는 모델이 배워도 좋은 패턴입니다.
하지만 어떤 집은 집주인이 급하게 팔아야 해서 시세보다 싸게 거래되었을 수 있습니다. 어떤 집은 유명인이 살았다는 이유로 비정상적으로 비쌌을 수 있습니다. 어떤 데이터는 입력 과정에서 실수로 가격이 잘못 적혔을 수도 있습니다. 이런 것들은 모든 집에 적용되는 규칙이 아닙니다. 그 데이터에만 우연히 붙어 있는 특수한 흔적입니다.
과적합된 모델은 이런 흔적까지 열심히 외웁니다. 마치 학생이 "이 문제는 답이 3번이었어"라고 외우는 것처럼, 모델은 "이런 모양의 데이터는 무조건 이 값이었어"라고 기억합니다. 훈련 데이터에서는 잘 맞습니다. 하지만 새로운 데이터가 들어오면 그 기억은 오히려 방해가 됩니다.
스팸 메일 분류기도 마찬가지입니다. 훈련 데이터 안의 스팸 메일에 우연히 "무료 쿠폰"이라는 표현이 많이 들어 있었다고 합시다. 모델이 적당히 배우면 "무료 쿠폰"이라는 표현이 스팸 가능성을 높일 수 있다고 판단합니다. 여기까지는 괜찮습니다. 그런데 과적합된 모델은 더 이상한 것까지 외울 수 있습니다. 예를 들어 훈련 데이터의 스팸 메일에 특정 요일, 특정 문장 길이, 특정 발신자 이름 조각이 우연히 많이 등장했다면, 그것까지 스팸의 강한 증거처럼 취급할 수 있습니다.
그 결과 진짜 스팸은 놓치고, 정상 메일을 스팸으로 분류하는 일이 생깁니다. 모델은 열심히 배웠지만, 중요한 것을 배운 것이 아니라 쓸데없는 세부사항까지 외워 버린 것입니다.
일반화: 처음 보는 문제를 푸는 힘
일반화는 머신러닝에서 가장 중요한 능력 중 하나입니다. 어떤 모델이 일반화를 잘한다는 말은, 훈련에 사용하지 않은 데이터에서도 안정적으로 예측한다는 뜻입니다.
조금 더 쉬운 비유를 들어 보겠습니다. 요리를 배우는 두 사람이 있습니다. 한 사람은 특정 레시피의 순서를 한 글자도 틀리지 않게 외웠습니다. "양파 120g, 당근 80g, 소금 3g, 중불에서 7분"처럼 정확하게 외웠습니다. 이 사람은 같은 재료, 같은 도구, 같은 환경에서는 좋은 결과를 낼 수 있습니다.
다른 한 사람은 원리를 배웠습니다. 양파를 먼저 볶으면 단맛이 올라오고, 소금은 재료의 수분을 끌어내며, 불이 너무 세면 겉만 타고 속은 익지 않는다는 것을 이해했습니다. 이 사람은 양파가 조금 적어도, 당근이 없어도, 프라이팬이 바뀌어도 어느 정도 대응할 수 있습니다.
좋은 머신러닝 모델은 두 번째 요리사에 가깝습니다. 훈련 데이터의 모든 세부사항을 외우는 것이 아니라, 새로운 상황에도 적용될 수 있는 중요한 규칙을 찾아야 합니다.
여기서 중요한 점은 일반화가 "대충 예측한다"는 뜻이 아니라는 것입니다. 일반화는 "훈련 데이터에만 맞는 우연한 규칙을 버리고, 더 넓게 적용되는 패턴을 잡아내는 능력"입니다. 그래서 좋은 모델은 훈련 데이터에서의 성능만 보고 판단할 수 없습니다. 모델이 처음 보는 데이터에서 얼마나 잘 작동하는지를 함께 봐야 합니다.
너무 단순해도 문제, 너무 복잡해도 문제
과적합을 이해하려면 모델 복잡도라는 감각이 필요합니다. 모델 복잡도란 모델이 얼마나 다양한 모양의 규칙을 표현할 수 있는지를 말합니다.
선형회귀를 떠올려 봅시다. 선형회귀는 기본적으로 직선이나 평면처럼 비교적 단순한 관계를 학습합니다. 집의 면적이 커질수록 가격이 일정한 방향으로 올라간다는 식의 패턴에는 잘 맞을 수 있습니다. 하지만 데이터의 관계가 복잡하게 휘어져 있다면 선형회귀는 그 모양을 충분히 따라가지 못할 수 있습니다.
반대로 결정트리는 데이터를 질문으로 계속 쪼갤 수 있습니다. "면적이 30평 이상인가?", "지하철역까지 10분 이내인가?", "건축 연도가 2015년 이후인가?"처럼 가지를 계속 만들면 훈련 데이터를 아주 세밀하게 나눌 수 있습니다. 트리의 깊이가 깊어질수록 모델은 복잡한 규칙을 표현할 수 있습니다.
하지만 바로 이 능력이 과적합의 원인이 되기도 합니다. 트리가 너무 깊어지면 모델은 거의 데이터 한 건 한 건에 맞춘 특별 규칙을 만들 수 있습니다. 예를 들어 "면적이 31.2평이고, 역까지 8분이고, 건축 연도가 2017년이고, 층수가 13층이면 가격은 8억 2천만 원" 같은 식입니다. 훈련 데이터에는 잘 맞을 수 있지만, 이런 규칙이 새로운 집에도 의미 있게 적용될 가능성은 낮습니다.
모델이 너무 단순하면 중요한 패턴을 놓칩니다. 이를 과소적합이라고 합니다. 반대로 모델이 너무 복잡하면 훈련 데이터의 우연한 흔적까지 외웁니다. 이것이 과적합입니다.
좋은 모델링은 이 둘 사이에서 적절한 균형을 찾는 일입니다. 너무 둔해서 아무것도 못 보는 모델도 곤란하고, 너무 예민해서 먼지까지 의미로 해석하는 모델도 곤란합니다.
데이터가 적으면 외우기 쉬워진다
과적합은 모델이 복잡할 때만 생기는 문제가 아닙니다. 데이터가 적을 때도 쉽게 생깁니다.
예를 들어 어떤 카페의 매출을 예측하는 모델을 만든다고 합시다. 데이터가 단 5일치뿐이라면 모델은 그 5일의 특수한 상황에 크게 흔들립니다. 월요일에 비가 왔고, 화요일에 근처 회사 행사가 있었고, 수요일에 사장님이 할인 쿠폰을 뿌렸다면, 모델은 이 작은 표본을 세상의 일반 법칙처럼 받아들일 수 있습니다.
하지만 2년치 데이터가 있다면 이야기가 달라집니다. 비 오는 날도 여러 번, 맑은 날도 여러 번, 행사가 있는 날도 여러 번, 평범한 날도 여러 번 들어 있을 것입니다. 데이터가 많아지면 우연히 튄 사례 하나가 전체 판단을 지배하기 어려워집니다. 모델은 더 안정적인 패턴을 찾을 가능성이 높아집니다.
물론 데이터가 많다고 무조건 좋은 것은 아닙니다. 잘못 수집된 데이터가 많이 쌓이면 오히려 문제를 키울 수 있습니다. 그래도 일반적으로 충분한 양의 다양한 데이터는 과적합을 줄이는 데 큰 도움이 됩니다. 모델이 한두 개의 사례를 외우는 대신, 여러 사례에 반복해서 나타나는 패턴을 보게 해 주기 때문입니다.
특히 머신러닝에서 중요한 것은 단순히 데이터의 개수가 아니라 다양성입니다. 스팸 메일 분류기를 만들면서 특정 회사의 메일만 잔뜩 모았다면, 모델은 그 회사의 문체에는 익숙해질 수 있지만 다른 회사나 다른 언어의 메일에는 약할 수 있습니다. 고객 이탈 예측 모델도 특정 연령대의 고객 데이터만 많다면, 다른 연령대의 고객 행동을 잘 예측하지 못할 수 있습니다.
일반화는 다양한 상황을 경험할수록 강해집니다. 사람도 한 종류의 문제만 풀어 본 것보다 여러 변형 문제를 풀어 본 사람이 실전에 강한 것처럼, 모델도 다양한 데이터를 접해야 새로운 데이터에 덜 흔들립니다.
노이즈까지 학습하면 위험하다
데이터에는 종종 노이즈가 들어 있습니다. 노이즈란 모델이 배워야 할 핵심 패턴과는 상관없는 흔들림이나 오류를 말합니다. 현실 세계가 깔끔한 엑셀 표처럼 움직이지 않기 때문에 노이즈는 거의 피할 수 없습니다.
집값 데이터에서는 같은 아파트라도 거래 시점, 매도자의 사정, 인테리어 상태, 협상 과정에 따라 가격이 달라질 수 있습니다. 메일 분류 데이터에서는 사람이 라벨을 잘못 붙였을 수도 있습니다. 고객 이탈 데이터에서는 고객이 실제로는 불만족해서 떠났지만 기록에는 단순 계약 종료로 남아 있을 수도 있습니다.
모델이 적절한 수준으로 학습하면 이런 노이즈를 어느 정도 무시합니다. "몇몇 예외는 있지만 대체로 이런 경향이 있구나"라고 보는 것입니다. 하지만 과적합된 모델은 예외까지 규칙으로 만들려고 합니다.
이것은 밤하늘에서 별자리를 찾는 일과 비슷합니다. 별자리 자체는 사람이 만든 해석이지만, 그래도 우리는 별들의 상대적 위치에서 익숙한 모양을 찾습니다. 그런데 너무 집착하면 구름의 작은 얼룩이나 눈앞의 먼지까지 별자리의 일부라고 우길 수 있습니다. 모델도 마찬가지입니다. 데이터의 중요한 구조를 보는 것은 좋지만, 우연한 흔들림까지 의미로 해석하면 새로운 하늘에서는 길을 잃습니다.
노이즈가 많은 데이터일수록 모델은 신중해야 합니다. 지나치게 복잡한 모델은 노이즈를 '정보'로 착각하기 쉽습니다. 그래서 데이터가 지저분하고 불확실할수록, 훈련 성능만 보고 모델을 칭찬하면 위험합니다.
과적합은 어떻게 발견할까
과적합을 발견하는 가장 기본적인 방법은 훈련 데이터에서의 성능과 처음 보는 데이터에서의 성능을 비교하는 것입니다.
여기서 훈련 데이터란 모델이 학습할 때 본 데이터입니다. 학생에게 보여 준 연습 문제와 같습니다. 반면 테스트 데이터는 학습에는 사용하지 않고, 나중에 실력을 확인하기 위해 남겨 둔 데이터입니다. 학생에게 처음 보여 주는 실전 문제에 가깝습니다.
과적합이 없다면 훈련 성능과 테스트 성능은 어느 정도 비슷한 흐름을 보입니다. 완전히 같을 필요는 없습니다. 훈련 데이터는 이미 본 문제이므로 보통 성능이 조금 더 좋을 수 있습니다. 하지만 차이가 너무 크면 의심해야 합니다.
예를 들어 스팸 메일 분류기의 훈련 정확도가 99%인데 테스트 정확도가 72%라면 어떨까요? 모델이 스팸의 일반적인 특징을 배운 것이 아니라, 훈련 메일의 세부사항을 외웠을 가능성이 있습니다. 집값 예측 모델에서 훈련 오차는 거의 0에 가까운데 새로운 지역의 집값 예측 오차가 매우 크다면, 역시 과적합을 의심해야 합니다.
이 차이를 흔히 일반화 격차라고 생각할 수 있습니다. 훈련 데이터에서는 잘하는데 테스트 데이터에서는 못한다면, 그 간격만큼 모델이 실전에 약하다는 뜻입니다.
간단히 정리하면 과적합을 의심해야 하는 상황은 다음과 같습니다.
훈련 데이터 성능은 매우 좋은데 테스트 데이터 성능이 눈에 띄게 낮다.
모델을 복잡하게 만들수록 훈련 성능은 계속 좋아지지만 새로운 데이터 성능은 오히려 나빠진다.
데이터의 작은 변화나 새로운 샘플에 따라 예측 결과가 지나치게 흔들린다.
이 세 가지는 모두 모델이 진짜 규칙보다 훈련 데이터의 세부사항에 과하게 반응하고 있다는 신호입니다.
그래프로 보면 더 선명해진다
과적합은 숫자로도 볼 수 있지만, 머릿속에 그래프를 그려 보면 더 쉽게 이해됩니다.
가로축에 모델 복잡도를 놓고, 세로축에 오차를 놓아 봅시다. 아주 단순한 모델은 훈련 데이터에서도 오차가 큽니다. 직선 하나로 복잡한 데이터를 설명하려고 하니 당연히 잘 안 맞습니다. 이때는 과소적합에 가깝습니다.
모델을 조금 더 복잡하게 만들면 훈련 오차가 줄어듭니다. 테스트 오차도 함께 줄어듭니다. 이 구간에서는 모델이 실제로 유용한 패턴을 배우고 있습니다. 좋은 변화입니다.
그런데 어느 순간부터 훈련 오차는 계속 줄어드는데 테스트 오차는 다시 커질 수 있습니다. 모델이 훈련 데이터의 예외와 노이즈까지 외우기 시작했기 때문입니다. 이 지점부터 과적합이 나타납니다.
재미있는 점은 훈련 성능만 보면 이 문제를 알아차리기 어렵다는 것입니다. 훈련 오차는 계속 좋아지고 있으니까요. 그래서 머신러닝에서는 "훈련 데이터에서 잘 맞았다"는 말만으로는 충분하지 않습니다. 반드시 "처음 보는 데이터에서도 잘 맞았는가?"를 물어야 합니다.
이 질문 하나가 머신러닝 모델을 장난감에서 실전 도구로 바꿉니다.
좋은 모델은 외우는 모델이 아니라 덜 흔들리는 모델이다
초보자는 종종 가장 높은 훈련 점수를 낸 모델을 좋은 모델이라고 생각합니다. 하지만 실전에서는 조금 다르게 봐야 합니다. 좋은 모델은 훈련 데이터에 완벽하게 달라붙은 모델이 아니라, 새로운 데이터가 와도 크게 흔들리지 않는 모델입니다.
예를 들어 고객 이탈 예측 모델을 만든다고 해 봅시다. 어떤 모델은 과거 고객 데이터에서는 거의 완벽하게 맞춥니다. 하지만 다음 달에 들어온 신규 고객에게 적용하자 예측이 엉망입니다. 이 모델은 보고서에서는 멋져 보일 수 있지만, 실제 마케팅 캠페인에는 위험합니다. 잘못된 고객에게 할인 쿠폰을 보내고, 정말 떠날 가능성이 높은 고객은 놓칠 수 있기 때문입니다.
반면 어떤 모델은 훈련 데이터에서 100점을 받지는 못합니다. 그래도 새로운 고객 데이터에서 안정적인 성능을 냅니다. 이 모델이 실제 업무에서는 더 가치 있을 수 있습니다. 머신러닝의 목적은 과거를 완벽히 설명하는 데 있지 않고, 미래에 더 나은 결정을 내리는 데 있기 때문입니다.
이 관점을 갖는 순간 모델 평가의 기준이 달라집니다. 우리는 더 이상 "얼마나 훈련 데이터를 잘 맞혔는가?"만 보지 않습니다. 대신 이렇게 묻습니다.
이 모델은 처음 보는 데이터에서도 비슷한 성능을 내는가?
데이터가 조금 바뀌어도 예측이 지나치게 흔들리지 않는가?
훈련 데이터의 우연한 특징이 아니라 반복적으로 나타나는 패턴을 배웠는가?
이 질문들은 앞으로 좋은 모델을 만드는 모든 과정의 중심이 됩니다.
과적합을 줄인다는 것은 욕심을 조절하는 일
과적합을 줄이는 방법은 여러 가지가 있습니다. 이 장에서 모든 기법을 깊게 다루지는 않겠지만, 큰 방향은 이해해 둘 필요가 있습니다.
첫째, 모델을 너무 복잡하게 만들지 않는 방법이 있습니다. 결정트리라면 트리의 깊이를 제한할 수 있고, 너무 작은 그룹까지 억지로 나누지 않게 할 수 있습니다. 복잡한 모델이 항상 나쁜 것은 아니지만, 데이터에 비해 지나치게 복잡하면 외우기 쉬워집니다.
둘째, 더 많고 다양한 데이터를 모으는 방법이 있습니다. 모델이 여러 상황을 경험하면 특정 사례 하나에 덜 휘둘립니다. 한 반의 학생 3명만 보고 "이 학교 학생들은 모두 이렇다"고 말하는 것보다, 여러 학년과 여러 반의 학생을 함께 보는 편이 더 안정적인 판단을 가능하게 합니다.
셋째, 학습에 사용하지 않은 데이터로 성능을 확인해야 합니다. 이것이 다음 장에서 다룰 학습 데이터와 테스트 데이터의 핵심입니다. 모델에게 모든 문제를 미리 보여 준 뒤 시험을 치르게 하면 실력을 알 수 없습니다. 일부 문제는 끝까지 숨겨 두었다가, 학습이 끝난 뒤 확인해야 합니다.
결국 과적합을 줄이는 일은 모델의 욕심을 조절하는 일입니다. 모델은 가능한 한 훈련 데이터를 잘 맞히고 싶어 합니다. 하지만 우리는 모델에게 말해야 합니다.
"그 문제만 맞히면 되는 게 아니야. 다음에 나올 문제도 풀 수 있어야 해."
머신러닝의 진짜 시험은 아직 보지 못한 데이터다
이 장의 핵심은 간단합니다. 머신러닝 모델은 훈련 데이터를 외우기 위해 존재하지 않습니다. 모델은 데이터를 통해 세상의 반복되는 패턴을 배우고, 그 패턴을 처음 보는 상황에 적용하기 위해 존재합니다.
과적합은 모델이 훈련 데이터에 너무 가까이 붙어 버린 상태입니다. 훈련 데이터의 정답은 잘 맞히지만, 새로운 데이터 앞에서는 약해집니다. 일반화는 그 반대입니다. 훈련 데이터에서 배운 내용을 바탕으로, 처음 보는 데이터에서도 안정적으로 예측하는 능력입니다.
과적합에 영향을 주는 요소는 모델 복잡도, 데이터 양, 데이터의 다양성, 노이즈 등 여러 가지입니다. 복잡한 모델일수록 표현력이 커지지만 그만큼 외울 위험도 커집니다. 데이터가 적거나 한쪽으로 치우쳐 있으면 우연한 패턴을 진짜 규칙으로 착각하기 쉽습니다. 노이즈가 많으면 모델이 불필요한 흔들림까지 학습할 수 있습니다.
그래서 우리는 훈련 성능만 보지 않습니다. 반드시 새로운 데이터에서의 성능을 봐야 합니다. 훈련 성능과 테스트 성능의 차이가 크다면, 모델은 답안지를 외운 학생일 가능성이 큽니다.
다음 장에서는 이 문제를 다루기 위한 가장 기본적인 장치인 학습 데이터와 테스트 데이터를 살펴보겠습니다. 모델에게 어떤 데이터는 공부용으로 주고, 어떤 데이터는 시험용으로 남겨 두는 이유를 이해하면, 과적합을 눈으로 확인하고 더 믿을 만한 모델을 만드는 첫걸음을 뗄 수 있습니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.