본문 바로가기

데이터/머신러닝

3.2 정규화

해당 글은 코드잇 강의를 참고하여 작성되었습니다.

- 편향과 분산

  • 편향이 높은 모델은 너무 간단해서 복잡한 곡선 관계를 학습 할 수 없다. 하지만 편향인 낮다고 해도 무조건 편향이 높은 모델보다 좋은 모델인 것은 아니다. test 데이터에서의 성능이 더 낮게 나타날 수도 있기 때문이다
  • 분산 : 데이터 셋 별로 모델이 얼마나 일관된 성능을 보여주는지를 의미한다.
  • 즉 편향이 낮다고 해도 분산이 클 수 있다.
  • 편향-분산 트레이드오프 : 일반적으로 편향이 높으면 분산이 낮다.

 

- scikit-learn으로 과적합 문제 직접 보기

 

- 정규화 : 모델을 학습시킬 때 값들이 너무 커지는 것을 방지한다. (손실함수+정규화 항)

λ에 따라 오차를 줄일지 θ를 줄일지 결정

 

- L1(Lasso), L2(Ridge) 정규화

예시)

from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import PolynomialFeatures
from math import sqrt

import numpy as np
import pandas as pd

INSURANCE_FILE_PATH = './datasets/insurance.csv'

insurance_df = pd.read_csv(INSURANCE_FILE_PATH)
insurance_df = pd.get_dummies(data=insurance_df, columns=['sex', 'smoker', 'region'])

# 기존 데이터에서 입력 변수 데이터를 따로 저장한다
X = insurance_df.drop(['charges'], axis=1)

polynomial_transformer = PolynomialFeatures(4)  # 4 차항 변형기를 정의한다
polynomial_features = polynomial_transformer.fit_transform(X.values)  # 데이터 6차 항 변수로 바꿔준다

features = polynomial_transformer.get_feature_names(X.columns)  # 변수 이름들도 바꿔준다

# 새롭게 만든 다항 입력 변수를 dataframe으로 만들어 준다
X = pd.DataFrame(polynomial_features, columns=features)
y = insurance_df[['charges']]

x_train,x_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=5)
model=Ridge(alpha=0.01, max_iter=2000, normalize=True)
model.fit(x_train, y_train)
y_train_predict=model.predict(x_train)
y_test_predict=model.predict(x_test)
# 체점용 코드
mse = mean_squared_error(y_train, y_train_predict)

print("training set에서 성능")
print("-----------------------")
print(f'오차: {sqrt(mse)}')

mse = mean_squared_error(y_test, y_test_predict)

print("testing set에서 성능")
print("-----------------------")
print(f'오차: {sqrt(mse)}')

**L1 정규화를 하면 절댓값을 사용하여 θ가 0이 되는 경우가 발생하기 때문에 속성을 줄이고 싶을 때 사용한다.