본문으로 바로가기

과적합 vs 과소적합: 실무적인 모델 진단 가이드

머신러닝에서 과적합과 과소적합을 자세히 살펴보고, 각 실패 모드를 식별하는 방법, 발생 원인, 바이어스-분산 트레이드오프를 통해 해결하는 방법을 다룹니다.
업데이트됨 2026년 6월 12일  · 12분 읽다

훈련 데이터에서는 정확도가 99%인데, 프로덕션에서는 제대로 맞히는 것이 하나도 없었던 이유를 아시나요?

암기는 학습과 다릅니다. 일반화가 머신러닝의 핵심입니다. 훈련에 사용한 데이터뿐 아니라 모델이 본 적 없는 데이터에서도 예측이 통하는 것이 목표입니다. 그렇지 않다면, 거의 항상 두 가지 방향 중 하나로 문제가 발생합니다.

그 두 가지가 과적합과 과소적합입니다. 문제를 해결하려면 먼저 어느 쪽인지 알아야 합니다.

이 글에서는 과적합과 과소적합을 알아보는 방법, 그 원인, 그리고 균형을 잡는 데 도움이 되는 실무적 절차를 살펴보겠습니다.

과소적합이란?

과소적합은 모델이 데이터에서 실제로 일어나는 일을 표현하기에 지나치게 단순할 때 발생합니다.

단 하나의 규칙으로 집값을 예측한다고 상상해 보세요. "모든 집은 30만 달러다." 이 규칙은 거의 어디에서나 틀립니다. 동네, 평수, 침실 수, 차고, 건축 연도 등을 보지 못합니다. 패턴을 따라갈 유연성이 턱없이 부족한 모델입니다.

과소적합은 항상 같은 방식으로 드러납니다. 훈련 정확도가 낮고, 테스트 정확도도 낮습니다. 두 수치 모두 나쁘지만, 핵심은 둘이 함께 나쁘다는 점입니다.

전형적인 사례는 곡선 데이터를 직선으로 맞추는 것입니다. 직선은 한가운데를 가로지르며 전체 형태를 놓칩니다. 모델 자체가 관계를 표현할 수 없기 때문에 데이터를 더 늘려도 소용이 없습니다.

Underfitting example

과소적합 예시

과적합이란?

과적합은 반대의 문제입니다. 모델이 너무 복잡합니다.

일반적인 패턴을 학습하는 대신, 훈련 세트를 암기합니다. 잡음, 기이한 이상치, 모든 봉우리와 골짜기, 우연히 생긴 상관까지 실제 패턴처럼 집착합니다. 그 결과 훈련 데이터에는 거의 완벽해집니다.

과적합의 장점이라면 쉽게 알아볼 수 있다는 점입니다. 훈련 정확도는 훌륭하지만, 테스트 정확도는 형편없습니다.

예상 문제의 답을 한 글자도 틀리지 않게 외운 학생을 떠올려 보세요. 기본 개념을 배우지 못했기 때문에 모의시험에서는 잘 보지만 실제 시험에서는 실패합니다.

Overfitting example

과적합 예시

과적합 vs 과소적합: 핵심 차이

둘을 보면 차이가 한결 뚜렷해집니다. 과소적합 모델은 본 데이터에서도 성능이 안 나옵니다. 과적합 모델은 보지 않은 데이터에서 성능이 안 나옵니다.

훈련 중 양상이 다르게 나타납니다.

  • 과소적합은 전반적으로 평탄하고 중간 이하의 성능으로 드러납니다. 모델이 무엇에서도 제대로 배우지 못합니다.
  • 과적합은 격차로 드러납니다. 훈련 점수는 계속 오르지만 테스트 점수는 정체되거나 시간이 갈수록 나빠집니다.

원인도 서로를 비춥니다. 과소적합은 너무 적게 해서 생깁니다. 단순한 모델, 부족한 특성 때문입니다. 과적합은 너무 많이 해서 생깁니다. 복잡한 모델, 과도한 특성 때문입니다.

