반응형
선형 모델 - Ridge 회귀
- 선형 모델 - 릿지 회귀
- 보스턴 주택 가격 데이터 셋을 사용한 릿지 회귀 성능 평가
- alpha 값에 따라 모델의 coef_ 속성이 어떻게 달라지는 지를 조사
- alpha 매개변수가 모델을 어떻게 변경시키는지 더 깊게 이해할 수 있음
- 높은 alpha 값은 제약이 많은 모델이므로 작은 alpha 값일 때보다 coef_의 절대값의 크기가 작을 것이라고 예상
- alpha 값에 따라 모델의 coef_ 속성이 어떻게 달라지는 지를 조사
- 보스턴 주택 가격 데이터 셋을 사용한 릿지 회귀 성능 평가
- 릿지(Ridge) 회귀
- 회귀를 위한 선형 모델이므로 최소 적합법에서 사용한 것과 같은 예측 함수를 사용
- 릿지 회귀에서의 가중치(w) 선택은 훈련 데이터를 잘 예측하기 위해서 뿐만 아니라 추가 제약 조건을 만족시키기 위한 목적도 있음 → 가중치의 절댓값을 가능한 한 작게 만드는 것
- w의 모든 원소가 0에 가깝게 되길 원함
- 모든 특성이 출력에 주는 영향을 최소한으로 만듬 (기울기를 작게 만듬) → 이런 제약을 규제(regularization)
- 규제(regularization)
- 중요한 feature 들의 특성을 골라서 (가중치) 학습 → 예측 선형 함수를 만듬
- 규제란 과대 적합이 되지 않도록 모델을 강제로 제한한다는 의미
- 릿지 회귀에 사용하는 규제 방식을 L2 규제라고 함
- 수학적으로 릿지는 계수의 L2 노름의 제곱을 패널티로 적용
- 릿지 회귀는 linear_model.Ridge에 구현
- 특정 feature에게만 가중치를 주고 나머지는 가중치를 약하게
** 규제 (regularization)
- L2 : 모든 feature 사용, 가중치를 강하게, 약하게 조절하는 방식(릿지 회귀에서 사용)
- L1 : 모든 feature를 사용하지 않고 관련 있는 feature만 골라서 가중치를 부여, 나머지 feature는 다 0으로
선형모델 - Lasso 회귀
- 라쏘 Lasso
- 선형 회귀에 규제를 적용하는 데 Ridge의 대안으로 Lasso 사용
- 릿지 회귀에서와 같이 라쏘도 계수를 0에 가깝게 만들려고 함
- 방식이 조금 다르며 이를 L1 규제 → L1 규제의 결과로 라쏘를 사용할 때 어떤 계수는 정말 0이 됨
- 모델에서 완전히 제외되는 특성이 생긴다는 뜻
- 라쏘 Lasso alpha 값이 다른 모델들의 계수 비교 그래프
- alpha 값이 다른 모델 (릿지, 라쏘) 들의 계수를 그래프로 표현하여 비교
단순 선형 회귀 모델을 이용한 자동차 연비(MPG) 예측
문제 정의 : 단순 회귀 모델을 사용하여 1970년대 후반과 1980년대 초반의 자동차 연비(MPG)를 예측
mglearn 라이브러리 설치
pip install mglearn
한글 깨짐 방지
import matplotlib as mpl
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = 'retina'
!apt -qq -y install fonts-nanum
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic')
mpl.font_manager._rebuild()
기본 라이브러리 임포트
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
데이터 준비하기
df = pd.read_csv('/content/auto-mpg.csv', header=None)
df.columns = ['mpg','cylinders','displacement','horsepower','weight',
'acceleration','model year','origin','name']
df.head()
df.info()
데이터 전처리
df['horsepower'].unique()
# 수치로 되어있는 데이터가 object 형식으로 되어있다? => 뭔가 이상한애가 껴있다!! => unique 함수를 통해 확인
# 확인해봤더니 '?'값이 하나 있더라
# '?' 값을 제거
# ? -> NaN -> dropna() -> horsepower dtype float로 변환
# 1) ? -> np.nan 형태로 변경
df['horsepower'].replace('?',np.nan, inplace = True)
df['horsepower'].unique()
# 2) np.nan의 값을 삭제
df.dropna(subset=['horsepower'], axis=0, inplace=True)
df['horsepower'].unique()
# 3) 데이터 타입(object) - > float 64 변경
df['horsepower'] = df['horsepower'].astype('float')
df.info()
feature 선택
# 단순 회귀 -> 독립변수(feature) 1개 -> weight
X = df[['weight']]
y = df[['mpg']]
X.shape
데이터셋 분리하기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=7)
X_train.shape
모델 설정 후 학습
from sklearn.linear_model import LinearRegression
lr = LinearRegression().fit(X_train, y_train)
print('훈련 세트의 R2(r squre) : ', lr.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', lr.score(X_test, y_test))
from sklearn.linear_model import Ridge
ridge = Ridge().fit(X_train, y_train)
print('훈련 세트의 R2(r squre) : ', ridge.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', ridge.score(X_test, y_test))
from sklearn.linear_model import Lasso
lasso = Lasso().fit(X_train, y_train)
print('훈련 세트의 R2(r squre) : ', lasso.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', lasso.score(X_test, y_test))
cylinders & weight & model year
X = df[['cylinders', 'weight', 'model year']]
y = df[['mpg']]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.22, random_state=7)
lr = LinearRegression().fit(X_train, y_train)
print('훈련 세트의 R2(r squre) : ', lr.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', lr.score(X_test, y_test))
ridge = Ridge(alpha=111).fit(X_train, y_train)
print('훈련 세트의 R2(r squre) : ', ridge.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', ridge.score(X_test, y_test))
lasso = Lasso(alpha=0.311).fit(X_train, y_train)
print('훈련 세트의 R2(r squre) : ', lasso.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', lasso.score(X_test, y_test))
weight & model year
X1 = df[['weight', 'model year','origin']]
y1 = df[['mpg']]
X1_train, X1_test, y1_train, y1_test = train_test_split(X1, y1, test_size=0.3, random_state=7)
lr1 = LinearRegression().fit(X1_train, y1_train)
print('훈련 세트의 R2(r squre) : ', lr1.score(X1_train, y1_train))
print('훈련 세트의 R2(r squre) : ', lr1.score(X1_test, y1_test))
ridge1 = Ridge(alpha = 123).fit(X1_train, y1_train)
print('훈련 세트의 R2(r squre) : ', ridge1.score(X1_train, y1_train))
print('훈련 세트의 R2(r squre) : ', ridge1.score(X1_test, y1_test))
lasso1 = Lasso(alpha=0.31).fit(X1_train, y1_train)
print('훈련 세트의 R2(r squre) : ', lasso1.score(X1_train, y1_train))
print('훈련 세트의 R2(r squre) : ', lasso1.score(X1_test, y1_test))
y_pred = lr.predict(X_test)
plt.figure(figsize=(5,5))
plt.scatter(y_test, y_pred)
plt.xlabel('True Values [MPG]')
plt.ylabel('Predictions [MPG]')
plt.axis('equal')
plt.axis('square')
plt.xlim([0,plt.xlim()[1]])
plt.ylim([0,plt.ylim()[1]])
_ = plt.plot([-100, 100], [-100, 100])
LIST
'대외활동 > ABC 지역주도형 청년 취업역량강화 ESG 지원산업' 카테고리의 다른 글
[ABC 220923] 지도 학습 알고리즘 - 다중 클래스 분류형 선형 모델 (0) | 2022.10.18 |
---|---|
[ABC 220923] 지도 학습 알고리즘 - 분류형 선형 모델 (1) | 2022.10.18 |
[ABC 220921] 지도 학습 알고리즘 - 선형 모델 (0) | 2022.10.18 |
[ABC 220921] 지도 학습 알고리즘 k-NN 알고리즘 (1) | 2022.10.17 |
[ABC 2200920] 지도 학습 알고리즘 - 일반화, 과대적합, 과소적합 (0) | 2022.10.01 |