Skip to content

Latest commit

 

History

History
150 lines (108 loc) · 4.99 KB

feature-enginnering.md

File metadata and controls

150 lines (108 loc) · 4.99 KB

특성공학(Feature Engineering)을 이용한 농어 예측

Feature engineering is the process of using domain knowledge of the data to create features that make machine learning algorithms work (e.g., separating time from a date/time field, combining fields — height/weight). Feature engineering can improve model accuracy and speed up training.

Feature Engineering 상세코드에서는 농어의 무게를 예측하는 예제입니다.

  1. Polynomial Regression에서 이용한 데이터를 로드하고, train/test set을 분리합니다.
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)
  1. feature engineering을 통해 기존 특성에 새로운 특성을 추가합니다.
from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(degree=2, include_bias=False)  # default degree=2

poly.fit(train_input)

train_poly = poly.transform(train_input)
test_poly = poly.transform(test_input)
  1. StandardScaler을 이용하여 표준점수로 변환합니다.
from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
ss.fit(train_poly)

train_scaled = ss.transform(train_poly)
test_scaled = ss.transform(test_poly)
  1. 과대적합을 방지하기 위하여 규제(Reguarization)중에 Ridge를 적용합니다.

Ridge로 결정계수를 구하면 아래와 같습니다. Ridge는 계수를 제곱한 값을 기준으로 규제를 적용합니다.

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

이때 얻어진 결정계수는 linear regression보다 개선됩니다.

0.9857915060511934
0.9835057194929057

Ridge의 alpha를 이용하여 규제의 강도를 조절 할수 있습니다. alpha값이 크면 규제의 강도가 커지는데, 계수값을 더 줄이고 좀 더 과대적합을 해소할 수 있습니다.

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

이것을 그래프로 그려보면 아래와 같습니다.

import matplotlib.pyplot as plt

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

이때 결과는 아래와 같습니다.

image

  1. 과대적합을 방지하기 위하여 Lasso를 적용하여 Ridge와 비교해 봅니다. Lasso는 계수의 절대값을 기준으로 규제를 적용하는데, 계수를 0으로 만들 수도 있습니다.
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))

이때, 얻어진 결정계수는 아래와 같이 과대적합이 아닙니다.

0.986591255464559
0.9846056618190413

Ridge처럼 Rasso도 alpha로 규제의 강도를 조절할 수 있습니다.

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

import matplotlib.pyplot as plt
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()

이때 얻어진 결과는 아래와 같습니다.

image