두 가지를 요약하면 다음과 같습니다.

Underfitting compared to overfitting

과소적합 vs 과적합 비교

과적합과 과소적합을 식별하는 방법

개념적으로 아는 것과 실제 내 모델에서 잡아내는 것은 다릅니다.

가장 쉬운 방법은 훈련 오류와 테스트 오류를 비교하고, 러닝 커브를 확인하는 것입니다.

훈련 vs 테스트 오류

가장 빠른 점검은 데이터를 훈련/테스트 세트로 나누고, 모델을 학습시킨 뒤 각각의 오류를 보는 것입니다.

과소적합의 경우 두 오류가 모두 높습니다. 훈련 데이터를 제대로 배우지 못했고, 본 적 없는 데이터에서도 더 나아질 리 없습니다. 양쪽 모두 결과가 나쁩니다.

과적합의 경우 훈련 오류는 매우 낮지만 테스트 오류는 높게 유지됩니다. 훈련 데이터를 암기했지만 그 지식이 전이되지 않습니다.

Training vs test error visualization

훈련 vs 테스트 오류 시각화

두 수치 간의 격차를 분석해야 합니다. 오류가 높고 격차가 작으면 과소적합입니다. 훈련 오류는 낮고 테스트 오류가 높으며 격차가 크면 과적합입니다. 둘 다 낮고 격차가 작다면 목표에 근접한 것으로, 실제 데이터 표현을 학습했다는 의미입니다.

러닝 커브

러닝 커브는 훈련 세트 크기나 훈련 반복 횟수에 따른 훈련/검증 오류를 그려, 모델이 학습하며 무슨 일이 일어나는지 보여줍니다.

과소적합 모델에서는 두 곡선이 높은 오류 수준에서 빠르게 평평해집니다. 모델이 애초에 패턴을 표현할 수 없으니 데이터를 더 넣어도 소용이 없습니다. 두 곡선 모두 높게 유지됩니다.

Underfit model curves

과소적합 모델 커브

과적합 모델에서는 훈련 곡선은 거의 0으로 떨어지지만 검증 곡선은 높게 유지됩니다. 훈련이 계속될수록 두 곡선 간 격차가 커집니다. 그 커지는 격차가 차트에서 보이는 과적합의 모습입니다.

Overfit model curves

과적합 모델 커브

건전한 모델은 두 곡선이 함께 낮아지며 낮은 오류 지점에서 만납니다. 둘 사이의 격차도 작습니다.

과적합과 과소적합이 발생하는 이유

식별법을 알았다면, 다음 질문은 왜 이런 일이 생기느냐입니다. 두 경우 모두 모델과 문제 간의 불일치에서 오지만, 방향이 반대입니다.

과소적합의 원인

과소적합은 거의 항상 다음 세 가지 중 하나로 귀결됩니다.

  • 모델이 너무 단순함: 선형 모델은 곡선 관계를 표현할 수 없습니다. 문제에 필요한 용량(capacity)이 부족합니다.
  • 특성이 불충분함: 유능한 모델이라도 입력이 잘못되면 과소적합합니다. 우편번호만으로 집값을 예측하는 것은 말이 되지 않습니다. 평수, 침실 수, 상태, 연식, 대지 면적을 놓칩니다. 모델은 활용할 유용한 정보가 없습니다.
  • 훈련이 부족함: 충분한 깊이, 반복, 에폭, 학습률 조정이 부족해 좋은 해에 도달하지 못했습니다. 훈련이 너무 일찍 멈췄습니다.

과적합의 원인

