티스토리 뷰

#다중회귀, 길이,높이,두께 데이터를 모두 사용함.
#판다스로 csv파일 가져오기
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/rickiepark/hg-mldl/master/perch_full.csv')
perch_full = df.to_numpy()
print(perch_full)

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures  #특성을 제곱한 항을 추가하고 특성끼리 서로 곱한 항을 추가

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

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

#새로운 특성 만들기, 변환기
#poly = PolynomialFeatures(include_bias = False)로 1 추가 안되게 함
poly = PolynomialFeatures()
poly.fit([[2,3]]) #새롭게 만들 특성 조합을 찾는다.
print(poly.transform([[2,3]]))  #실제로 데이터를 변환,2^2, 3^2, 2*3을 추가, 1은 자동으로 추가
#poly.fit_transform([[2,3]])

#다중 회귀 모델 훈련

poly = PolynomialFeatures(include_bias = False)
poly.fit(train_input)
train_poly = poly.transform(train_input)
print(train_poly.shape)
poly.get_feature_names_out()  #x0은 첫번째 특성, x0^2는 첫번째 특성의 제곱, x0 x1은 첫번째 특성과 두번째 특성의 곱

test_poly = poly.transform(test_input)

from sklearn.linear_model import LinearRegression

#다중 회귀 모델 훈련
lr = LinearRegression()
lr.fit(train_poly, train_target)
print(lr.score(train_poly, train_target)) #0.9903183436982124
print(lr.score(test_poly,test_target))    #0.9714559911594134

#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) #55개의 특성 = 55개의 열
lr.fit(train_poly, train_target)
print(lr.score(train_poly,train_target))  #0.9999999999991097
print(lr.score(test_poly,test_target))    #-144.40579242684848, 너무 과대적합. -> 특성을 줄여야 한다.

#규제, 특성에 곱해지는 계수의 크기(기울기)를 작게 만든다.
#먼저 스케일을 정규화 한다.
#모델에 규제를 추가한 모델을 릿지와 라쏘라고 한다.
#릿지는계수를 제곱한 값을 기준으로 규제를 적용
#라쏘는 계수의 절댓값을 기준으로 규제를 적용, 0으로 만들 수 있음
#alpha 매개변수로 규제의 강도를 조절
#적절한 alpha 값을 찾는 방법은 alpha 값에 대한 R^2값을 그래프로 그려보는 것 -> 훈련 세트와 테스트 세트의 점수가 가장 가까운 지점

from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge

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

ridge = Ridge()
ridge.fit(train_scaled, train_target)
print(ridge.score(train_scaled, train_target))  #0.9896101671037343
print(ridge.score(test_scaled, test_target))    #0.9790693977615391

#alpha 값 변경해보기
#alpha 값이 0.1일때 가장 높음
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()

ridge = Ridge(alpha = 0.1)
ridge.fit(train_scaled,train_target)
train_score.append(ridge.score(train_scaled, train_target))
test_score.append(ridge.score(test_scaled,test_target))

#라쏘 회귀
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))


alpha_list = [0.001,0.01,0.1,1,10,100]

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

lasso = Lasso(alpha = 10, 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))

print(lasso.score(train_scaled, train_target))
print(lasso.score(test_scaled, test_target))

#라쏘 모델이 사용한 특성을 제외한 수
print(np.sum(lasso.coef_ ==0))

'머신러닝 > 혼자공부하는머신러닝' 카테고리의 다른 글

확률적 경사 하강법  (0) 2022.09.06
proba, 로지스틱 회귀  (0) 2022.08.25
혼공머_3  (0) 2022.08.23
혼공머_2  (0) 2022.08.19
혼공머_1  (0) 2022.08.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함