move84

머신러닝 모델 복잡도(Model Complexity)의 의미 본문

머신러닝

머신러닝 모델 복잡도(Model Complexity)의 의미

move84 2025. 4. 16. 07:13
반응형

머신러닝 모델을 선택하고 훈련할 때 모델 복잡도는 중요한 고려 사항이다. 모델이 너무 단순하면 데이터의 기본적인 패턴만 학습하여 과소적합(underfitting)될 수 있고, 반대로 모델이 너무 복잡하면 데이터의 노이즈까지 학습하여 과적합(overfitting)될 수 있다. 이 글에서는 모델 복잡도의 의미와 그것이 머신러닝 모델의 성능에 미치는 영향에 대해 자세히 알아본다.


🤔 모델 복잡도란?
모델 복잡도는 모델이 얼마나 다양한 패턴을 학습할 수 있는지를 나타내는 지표이다. 복잡한 모델은 더 많은 파라미터를 가지고 있으며, 따라서 더 복잡한 함수를 표현할 수 있다. 예를 들어, 고차 다항 회귀 모델은 저차 다항 회귀 모델보다 더 복잡하다. 신경망에서는 레이어의 수와 각 레이어의 노드 수가 모델의 복잡도를 결정하는 주요 요인이다.


📈 과소적합 (Underfitting)
과소적합은 모델이 훈련 데이터를 충분히 학습하지 못했을 때 발생한다. 이는 모델이 너무 단순하거나, 훈련 데이터가 부족하거나, 특성(feature)이 적절하지 않을 때 나타날 수 있다. 과소적합된 모델은 훈련 데이터와 테스트 데이터 모두에서 낮은 성능을 보인다.
예를 들어, 선형 회귀 모델로 비선형 데이터를 예측하려고 할 때 과소적합이 발생할 수 있다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 비선형 데이터 생성
X = np.linspace(-5, 5, 100).reshape(-1, 1)
y = X**2 + np.random.normal(0, 5, 100).reshape(-1, 1)

# 선형 회귀 모델 훈련
model = LinearRegression()
model.fit(X, y)

# 예측
y_pred = model.predict(X)

# 시각화
plt.scatter(X, y, label='Data')
plt.plot(X, y_pred, color='red', label='Linear Regression')
plt.legend()
plt.show()

위 코드에서 선형 회귀 모델은 이차 함수 형태의 데이터를 제대로 표현하지 못한다.


📉 과적합 (Overfitting)
과적합은 모델이 훈련 데이터의 노이즈까지 학습했을 때 발생한다. 이는 모델이 너무 복잡하거나, 훈련 데이터가 너무 적을 때 나타날 수 있다. 과적합된 모델은 훈련 데이터에서는 높은 성능을 보이지만, 테스트 데이터에서는 낮은 성능을 보인다.
예를 들어, 매우 높은 차수의 다항 회귀 모델을 사용하여 적은 수의 데이터를 학습할 때 과적합이 발생할 수 있다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline

# 데이터 생성
X = np.linspace(-3, 3, 10).reshape(-1, 1)
y = np.random.normal(0, 2, 10).reshape(-1, 1) + X**2

# 10차 다항 회귀 모델 훈련
poly_model = make_pipeline(PolynomialFeatures(degree=9), LinearRegression())
poly_model.fit(X, y)

# 예측
X_test = np.linspace(-5, 5, 100).reshape(-1, 1)
y_pred = poly_model.predict(X_test)

# 시각화
plt.scatter(X, y, label='Data')
plt.plot(X_test, y_pred, color='red', label='Polynomial Regression (Degree 9)')
plt.xlim(-5, 5)
plt.ylim(-5, 20)
plt.legend()
plt.show()

위 코드에서 9차 다항 회귀 모델은 훈련 데이터에 과도하게 적합되어 새로운 데이터에 대한 예측 성능이 낮아질 수 있다.


🎯 적절한 모델 복잡도 선택
모델의 복잡도를 적절하게 선택하는 것은 머신러닝 모델의 성능을 최적화하는 데 중요하다. 다음은 모델 복잡도를 선택하는 데 도움이 되는 몇 가지 방법이다.

  1. 교차 검증 (Cross-Validation): 데이터를 여러 개의 폴드(fold)로 나누어 훈련 및 검증을 반복하여 모델의 성능을 평가한다. 이를 통해 과적합을 방지하고 일반화 성능을 높일 수 있다.
  2. 규제 (Regularization): 모델의 복잡도에 페널티를 부과하여 과적합을 줄인다. L1 규제와 L2 규제가 대표적이다.
  3. 학습 곡선 (Learning Curve): 훈련 데이터 크기에 따른 모델의 성능 변화를 시각화하여 과적합 또는 과소적합 여부를 판단한다.
  4. AIC (Akaike Information Criterion) 및 BIC (Bayesian Information Criterion): 모델의 복잡도와 데이터 적합도를 고려하여 모델을 선택하는 기준을 제공한다.