과적합은 데이터가 필요로 하는 것보다 모델에 자유도를 더 많이 줄 때 발생합니다.

  • 모델이 너무 복잡함: 적은 데이터셋에 수백만 개 매개변수를 가진 심층 신경망을 학습시키면 암기할 여지가 넘칩니다. 용량이 문제의 필요를 초과합니다.
  • 특성이 너무 많음: 데이터의 의미 있는 패턴보다 특성이 더 많으면, 모델은 훈련 표본에 우연히 존재하는 상관을 학습해 일반화하지 못합니다.
  • 데이터셋이 너무 작음: 훈련 데이터가 제한적이면, 중간 복잡도의 모델도 전체를 암기할 수 있습니다. 일반화에 필요한 사례가 부족합니다.
  • 훈련을 너무 오래 함: 실제 패턴을 이미 학습한 뒤에도 가중치 조정을 계속하며 잡음까지 맞추기 시작합니다. 그 시점부터는 더 훈련할수록 나빠집니다.

바이어스-분산 트레이드오프

바이어스-분산 트레이드오프는 모델이 문제를 과도하게 단순화하지도, 훈련 세트에 과적합하지도 않으면서 보지 않은 데이터에 잘 일반화되는 최적 지점을 찾는 것이 성능의 핵심임을 설명합니다.

높은 바이어스

바이어스는 모델이 데이터에 대해 갖는 가정에서 비롯되는 오류입니다. 바이어스가 높은 모델은 강하고 단순한 가정을 갖습니다. 데이터에서 일어나는 실제 복잡성을 표현하지 못합니다.

이는 곧 과소적합입니다. 모델이 너무 경직되어 패턴을 맞추지 못하므로, 데이터를 아무리 많이 줘도 예측이 계속 빗나갑니다.

바이어스가 높은 모델을 서로 다른 표본으로 100번 학습시키면, 100개 모두 비슷한 실수를 합니다. 예측이 틀린 답 주변에 모입니다.

높은 분산

분산은 모델이 자신이 학습한 특정 데이터에 과하게 민감할 때 발생하는 오류입니다. 분산이 높은 모델은 사소한 패턴, 보통은 잡음을 모두 주워 담습니다.

이것이 과적합입니다. 모델은 훈련 세트와 매우 밀착해 맞추지만, 훈련 데이터가 조금만 바뀌어도 예측이 크게 달라집니다.

분산이 높은 모델을 서로 다른 표본으로 100번 학습시키면 100개가 모두 크게 달라집니다. 동일 입력에서도 예측이 제각각입니다.

트레이드오프

바이어스와 분산을 완전히 없앨 수는 없습니다. 둘 사이에서 균형을 옮길 수 있을 뿐입니다.

모델을 복잡하게 만들면 바이어스는 줄지만 분산이 늘고, 모델을 단순화하면 분산은 줄지만 바이어스가 늘어납니다. 목표는 총 오류가 최소가 되는 중간 지점을 찾는 것입니다.

Bias-variance tradeoff example

바이어스-분산 트레이드오프 예시

과소적합을 해결하는 방법

과소적합으로 진단되면 해결 방법이 몇 가지 있습니다. 공통점은 모델이 데이터의 패턴을 표현할 수 있도록 용량을 늘려준다는 점입니다.

  • 모델 복잡도 증가: 더 유연한 모델로 전환하세요. 선형 회귀에서 다항 회귀로, 얕은 트리에서 더 깊은 트리로 이동합니다.
  • 특성 추가: 실제로 가치가 있는 새로운 입력을 추가하세요. 상호작용 항, 다항 특성, 도메인 특화 특성을 생성해 모델이 접근하지 못했던 정보를 제공합니다.
  • 더 오래 훈련: 모델이 수렴하기에 시간이 부족했을 수 있습니다. 에폭을 늘리거나 다른 학습률 스케줄을 사용하세요.
  • 정규화 축소: 정규화는 모델을 단순하게 유지하는데, 이는 과소적합에는 역행합니다. 정규화 강도를 낮추거나 제거해 모델에 더 많은 자유도를 주세요.

몇 가지 좋은 특성이 아키텍처 변경보다 효과가 큰 경우가 많습니다. 모델 자체를 바꾸기 전, 특성부터 손보세요.

