알파카징징이 알파카징징이 코딩하는 알파카

혼공머_3_3 특성 공학과 규제

» writing

혼자공부하는머신러닝+딥러닝 수업을 참고하여 작성하였습니다

3_3_특성 공학과 규제

정의


특성 공학과 규제

1. 다중회귀(Multiple regression)
: 여러 개의 특서을 사용한 선형 회귀
- 특성 공학 : 기존의 특성을 사용해 새로운 특성을 뽑아내는 작업

2. 데이터 준비
- 판다스 pandas : 데이터 분석 라이브러리
- 데이터 프레임 DataFrame : 판다스의 핵심 데이터 구조
- csv : 콤바로 나누어져 있는 텍스트 파일
import pandas as pd
df = pd.read_csv("https://bit.ly/perch_csv")

perch_full = df.to_numpy()
print(perch_full)

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)
3. 사이킷런의 변환기
- fit() : 새롭게 만들 특성 조합 찾기
- transform() : 실제로 데이터 변환
- 무게 = a * 길이 + b * 높이 + c * 두께 + d * 1
- 특성 (길이, 콮이, 두께, 1)
- include_bias = False : 절편을 위한 항 제거
from sklearn.preprocessing import PolynomialFeatures

#degree = 2
poly = PolynomialFeatures()
poly.fit([[2,3]])

# 1 (bias), 2, 3 , 2**2, 2*3, 3**2
print(poly.transform([[2,3]]))
# [[1. 2. 3. 4. 6. 9.]]

poly = PolynomialFeatures(include_bias=False)
poly.fit(train_input)
train_poly = poly.transform(train_input)
print(train_poly.shape)
# (42, 9)

poly.get_feature_names() # 9개의특성이 어떻게 만들어졌는지 확인
# ['x0', 'x1', 'x2', 'x0^2', 'x0 x1', 'x0 x2', 'x1^2', 'x1 x2', 'x2^2']

test_poly = poly.transform(test_input)
4. 다중 회귀 모델 훈련하기
from sklearn.linear_model import LinearRegression

lr = LinearRegression()
lr.fit(train_poly, train_target)
# LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

print(lr.score(train_poly, train_target))
# 0.9903183436982124
print(lr.score(test_poly, test_target))
# 0.9714559911594132
5. 더 많은 특성 만들기
: 특성의 개수 늘리면 선형 모델은 매우 강력
: 샘플 개수보다 특성이 많다면! 완벽하게 학습 가능
: 훈련 세트에 대해 거의 완벽하게 훈련! (과대적합)
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)
# (42, 55)

lr.fit(train_poly, train_target)
print(lr.score(train_poly, train_target))
print(lr.score(test_poly, test_target))
# 0.9999999999991096
# -144.40579242335605
6. 규제 (Regularization)
: 머신러닝 모델이 훈련 세트를 너무 과도하게 학습하지 못하도록 훼방하는 것
: 모델이 훈련 세트에 과대적합되지 않도록 만들기
: 선형회귀 경우, 특성에 곱해지는 계수 (or 기울기)의 크기 작게 만들기
: 규제 전 먼저 정규화하기!!
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_poly)

train_scaled = ss.transform(train_poly)
test_scaled = ss.transform(test_poly)
6_1 릿지 회귀 (Ridge)
: 계수를 제곱한 값을 기준으로 규제 적용
: 가중치 ** 2
: L2 규제
: alpha 값이 크면 규제 강도가 세지므로 계수 값을 더 줄이고, 조금 더 과소적합되개 유도
: alpha 값 작으면 계수가 덜 줄어들고, 과대적합될 가능성이 된다
: 하이퍼파라미터(hyperparameter) 는 사람이 직접 지정하는 매개변수
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))

# 0.9896101671037343
# 0.9790693977615398
# 적절한 alpha 값 찾기

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^2')
plt.show()

적절한 alpha 값 찾기

# alpha = 0.1
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))

# 0.9903815817570366
# 0.9827976465386927
6_2 라쏘 회귀 (Lasso)
: 계수의 절대값을 기준으로 규제 적용
: L1
: alpha 로 규제강도 조절
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.9903815817570366
# 0.9827976465386927
# 적절한 alpha 찾기
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 : 
  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()

적절한 alpha 찾기

# alpha = 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))
# 라쏘는 계수 값을 아예 0 으로 만들 수 있다 (계수는 coef_)
print(np.sum(lasso.coef_ == 0))
#40

# --> 55개의 특성 중 40개의 유용한 특성을 골라내어 사용하였다