본문 바로가기
개발노트/머신러닝

[머신러닝] 특성공학과 규제 #4 적절한 alpha 값 찾기

by 전지적진영시점 2023. 3. 23.
반응형

개발 환경

---------------------------------

OS : Mac

개발 툴 : colab 

개발 언어 : python

---------------------------------

 

<이전 소스>

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
df = pd.read_csv('https://bit.ly/perch_csv_data')
perch_full = df.to_numpy()

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

train_input, test_input, train_target, test_target = train_test_split(perch_full, fish_weight, random_state=42)


from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(degree = 5, include_bias=False)

poly.fit(train_input)
train_poly = poly.transform(train_input)

test_poly = poly.transform(test_input)

from sklearn.preprocessing import StandardScaler

ss = StandardScaler()
ss.fit(train_poly)
train_scaled = ss.transform(train_poly)
test_scaled = ss.transform(test_poly)

 

규제의 양 조절하기

릿지와 라쏘 모델을 사용할 때 규제의 양을 임의로 조절할 수 있습니다.

모댈 객체를 만들 때 alpha 매개변수로 규제의 강도를 조절합니다.

alpha 값이 크면 규제 강도가 세지므로 계수 값을 더 줄이고 조금 더 과소적합되도록 유도합니다.

alpha 값이 작으면 계수를 줄이는 역할이 줄어들고 선형 회귀모델과 유사해지므로 과대적합일 가능성이 큽니다.

 

alpha 값은 모델이 학습하는 값이 아닌 사전에 우리가 설정해줘야 하는 값입니다.
이렇게 머신러닝이 학습할 수 없고 사람이 알려줘야하는 값을 하이퍼파라미터 라고 합니다.

 

 

적절한 alpha 값 찾기

alpha 값에 대한 R제곱 값의 크래프를 그려보겠습니다.

 

  • alpha 값을 0.001부터 10배씩 늘려서 0.001, 0.01, 0.1, 1, 10, 100 원소가 들어있는 alpha_list 생성
from sklearn.linear_model import Lasso

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 값은 두 그래프가 가장 가깝고 테스트 세트의 점수가 가장 높은 값입니다.
  • 1이 되겠군요
  • 아까 np.log10으로 변환해줬으니 10 ^ 1 = 10 이 되겠습니다.

반응형

댓글