과적합을 해결하는 방법

과적합은 반대 접근을 취합니다. 모델이 훈련 데이터를 암기하지 않도록 제약을 주는 것입니다.

  • 데이터 더 수집: 데이터셋이 커지면 모델이 암기하기가 훨씬 어려워집니다. 더 많은 예시가 전체에 걸쳐 유지되는 패턴을 찾도록 강제합니다. 몇 줄만 맞추는 식으로는 통하지 않습니다.
  • 정규화 적용: L1 및 L2 정규화는 큰 가중치에 패널티를 주어, 모델이 단일 특성에 과도하게 의존하지 않게 합니다. 가장 신뢰할 수 있는 해결책 중 하나입니다.
  • 모델 복잡도 축소: 데이터에 비해 모델이 너무 크다면 줄이세요. 매개변수를 줄이고, 더 얕은 트리나 더 작은 네트워크를 사용합니다.
  • 교차 검증 사용: 교차 검증은 보지 않은 데이터에 대한 성능을 더 정직하게 보여줍니다. 하나의 데이터셋에서 더 많은 훈련-테스트 분할을 제공합니다.
  • 신경망에 드롭아웃 적용: 드롭아웃은 훈련 중 임의의 비율의 뉴런을 비활성화합니다. 네트워크가 중복 표현을 학습하도록 강제해 단일 뉴런에 대한 의존을 줄입니다.
  • 조기 종료: 검증 오류를 모니터링하고, 훈련 오류가 계속 떨어지더라도 검증 오류가 상승하기 시작하면 훈련을 멈추세요. 이를 조기 종료(early stopping)라 하며, 가장 쉽게 도입할 수 있는 방법 중 하나입니다.

정규화와 조기 종료는 보통 가장 먼저 시도할 만합니다. 비용이 들지 않고 거의 항상 도움이 됩니다.

모델별 과적합과 과소적합

모델 계열에 따라 과소적합과 과적합이 드러나는 방식이 다릅니다. 세 가지 흔한 모델이 양쪽 방향으로 어떻게 실패하는지 보겠습니다.

선형 모델

  • 과소적합: 선형 모델은 직선 관계를 가정합니다. 실제 패턴이 곡선을 그리면, 데이터를 얼마나 주든 따라갈 수 없습니다.
  • 과적합: 다항항이나 상호작용 항을 충분히 추가하면, 선형 회귀조차 잡음을 암기할 수 있습니다. Ridge와 Lasso 같은 정규화 기법이 주로 이를 다루기 위해 존재합니다.

결정 트리

  • 과소적합: 얕은 트리는 몇 번만 분기를 할 수 있습니다. 두세 번의 결정으로는 더 미묘한 패턴을 표현하지 못합니다.
  • 과적합: 깊은 트리는 과적합하기 쉽습니다. 각 잎이 단일 훈련 예시만 포함할 때까지 분할을 계속하면 훈련 정확도는 완벽하고 테스트 정확도는 떨어집니다. 그래서 max_depth, min_samples_split, 가지치기(pruning) 같은 파라미터가 존재합니다.

신경망

  • 과소적합: 문제에 비해 네트워크가 너무 작으면 과소적합합니다. 훈련이 너무 일찍 멈추거나 옵티마이저가 아차원해(suboptimal) 해에 갇힌 경우도 마찬가지입니다.
  • 과적합: 딥러닝에서 더 흔합니다. 수백만 개 매개변수를 가진 네트워크는 에폭이 충분하면 큰 데이터셋도 암기할 수 있습니다. 드롭아웃, 가중치 감쇠(weight decay), 데이터 증강, 조기 종료는 이를 방지하려고 존재합니다.

과적합 vs 과소적합 추가 예시

이제 두 가지 고전적인 예시를 코드와 함께 살펴보며 이러한 패턴을 쉽게 확인해 보겠습니다.

다항 회귀

