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)

[그림1] 판다스 이용 데이터 

  • 데이터는 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]]))

 

[그림2] 변환기 연산 

 

poly = PolynomialFeatures(include_bias=False) # 절편항 무시
poly.fit([[2,3]])
print(poly.transform([[2,3]]))

[그림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()

[그림4] 특성과 훈련

# 다중 회귀 모델 훈련
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train_poly, train_target)
print(lr.score(train_poly, train_target))

[그림5] 다중 회귀 모델 훈련

테스트 세트 점수

print(lr.score(test_poly, test_target))

[그림6] 테스트 세트 점수

 

특성의 개수 늘려서 해보기

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개

[그림7] 특성의 개수 늘리기

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

[그림8] 완벽한 점수

print(lr.score(test_poly, test_target)) # 음수가 나옴

[그림9] 테스트 점수

  • 특성의 개수를 크게 늘리면 선형 모델은 아주 강력해진다.
  • 훈련 세트는 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))

[그림10] 릿지 회귀

 

 

하이퍼파라미터

  • 머신러닝 모델이 학습할 수 없고 사람이 알려줘야 하는 파라미터를 하이퍼파라미터하고 부른다.
  • 사이킷런과 같은 머신러닝 라이브러리에서 하이퍼파라미터는 클래스와 메서드의 매개변수로 표현된다.
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()

[그림11] 릿지 회귀 결과

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))

[그림12] 릿지 회귀 최적

  • -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))

[그림13] 라쏘회귀 

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()

[그림14] 라쏘회귀 결과 

# 과대적합 , 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개

[그림15] 라쏘 모델 적합, 사용 특성 계수

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기