Post

학습 및 모델 최적화

머신러닝 훈련 데이터의 질, 샘플링 문제, 과대적합/과소적합, 모델 검증

Summarization

  • 머신러닝 모델의 성능은 알고리즘만큼이나 데이터의 품질(Quality)샘플링 전략에 크게 의존함.
  • 모델의 복잡도와 데이터 크기 사이의 균형을 맞추지 못하면 과대적합(Overfitting) 또는 과소적합(Underfitting) 문제가 발생함.
  • 이를 해결하기 위해 규제(Regularization), 검증 세트(Validation Set) 구성, 교차 검증(Cross-Validation) 등의 최적화 기법을 사용함.

학습 데이터

단순히 데이터를 넣는다고 학습이 되는 것이 아님. “Garbage In, Garbage Out” 원칙에 따라 데이터의 결함을 파악하는 것이 선행되어야 함.

충분하지 않은 훈련 데이터량

  • 대부분의 머신러닝 알고리즘이 잘 작동하려면 수천 개에서 수백만 개의 샘플이 필요함.
  • 데이터가 적으면 모델이 통계적 노이즈를 패턴으로 오인할 확률이 높음.

    대표성 없는 훈련 데이터 (Sampling Bias)

  • 일반화가 잘 되려면 새로운 사례를 잘 대표하는 데이터가 필요함.
  • 샘플링 잡음(Sampling Noise): 샘플이 너무 작아 우연에 의한 왜곡이 발생.
  • 샘플링 편향(Sampling Bias): 추출 방법 자체가 잘못되어 특정 집단이 배제됨. (예: 1936년 미국 대선 당시 전화 보유자에게만 여론조사를 실시해 예측 실패한 사례)

    낮은 품질의 데이터 및 특성 공학

  • 데이터 정제: 이상치(Outlier)를 제거하거나 결측치(Missing Value)를 채우는 과정이 필수적임.
  • 특성 선택(Feature Selection): 가지고 있는 특성 중 가장 유용한 것을 선택.
  • 특성 추출(Feature Extraction): 특성을 결합하여 새로운 유용한 특성을 만듦 (예: 차원 축소 - PCA).

모델의 일반화: Overfitting vs Underfitting

모델이 훈련 데이터에는 잘 맞지만 새로운 데이터에서 성능이 낮은 경우를 해결하는 것이 핵심임.

과대적합 (Overfitting)

훈련 데이터의 디테일과 노이즈까지 학습하여 일반화 성능이 떨어지는 상태.

  • 주요 원인: 데이터 양에 비해 모델이 너무 복잡함 (High Variance).
  • 해결책:
    • 훈련 데이터를 더 많이 수집.
    • 모델 파라미터 수를 줄이거나 제약(규제)을 가함.
    • 훈련 데이터의 노이즈 정제 (오류 수정 및 이상치 제거).

      과소적합 (Underfitting)

      모델이 너무 단순해서 데이터의 내재된 구조를 학습하지 못하는 상태.

  • 주요 원인: 모델이 너무 단순함 (High Bias).
  • 해결책:
    • 더 강력한 모델(파라미터가 많은 모델) 선택.
    • 더 좋은 특성을 찾아서 추가 (Feature Engineering).
    • 모델의 제약(규제 강도)을 줄임.

평가 및 검증 (Testing and Validating)

모델이 실전에 투입되었을 때의 성능을 예측하기 위해 데이터를 분할 관리함.

훈련/테스트 세트 (Train/Test Split)

  • 보통 8:2 또는 7:3 비율로 분할.
  • 테스트 세트에서 발생하는 에러율을 일반화 오차(Generalization Error)라고 함.

검증 세트와 하이퍼파라미터 튜닝

  • 하이퍼파라미터를 테스트 세트로 튜닝하면, 모델이 테스트 세트에 과적합되어 실제 서비스 시 성능이 떨어지는 데이터 스누핑(Data Snooping) 문제가 발생함.
  • 따라서 훈련 세트 -> 검증 세트(성능 평가) -> 테스트 세트(최종 확인)의 3단계 절차가 표준임.

교차 검증 (K-Fold Cross-Validation)

데이터가 부족하여 검증 세트를 크게 잡기 어려울 때 사용.


모델 복잡도 시각화

다항 회귀(Polynomial Regression)의 차수(Degree)를 조절하며 최적의 모델을 찾는 과정을 시각화 함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score

# 1. 비선형 샘플 데이터 생성
def true_fun(X):
    return np.cos(1.5 * np.pi * X)

np.random.seed(0)
n_samples = 30
X = np.sort(np.random.rand(n_samples))
y = true_fun(X) + np.random.randn(n_samples) * 0.1

# 2. 모델 비교 (Underfitting, Good Fit, Overfitting)
degrees = [1, 4, 15]
plt.figure(figsize=(14, 5))

for i, degree in enumerate(degrees):
    ax = plt.subplot(1, len(degrees), i + 1)
    plt.setp(ax, xticks=(), yticks=())

    poly_features = PolynomialFeatures(degree=degree, include_bias=False)
    lr = LinearRegression()
    pipeline = Pipeline([("poly", poly_features), ("lr", lr)])
    pipeline.fit(X[:, np.newaxis], y)

    # 교차 검증 점수 (MSE)
    scores = cross_val_score(pipeline, X[:, np.newaxis], y, 
                             scoring="neg_mean_squared_error", cv=10)

    X_test = np.linspace(0, 1, 100)
    plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Model")
    plt.plot(X_test, true_fun(X_test), label="True function", linestyle="--")
    plt.scatter(X, y, edgecolor='b', s=20, label="Samples")
    plt.title(f"Degree {degree}\nMSE: {-scores.mean():.2e}")
    plt.legend(loc="best")

plt.show()

Figure1

  • Degree 1,4,15 순으로 과소적합, 최적 모델, 과대 적합의 학습 양상을 보임.
  • 복잡도는 왼쪽에서 오른쪽으로 가면서 높아지고 MSE 값은 높음, 낮음, 매우 높음을 상대적으로 보임.
  • 결과적으로 머신러닝 모델의 최적화의 목표는 편향과 분산 사이의 trade-off를 잘 조절하여, 훈련 세트 뿐 아니라 보지 못한 데이터에서도 잘 작동하는 모델을 만든는 것임.
This post is licensed under CC BY 4.0 by the author.