잡음이 섞인 사인파는 좋은 시험대입니다. 서로 다른 차수의 다항식을 맞추면 모델의 거동 변화를 볼 수 있습니다.

import numpy as np

# Data
np.random.seed(7)
X = np.linspace(0, 1, 30)
y_true = np.sin(2 * np.pi * X)
y = y_true + np.random.normal(0, 0.2, X.shape)

# Fit polynomials of three degrees
X_smooth = np.linspace(0, 1, 300)
degrees = [1, 3, 15]

for degree in degrees:
    coefs = np.polyfit(X, y, deg=degree)
    y_pred = np.polyval(coefs, X_smooth)

Polynomial regression example

다항 회귀 예시

1차는 직선으로, 과소적합합니다. 곡선을 전혀 따라가지 못합니다. 3차는 실제 형태를 표현합니다. 일부 잡음을 흡수하지만 진실에 가깝게 유지됩니다. 15차는 모든 훈련점을 통과하려고 구불구불하게 맞추며, 점들 사이에서 큰 진동을 일으키는 과적합입니다.

깊이가 다른 결정 트리

결정 트리도 같은 이야기가 반복됩니다. 동일한 데이터로 깊이를 늘려가며 트리를 학습시키고, 훈련/테스트 양쪽의 오류를 측정할 수 있습니다.

import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# Data
np.random.seed(11)
X = np.linspace(0, 10, 250).reshape(-1, 1)
y = np.sin(X).ravel() + np.random.normal(0, 0.3, 250)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0
)

depths = range(1, 21)
train_errors = []
test_errors = []

for depth in depths:
    tree = DecisionTreeRegressor(max_depth=depth, random_state=0)
    tree.fit(X_train, y_train)
    train_errors.append(mean_squared_error(y_train, tree.predict(X_train)))
    test_errors.append(mean_squared_error(y_test, tree.predict(X_test)))

Decision tree example

결정 트리 예시

트리가 깊어질수록 훈련 오류는 감소해, 각 잎이 단일 훈련점만 담으면 결국 0에 가까워집니다. 테스트 오류는 트리가 데이터의 실제 관계를 포착하는 초기에는 떨어지다가, 더 깊은 분할이 잡음을 맞추기 시작하면 다시 올라갑니다. 최소 지점이 두 가지를 균형 있게 맞춘 깊이입니다.

모델 성능 진단 시 흔한 실수

옳은 지표를 선택했더라도 잘못된 결론을 내리기 쉽습니다. 모델 성능을 평가할 때 해서는 안 될 일은 다음과 같습니다.

  • 훈련 정확도만 평가: 훈련 정확도는 모델이 이미 본 데이터를 얼마나 잘 맞추는지 알려줍니다. 새 입력에서의 성능은 알려주지 않습니다. 결론을 내리기 전, 반드시 별도의 세트에서 측정하세요.
  • 검증 데이터를 무시: 검증 데이터는 아키텍처, 하이퍼파라미터, 중지 시점 같은 선택을 조율하는 데 사용합니다. 훈련 세트뿐 아니라, 너무 여러 번 사용한 테스트 세트에도 과적합합니다.
  • 복잡할수록 더 좋다고 가정: 더 큰 모델이 곧 더 유능한 모델을 의미하지는 않습니다. 데이터가 작거나 관계가 단순하면 복잡성은 성능만 떨어뜨립니다. 단순하게 시작하고, 진단 결과가 필요할 때만 용량을 늘리세요.
  • 잡음을 신호로 착각: 훈련 데이터의 모든 패턴이 학습 가치가 있는 것은 아닙니다. 랜덤 변동, 표본 추출 편향, 이상치, 수집 아티팩트는 유연한 모델에 그럴듯해 보일 수 있습니다. 관계가 존재해야 하는 이유를 설명할 수 없다면, 신중히 다루세요.

모델을 결정하기 전에는 항상 위 네 가지를 점검하세요. 대부분의 운영 실패는 이들 중 하나(또는 그 이상)와 관련이 있습니다.

