티스토리 뷰
#다중회귀, 길이,높이,두께 데이터를 모두 사용함.
#판다스로 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
링크
TAG
- Ethernet
- automotive ethernet
- cuckoo
- HTML
- CAN-FD
- 차량용 이더넷
- SVM
- Python
- 단순선형회귀
- PCA
- 딥러닝
- 차량 네트워크
- 논문 잘 쓰는법
- json2html
- 케라스
- 회귀
- AVTP
- problem statement
- many-to-many
- 이상탐지
- one-to-many
- AVB
- 머신러닝
- 크로스 엔트로피
- AE
- 로지스틱회귀
- many-to-one
- automotive
- porks
- SOME/IP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함