🔑 규제 (Regularization)
규제는 모델의 복잡도를 제어하여 과적합을 방지하는 방법이다. L1 규제(Lasso)는 모델의 가중치(weight)의 절대값 합을 최소화하고, L2 규제(Ridge)는 가중치의 제곱합을 최소화한다. 이러한 규제는 모델이 불필요하게 큰 가중치를 갖지 않도록 하여 모델을 단순화한다.

from sklearn.linear_model import Ridge

# L2 규제를 사용한 Ridge 회귀 모델
ridge_model = Ridge(alpha=1.0)  # alpha는 규제 강도를 조절하는 파라미터
ridge_model.fit(X, y)

from sklearn.linear_model import Lasso

# L1 규제를 사용한 Lasso 회귀 모델
lasso_model = Lasso(alpha=0.1)  # alpha는 규제 강도를 조절하는 파라미터
lasso_model.fit(X, y)

위 코드에서 alpha 파라미터는 규제의 강도를 조절한다. alpha 값이 클수록 규제가 강해져 모델이 단순해진다.


📚 학습 곡선 (Learning Curve)
학습 곡선은 훈련 데이터 크기에 따른 모델의 성능 변화를 나타내는 그래프이다. 훈련 데이터와 검증 데이터에 대한 성능을 함께 표시하여 과적합 또는 과소적합 여부를 판단할 수 있다.

from sklearn.model_selection import learning_curve
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

# 데이터 생성
X = np.linspace(-5, 5, 100).reshape(-1, 1)
y = (X**2 + np.random.normal(0, 5, 100).reshape(-1, 1) > 10).astype(int).ravel()

# SVM 모델
model = SVC(kernel='rbf', gamma=0.1, C=1.0)

# 학습 곡선 계산
train_sizes, train_scores, test_scores = learning_curve(
    model, X, y, cv=5, scoring='accuracy', train_sizes=np.linspace(0.1, 1.0, 5))

# 평균 및 표준편차 계산
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)

# 학습 곡선 시각화
plt.plot(train_sizes, train_mean, label='Train')
plt.plot(train_sizes, test_mean, label='Validation')
plt.fill_between(train_sizes, train_mean - train_std, train_mean + train_std, alpha=0.2)
plt.fill_between(train_sizes, test_mean - test_std, test_mean + test_std, alpha=0.2)
plt.xlabel('Training Set Size')
plt.ylabel('Accuracy')
plt.legend()
plt.title('Learning Curve')
plt.show()

학습 곡선에서 훈련 데이터 성능이 높고 검증 데이터 성능이 낮으면 과적합을 의심할 수 있으며, 훈련 데이터와 검증 데이터 성능이 모두 낮으면 과소적합을 의심할 수 있다.


📝 모델 복잡도는 머신러닝 모델의 성능에 큰 영향을 미친다. 과소적합과 과적합을 피하고, 일반화 성능이 좋은 모델을 만들기 위해서는 적절한 모델 복잡도를 선택하는 것이 중요하다. 교차 검증, 규제, 학습 곡선 등을 활용하여 모델의 복잡도를 조절하고 최적의 성능을 얻을 수 있도록 노력해야 한다.


핵심 용어 정리

  • 모델 복잡도 (Model Complexity): 모델이 얼마나 다양한 패턴을 학습할 수 있는지 나타내는 지표 (index)
  • 과소적합 (Underfitting): 모델이 훈련 데이터를 충분히 학습하지 못한 상태 (state)
  • 과적합 (Overfitting): 모델이 훈련 데이터의 노이즈까지 학습한 상태 (state)
  • 교차 검증 (Cross-Validation): 데이터를 여러 개의 폴드로 나누어 훈련 및 검증을 반복하는 방법 (method)
  • 규제 (Regularization): 모델의 복잡도에 페널티를 부과하여 과적합을 줄이는 방법 (method)
  • 학습 곡선 (Learning Curve): 훈련 데이터 크기에 따른 모델의 성능 변화를 나타내는 그래프 (graph)
반응형