다중회귀
여러개의 특성을 사용하는 회귀모델이다. 특성이 많을수록 선형 모델의 성능이 좋아진다.
특성 공학
주어진 특성을 조합해서 새로운 특성을 만드는 일련의 작업과정이다.
릿지
규제가 있는 선형 회귀 모델이다. 선형 모델의 계수를 작게 만들어 과대적합을 완화시킨다. 보통 릿자 규제를 많이 쓴다.
라쏘
릿지처럼 규제가 있는 선형 회귀모델이다. 릿지와 달리 계수를 0으로 만들 수도 있다.
하이퍼파라미터
머신러닝 알고리즘이 학습하지 않는 파라미터이다. (사전에 직접 설정해줘야함)
대표적으로 릿지와 라쏘의 규제강도 alpha 파라미터이다.
read_csv()
csv파일을 판다스 데이터프레임으로 변환하는 함수이다.
PolynomialFeatures
주어진 특성을 조합하여 새로운 특성을 만든다.
Ridge
규제가 있는 회귀 알고리즘인 릿지 회귀 모델을 훈련한다.
매개변수 alpha로 강도를 조절하고 값이 클수록 규제가 세진다.(기본값=1)
매개변수 solver로 최적의 모델을 찾을 수 있다.(기본값=auto)
solver=sag,saga 이면 확률적 평균 경사 하강법 알고리즘을 쓴다.( 특성과 샘플 수가 많을 때 좋음)(이때, random_state도 설정할 수 있음)
Lasso
규제가 있는 회귀 알고리즘인 라쏘 회귀 모델을 훈련한다.
최적의 모델을 찾기 위해 좌표 하강법을 사용한다.
max_iter는 알고리즘의 수행반복횟수를 지정한다( 기본값=1000)
# 특성공학과 규제
import pandas as pd
df=pd.read_csv('https://bit.ly/perch_csv')
perch_full=df.to_numpy()
print(perch_full)
.to_numpy() 또는 .values 를 사용해서 DataFrame을 numpy배열로 변환할 수 있다.
import numpy as np
perch_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]
)
from sklearn.model_selection import train_test_split
train_input,test_input,train_target,test_target = train_test_split(perch_full,perch_weight,random_state=42)
from sklearn.preprocessing import PolynomialFeatures
poly=PolynomialFeatures(include_bias=False)
poly.fit(train_input)
train_poly=poly.transform(train_input)
print(train_poly.shape)
특성을 만들거나 전처리하기위해 필요한 클래스를 변환기라고 부름
변환기 메서드 : fit(),transform()
poly.transform([[2,3]]) = [[1. 2. 3. 4. 6. 9.]]
[절편 , 2 , 3 , 2^2, 2*3 , 3^2]
include_bias=False는 절편 무시( 사실 기본값도 False라서 지정안해줘도됨 )
print(train_poly.shape)
poly.get_feature_names()
test_poly=poly.transform(test_input)
from sklearn.linear_model import LinearRegression
lr=LinearRegression()
lr.fit(train_poly,train_target)
print(lr.score(test_poly,test_target))
print(lr.score(train_poly,train_target))
특성을 늘리니 과소적합 문제 해결!
poly=PolynomialFeatures(degree=5,include_bias=False)
poly.fit(train_input)
train_poly=poly.transform(train_input)
test_poly=poly.transform(test_input)
print(train_poly.shape)
lr.fit(train_poly,train_target)
print(lr.score(test_poly,test_target))
print(lr.score(train_poly,train_target))
degree 기본값은 2
특성의 개수를 데이터의 양에 비해 크게 설정을 한다면 과대적합됨
from sklearn.preprocessing import StandardScaler
ss=StandardScaler()
ss.fit(train_poly)
train_scaled=ss.transform(train_poly)
test_scaled=ss.transform(test_poly)
# 릿지 회귀
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))
과대적합 릿지모델로 해결
import matplotlib.pyplot as plt
train_score=[]
test_score=[]
alpha_list=[0.001,0.01,0.1,1,10,100]
for alpha in alpha_list:
ridge=Ridge(alpha=alpha)
ridge.fit(train_scaled,train_target)
train_score.append(ridge.score(train_scaled,train_target))
test_score.append(ridge.score(test_scaled,test_target))
plt.plot(np.log10(alpha_list),train_score)
plt.plot(np.log10(alpha_list),test_score)
plt.xlabel('alpha')
plt.ylabel('R^')
plt.show()
ridge=Ridge(alpha=0.1)
ridge.fit(train_scaled,train_target)
print(ridge.score(train_scaled,train_target))
print(ridge.score(test_scaled,test_target))
굿!!
# 라쏘 회귀
from sklearn.linear_model import Lasso
lasso=Lasso()
train_score=[]
test_score=[]
alpha_list=[0.001,0.01,0.1,1,10,1000]
for alpha in alpha_list:
lasso=Lasso(alpha=alpha,max_iter=30000)
lasso.fit(train_scaled,train_target)
train_score.append(lasso.score(train_scaled,train_target))
test_score.append(lasso.score(test_scaled,test_target))
plt.plot(np.log10(alpha_list),train_score)
plt.plot(np.log10(alpha_list),test_score)
plt.xlabel('alpha')
plt.ylabel('R^2')
plt.show()
lasso=Lasso(alpha=10)
lasso.fit(train_scaled,train_target)
print(lasso.score(train_scaled,train_target))
print(lasso.score(test_scaled,test_target))
good!!
참고문헌:혼공머신