선형 회귀 모델의 과대적합(Overfitting)
과대적합(overfitting) : 모델이 지나치게 학습 샘플에 편향되어, 새로운 입력에 적절히 예측을 하지 못하는 문제
과소적합(underfitting) : 모델의 복잡도가 부족하여 학습 샘플의 입출력 관계를 충분히 설명하지 못하는 문제
다중 선형 회귀 모델의 과대적합
선형 회귀 모델은 기본적으로 모든 특징이 타겟과 선형 관계에 있다고 가정하기 때문에 과대적합이 발생하는 경향이 있습니다. 과대적합의 해결 방법으로는 과도한 선형 관계에 대한 가정을 억제하면 과대적합을 방지하는 효과가 있습니다.
다중 선형 회귀 모델의 과대적합의 예시
두 변수에 대한 다중 선형 회귀 모델의 학습 결과 x1 변수는 y 변수와 선형적인 관계가 거의 없음에도 불구하고, 모든 입력 변수가 출력 변수와 선형적인 관계를 가지고 있다는 가정을 하고 있기 때문에 불필요한 기울기가 발생하게 됩니다.
규제(Regularization)
머신 러닝 모델의 과대적합을 방지하는 방법 중 하나입니다. 손실 함수에 복잡도에 대한 페널티를 부여하는 방법입니다. 손실 함수는 모델에서 최소화하고자 하는 대상입니다. 규제 선형 회귀 모델에서는 손실 함수는 오차의 제곱합을 그대로 사용합니다.
릿지 회귀(Ridge Regression)
가중치의 L2 노름(Norm)을 규제항으로 사용합니다. L2 노름은 모든 가중치를 제곱하여 합한 결과입니다. 편향(w0)은 모델의 복잡도와 무관하므로, 규제 대상에서 제외됩니다. 릿지 회귀의 특징으로는 규제 매개변수를 크게 해도 가중치의 값이 0이 되지는 않습니다.
LASSO
가중치의 L1 노름을 규제항으로 사용하는 방법입니다. L1 노름은 모든 가중치의 절댓값을 합한 결과입니다. LASSO의 특징으로는 규제 매개변수를 크게 하면 일부 가중치의 값이 0이 됩니다. 중요도가 낮은 특징을 제외하고자 할 때 사용합니다.
엘라스틱 넷(Elastic Net)
가중치의 L1노름과 L2 노름을 모두 규제항으로 사용합니다. 릿지 회귀와 LASSO 사이의 절충 방식입니다. 엘라스틱 넷의 특징은 LASSO와 같이 희소성을 가지지만, M>N일 경우 L2 규제에 의해 보다 많은 특성을 선택합니다. L1규제와 L2 규제에 별도의 규제 매개변수를 사용합니다.
규제 선형 회귀의 구현
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
np. random.seed(101) # 랜덤 시드 고정
x = np.random.randn(50,2) # 정규 분포 랜덤 데이터 생성
y = np.random.randn(50) # 정규 분포 랜덤 데이터 생성
X,Y = np.meshgrid(x,y) #메쉬 그리드 생성
Z = 1.3 * X + 0.1 * Y + np.random.randn(*X.shape) # 임의의 Z값 생성
X_train, X_test, y_train, y_test = train_test_split(x,y,test_size=0.3)
lr = LinearRegression()
lr.fit(X_train,y_train)
ridge = Ridge(alpha=1.0)
ridge.fit(X_train,y_train)
lasso = Lasso(alpha=1.0)
lasso.fit(X_train,y_train)
elastic=ElasticNet(alpha=1.0, l1_ratio=0.5)
elastic.fit(X_train,y_train)
pred_lr = lr.predict(X_test)
pred_ridge = ridge.predict(X_test)
pred_lasso = lasso.predict(X_test)
pred_elastic = elastic.predict(X_test)
print('Linear Regression RMSE :',np.sqrt(mean_squared_error(y_test,pred_lr)))
print('Ridge Regression RMSE :', np.sqrt(mean_squared_error(y_test,pred_ridge)))
print('LASSO RMSE :', np.sqrt(mean_squared_error(y_test,pred_lasso)))
print('Elastic Net RMSE : ', np.sqrt(mean_squared_error(y_test,pred_elastic)))
'머신러닝' 카테고리의 다른 글
지도학습 모델 - k최근접 이웃 (0) | 2022.08.19 |
---|---|
회귀 모델 - 로지스틱 회귀 모델 (0) | 2022.08.19 |
머신 러닝 - 회귀 분석 (0) | 2022.08.19 |
머신 러닝 프로세스 (0) | 2022.08.18 |
인공지능, 머신러닝, 딥러닝이란 (0) | 2022.08.18 |
댓글