728x90
반응형
다중 회귀(multiple regression)
- 여러 개의 특성을 사용한 선형 회귀
특성 공학(feature enginering)
- 기존의 특성을 사용해 새로운 특성을 뽑아내는 작업
데이터 준비
- 판다스(pandas) 이용
- 데이터 분석 라이브러리
- 데이터프레임(dataframe)은 판다스의 핵심 데이터 구조
- csv 파일 -> 판다스 데이터 프레임 -> 넘파이 배열
import pandas as pd
df = pd.read_csv('https://bit.ly/perch_csv')
perch_full = df.to_numpy()
print(perch_full)
- 데이터는 length, height, width
타깃 데이터
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]
)
훈련 세트와, 테스트 세트로 나누기
# perch_full, perch_weight를 훈련 세트와, 테스트 세트로 나눈다.
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)
사이킷런의 변환기
- 사이킷런은 특성을 만들거나 전처리하기 위한 다양한 클래스를 제공한다.
- 사이킷런에서 이런 클래스를 변환기(transform)이라고 부른다.
# 사이킷런의 변환기
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures()
poly.fit([[2, 3]])
print(poly.transform([[2,3]]))
poly = PolynomialFeatures(include_bias=False) # 절편항 무시
poly.fit([[2,3]])
print(poly.transform([[2,3]]))
poly = PolynomialFeatures(include_bias = False)
poly.fit(train_input)
train_poly = poly.transform(train_input)
print(train_poly.shape) # 42,9
# 9개의 특성이 어떻게 나왔는지 알아보기
# PolynomialFeatures() - get_feature_names()
poly.get_feature_names()
# 다중 회귀 모델 훈련
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))
특성의 개수 늘려서 해보기
poly = PolynomialFeatures(degree=5, include_bias=False) # 3제곱항, 4제곱항,5제곱항 넣기
poly.fit(train_input)
train_poly = poly.transform(train_input)
test_poly = poly.transform(test_input)
print(train_poly.shape)
print(test_poly.shape) # 특성 55개
lr.fit(train_poly, train_target)
print(lr.score(train_poly, train_target))
print(lr.score(test_poly, test_target)) # 음수가 나옴
- 특성의 개수를 크게 늘리면 선형 모델은 아주 강력해진다.
- 훈련 세트는 0.99999~ 로 완벽한 학습이지만, 훈련 세트에 너무 과대적합되므로 테스트 세트에서는 형편없는 점수를 만든다.
- 샘플의 개수보다 특성의 개수가 많게 훈련하면 훈련은 완벽해진다.
- 하지만 테스트, 실전에서 최악의 결과가 나올 수 있은니 주의
규제(regulariztion)
- 규제는 머신러닝 모델이 훈련 세트를 너무 과도하게 학습하지 못하도록 훼방하는 것을 말한다.
- 모델이 훈련 세트에 과대적합되지 않도록 만드는 것이다.
- 선형 회귀 모델의 경우 특성에 곱해지는 계수(또는 기울기)의 크기를 작게 만드는 일이다.
선형 회귀 모델에 규제를 추가한 모델을 릿지(ridge)와 라쏘(lasso)라고 부른다.
릿지
- 계수를 제곱한 값을 기준으로 규제를 적용한다.
라쏘
- 계수의 절댓값을 기준으로 규제를 적용한다.
릿지 회귀
# 릿지 화귀
from sklearn.linear_model import Ridge
ridge = Ridge()
ridge.fit(train_scaled, train_target)
print(ridge.score(train_scaled, train_target))
하이퍼파라미터
- 머신러닝 모델이 학습할 수 없고 사람이 알려줘야 하는 파라미터를 하이퍼파라미터하고 부른다.
- 사이킷런과 같은 머신러닝 라이브러리에서 하이퍼파라미터는 클래스와 메서드의 매개변수로 표현된다.
import matplotlib.pyplot as plt
train_score=[]
test_score = []
# alpha 값을 0.001에서 1사까지 100배씩 맞춰가며 훈련 모델 준비
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^2')
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))
- -1에서 최적의 값이 나왔으니 -1 = 10^-1 = 0.1이다.
라쏘 회귀
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))
train_score = []
test_score = []
alpha_list = [0.001, 0.01, 0.1, 1, 10, 100]
for alpha in alpha_list:
# 라쏘 모델 생성
lasso = Lasso(alpha=alpha, max_iter=10000)
# 라쏘 모델 훈련
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()
# 과대적합 , 1이 제일 적합 = 10^1 = 10
lasso = Lasso(alpha=10)
lasso.fit(train_scaled, train_target)
print(lasso.score(train_scaled, train_target))
print(lasso.score(test_scaled, test_target))
print("라쏘 모델의 계수 : ",np.sum(lasso.coef_ == 0)) # 55개의 특성중 라쏘 모델이 사용한 특성은 15개
728x90
반응형
최근댓글