본문 바로가기

대외활동/ABC 지역주도형 청년 취업역량강화 ESG 지원산업

[ABC 220921] 지도 학습 알고리즘 -Ridge 회귀 / Lasso 회귀

반응형

선형 모델 - Ridge 회귀

  • 선형 모델 - 릿지 회귀
    • 보스턴 주택 가격 데이터 셋을 사용한 릿지 회귀 성능 평가
      • alpha 값에 따라 모델의 coef_ 속성이 어떻게 달라지는 지를 조사
        • alpha 매개변수가 모델을 어떻게 변경시키는지 더 깊게 이해할 수 있음
        • 높은 alpha 값은 제약이 많은 모델이므로 작은 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