본문 바로가기
개발노트/머신러닝

[머신러닝] 특성공학과 규제 #3 규제가 필요한 이유, 릿지 라쏘 회귀

by 전지적진영시점 2023. 3. 22.
반응형

개발 환경

---------------------------------

OS : Mac

개발 툴 : colab 

개발 언어 : python

---------------------------------

 

 

https://jpointofviewntoe.tistory.com/146

 

[머신러닝] 특성공학과 규제 #1

개발 환경 --------------------------------- OS : Mac 개발 툴 : colab 개발 언어 : python --------------------------------- 특성 공학 기계 학습 및 패턴인식 분야에서 중요한 개념 중 하나로, 원시 데이터로부터 유용

jpointofviewntoe.tistory.com

 

https://jpointofviewntoe.tistory.com/147

 

[머신러닝] 특성공학과 규제 #2

개발 환경 --------------------------------- OS : Mac 개발 툴 : colab 개발 언어 : python --------------------------------- https://jpointofviewntoe.tistory.com/146 [머신러닝] 특성공학과 규제 #1 개발 환경 ---------------------------

jpointofviewntoe.tistory.com

 

<이전 소스>

 

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
df = pd.read_csv('https://bit.ly/perch_csv_data')
perch_full = df.to_numpy()

fish_weight = np.array([5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0, 110.0,
       115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0, 130.0,
       150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0, 197.0,
       218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0, 514.0,
       556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0, 820.0,
       850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0, 1000.0,
       1000.0])

train_input, test_input, train_target, test_target = train_test_split(perch_full, fish_weight, random_state=42)


from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(include_bias=False)

poly.fit(train_input)
train_poly = poly.transform(train_input)

test_poly = poly.transform(test_input)

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
ss.fit(train_poly)
train_scaled = ss.transform(train_poly)
test_scaled = ss.transform(test_poly)

 

 

---------------------------------------------------------------------------

규제가 필요한 경우

특성의 개수를 크게 늘리면 선형 모델은 아주 강력해집니다.

어떠한 이유로 모델을 학습할 때 특성을 많이 추가하게 될 경우 훈련 세트에 너무 과대적합되므로 테스트 세트에서 형편없는 점수를 만듭니다.

 

[예시]

 

PolinomialFeatures 클래스의 degree 매개변수를 사용하여 5제곱 특성을 만들겠습니다.

 

from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(degree = 5, include_bias=False)

poly.fit(train_input)
train_poly = poly.transform(train_input)

test_poly = poly.transform(test_input)

 

선형회귀 모델 객체를 생성하여 다시 훈련시키겠습니다.

 

from sklearn.linear_model import LinearRegression

lr = LinearRegression()

lr.fit(train_poly, train_target)
print(lr.score(train_poly, train_target))
print(lr.score(test_poly, test_target))

 

[출력결과]

훈련세트에는 완벽한 점수를 내지만 테스트 세트는 음수입니다.

훈련세트에 과대적합된 모델이라 볼 수 있습니다.

 

 

선형 회귀 모델에 규제를 추가한 모델을 릿지와 라쏘라고 부릅니다.

두 모델은 규제를 가하는 방법이 다릅니다. 릿지는 제곱한 값을 기준으로 규제를 적용하고,

라쏘는 계수의 절댓값을 기준으로 규제를 적용합니다.

 

릿지 회귀(ridge)와 라쏘(Lasso) 회귀

릿지 회귀(ridge)

이전 포스팅에서 준비한 train_scaled 데이터로 릿지 모델을 훈련하겠습니다.

 

from sklearn.linear_model import Ridge

ridge = Ridge()
ridge.fit(train_scaled, train_target)

 

모델에 훈련세트와 테스트 세트를 넣고 평가

 

print(ridge.score(train_scaled, train_target))
print(ridge.score(test_scaled, test_target))

 

[출력 결과]

 

 

테스트 점수가 정상적이고 많은 특성을 사용했음에도 불구하고 훈련세트에 과대적합되지 않은 것으로 보입니다.

 

라쏘 회귀(Lasso)

 

from sklearn.linear_model import Lasso

lasso = Lasso()
lasso.fit(train_scaled, train_target)

print(lasso.score(train_scaled, train_target))
print(lasso.score(test_scaled, test_target))

 

[출력 결과]

릿지 모델만큼이나 좋은 성능을 냅니다.

반응형

댓글