결론

과소적합과 과적합은 모델이 일반화에 실패하는 두 가지 방식입니다. 하나는 패턴을 학습하기엔 너무 단순하고, 다른 하나는 데이터셋의 모든 점을 외우려 듭니다.

훈련의 실제 목표는 그 사이 어딘가, 바이어스와 분산이 균형을 이루고 총 오류가 최소인 지점에 도달하는 것입니다.

검증 성능이 현재 위치를 알려주는 지표입니다. 훈련 중 이를 추적하고, 훈련과 검증 오류의 차이가 의사결정을 이끌도록 하세요. 훈련 오류는 계속 떨어지는데 검증 오류가 더 이상 개선되지 않거나 상승하면 최적점을 지나친 것입니다. 둘 다 높게 유지되면 아직 도달하지 못한 것입니다.

2026년에 대비해 더 고급 데이터 사이언스 개념을 배우고 실무 역량을 갖추고 싶으신가요? 기본부터 MLOps까지 이어지는 Machine Learning Engineer 트랙에 등록해 보세요.

FAQs

과적합과 과소적합의 차이는 무엇인가요?

과소적합은 모델이 데이터의 패턴을 표현하기에 너무 단순해 훈련과 테스트 모두에서 성능이 낮을 때 발생합니다. 과적합은 반대로, 모델이 잡음까지 포함해 훈련 데이터를 지나치게 잘 학습해 훈련에서는 좋지만 새로운 데이터에서는 실패하는 경우입니다. 둘 다 예측력이 약하지만, 이유가 다릅니다.

내 모델이 과적합인지 과소적합인지 어떻게 알 수 있나요?

훈련 오류와 테스트 오류를 비교하세요. 둘 다 높다면 과소적합입니다. 훈련 오류는 매우 낮지만 테스트 오류가 높다면 과적합입니다. 러닝 커브도 도움이 됩니다. 과적합 모델에서는 훈련과 검증 오류가 벌어지고, 과소적합 모델에서는 높은 오류 수준에서 평평하게 유지됩니다.

바이어스-분산 트레이드오프란 무엇인가요?

바이어스는 모델이 너무 단순해서 생기는 오류이고, 분산은 모델이 훈련 데이터에 너무 민감해서 생기는 오류입니다. 하나를 줄이면 보통 다른 하나가 늘어나므로, 총 오류가 최소가 되는 균형점을 찾는 것이 목표입니다. 균형이 잘 맞는 모델일수록 새로운 데이터에 잘 일반화합니다.

데이터를 더 수집하면 과적합이 해결되나요?

보통 도움이 되지만, 만능 해결책은 아닙니다. 데이터가 많아지면 모델이 암기하기 어려워져 전체에 걸쳐 유지되는 패턴을 찾아야 합니다. 하지만 문제가 단순한데 모델이 지나치게 복잡하거나, 특성에 잡음이 대부분이면 데이터만 늘려서는 충분히 해결되지 않습니다. 그럴 때는 정규화나 더 단순한 모델이 더 효과적입니다.

신경망에서 과적합을 방지하려고 조기 종료를 사용할 수 있나요?

네, 그리고 가장 쉽게 도입할 수 있는 방법 중 하나입니다. 훈련 중 검증 오류를 관찰하다가, 평탄해지거나 상승하기 시작하면 멈추세요. 이는 모델이 실제 패턴을 학습하고 잡음을 맞추기 시작하는 지점을 포착합니다. 대부분의 딥러닝 프레임워크에는 조기 종료 콜백이 내장되어 있습니다.

주제

DataCamp와 함께 배우세요

courses

Python으로 배우는 Machine Learning 특성 공학

4
38.8K
머신러닝 모델의 성능을 향상시키기 위한 새로운 기능을 생성하십시오.
자세히 보기Right Arrow
강좌 시작
더 보기Right Arrow