여러가지공부/머신러닝(Machine Learning)

[머신러닝] 편형(Bias)와 분산(Variance)란? 파이썬 예제 코드로 이해하기(Trade off)

끄적끄적아무거나 2023. 3. 31. 08:00
반응형

 

 

 

 

 

[머신러닝] 편형(Bias)와 분산(Variance)란?

 

머신러닝에서 편향(bias)과 분산(variance)은 모델의 성능과 일반화 능력에 영향을 주는 두 가지 주요 요소입니다. 이 두 가지는 모델의 예측 오차를 계산하는 데사용 합니다.

 

 

수식1

 

**바는 평균을 의미 하고 삿갓은 추정값을 의미합니다.

 

 

 

1. 편향(bias) : 편향은 모델이 실제 데이터와 얼마나 차이가 있는지를 나타내는 척도입니다. 높은 편향을 가진 모델은 학습 데이터에 대해서도 부정확한 예측을 하는 경향이 있습니다. 이는 모델이 너무 단순하거나, 데이터의 복잡한 패턴을 충분히 학습하지 못한 경우 발생합니다. 이를 과소적합(underfitting)이라고도 합니다.

 

 

2. 분산(variance) : 분산은 모델이 학습 데이터의 작은 변화에 얼마나 민감하게 반응하는지를 나타내는 척도입니다. 높은 분산을 가진 모델은 학습 데이터의 노이즈까지 포함하여 과도하게 학습하는 경향이 있습니다. 이는 모델이 너무 복잡하거나, 학습 데이터의 특성에 지나치게 의존한 경우 발생합니다. 이를 과대적합(overfitting)이라고도 합니다.

 

 

앞서 포스트에서 과적합에 대해 알아보았습니다. 링크를 통해 참조하시길 바랍니다(https://scribblinganything.tistory.com/696).

 

 

편향과 분산 사이에는 일종의 트레이드오프(trade-off) 관계가 있습니다. 즉, 편향을 줄이면 분산이 증가하고, 분산을 줄이면 편향이 증가하는 경향이 있습니다. 머신러닝에서 목표는 편향과 분산을 모두 낮추어 모델의 일반화 성능을 최적화하는 것입니다. 이를 위해 교차 검증, 모델 복잡도 조절, 정규화(regularization) 등 다양한 기법을 사용할 수 있습니다.

 

 

 

 

위 그림은 Variance와 Bias를 잘 표현 그림입니다. 전체의 평균이 중심에 가까우면 Low Bias가 되고 퍼짐 정도가 적으면 Low Variance가 됩니다. 

 

 

출처 : wiki

 

위 그림은 Model Complexity가 x축 값인데 Capacity를 사용해서 동일한 그래프를 나타내므로 용어는 다르지만 동일 그림을 참조로 설명하겠습니다. 

 

 

Variance와 Biass는 Capacity, 과적합(under fitting, over fitting)은 서로 연관된 수치 입니다. 용량이 커지면 bias는 감소하고 variance는 증가하는 특성을 가집니다. 

 

Optimal 선을 따라 왼쪽을 Underfitting, 오른쪽을 Overfitting이라고 합니다.

 

 

 

 

 

 

Python 예제 실습 :편형(Bias)와 분산(Variance)

 

 

예제 코드>>

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split

# 10차 다항식 데이터 생성
np.random.seed(0)
n_samples = 30
X = np.sort(np.random.rand(n_samples))
y = np.sin(2 * np.pi * X) + 0.1 * np.random.randn(n_samples)

# 학습 데이터셋과 테스트 데이터셋 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 모델의 Capacity에 따른 Variance와 Bias 계산
degrees = range(1, 15)
train_mse, test_mse = [], []
train_bias, test_bias = [], []
train_var, test_var = [], []

for degree in degrees:
    model = make_pipeline(PolynomialFeatures(degree), LinearRegression())
    model.fit(X_train.reshape(-1, 1), y_train)
    y_pred_train = model.predict(X_train.reshape(-1, 1))
    y_pred_test = model.predict(X_test.reshape(-1, 1))

    mse_train = mean_squared_error(y_train, y_pred_train)
    mse_test = mean_squared_error(y_test, y_pred_test)
    bias_train = np.mean((y_train - np.mean(y_pred_train)) ** 2)
    bias_test = np.mean((y_test - np.mean(y_pred_test)) ** 2)
    var_train = np.mean(np.var(y_pred_train))
    var_test = np.mean(np.var(y_pred_test))

    train_mse.append(mse_train)
    test_mse.append(mse_test)
    train_bias.append(bias_train)
    test_bias.append(bias_test)
    train_var.append(var_train)
    test_var.append(var_test)

# 그래프 그리기
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(degrees, train_bias, label="Training Bias", marker="o")
plt.plot(degrees, train_var, label="Training Variance", marker="o")
plt.plot(degrees, train_mse, label="Training MSE", marker="o")
plt.title("Capacity vs. Bias-Variance-MSE (Training)", fontsize=14)
plt.xlabel("Model Capacity (Degree)")
plt.ylabel("Score")
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(degrees, test_bias, label="Test Bias", marker="o")
plt.plot(degrees, test_var, label="Test Variance", marker="o")
plt.plot(degrees, test_mse, label="Test MSE", marker="o")
plt.title("Capacity vs. Bias-Variance-MSE (Test)", fontsize=14)
plt.xlabel("Model Capacity (Degree)")
plt.ylabel("Score")
plt.legend()

plt.tight_layout()
plt.show()

 

 

 

 

 

결과>>

 

 

 

 

예제 코드 다운로드>>

bias_variance.py
0.00MB

 

반응형