본문 바로가기

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

[ABC 220921] 지도 학습 알고리즘 - 선형 모델

반응형

선형 모델

  • 선형 모델 linear model
    • 100여 년 전에 개발
    • 지난 몇십년 동안 폭 넓게 연구되고 현재도 널리 쓰임
  • 회귀의 선형 모델 예측
    • 1차원 wave 데이터셋으로 파라미터 w[0]와 b를 직선처럼 되도록 학습
    • 직선의 방정식을 이해하기 쉽도록 그래프의 중앙을 ㅈ가로질러서 x, y 축을 그림
    • "평균으로 회귀한다"
    • KNeighborsRegressor를 사용하여 만든 선과 비교해보면 직선을 사용한 예측이 더 제약이 많아보인다.
    • 특성이 많은 데이터셋이라면 선형 모델은 매우 훌륭한 성능을 낼 수 있음

 

선형 회귀(최소 제곱법)

  • 선형 모델  - 선형 회귀 (최소 제곱법)
    • 선형 회귀 linear regression 또는 최소 제곱법 OLS, ordinary least squares은 가장 간단하고 오래된 회귀용 선형 알고리즘
    • 선형 회귀는 예측과 훈련 세트에 있는 타깃 y 사이의 평균 제곱 오차를 최소화하는 파라미터 w와 b를 찾는 것
    • 평균 제곱 오차는 예측값과 타깃값의 차이를 제곱하여 더한 후에 샘플의 개수로 나눈 것
    • 선형 회귀는 매개변수가 없는 것이 장점 BUT 모델의 복잡도를 제어할 방법도 없음
  • 보스턴 주택 가격 데이터셋을 사용한 선형 회귀 성능 평가
    • LinearRegression 모델이 보스턴 주택가격 데이터셋과 같은 복잡한 데이터셋에서 어떻게 동작하는지 확인
    • 데이터 셋에는 샘플 506개가 있고 특성은 유도된 것을 합쳐 105개
    • 데이터셋 준비 → 훈련 세트와 테스트 세트로 나누기 → 선형 모델 생성
    • 훈련 세트와 테스트 세트의 점수를 비교 → 훈련 세트에서는 예측이 매우 정확함
    • 테스트 세트에서는 R2 값이 너무 낮다
    • → 과대 적합 → 확실한 신호이므로 복잡도를 제어할 수 있는 모델을 사용해야 함
    • → 릿지 회귀

선형 회귀 모델

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 mglearn
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

import warnings
warnings.filterwarnings('ignore')

X , y = mglearn.datasets.make_wave(n_samples=100)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=7)
X_train.shape

X_test.shape

모델 설정하기

lr = LinearRegression()

모델 학습하기

lr.fit(X_train, y_train)

Ir 객체 사용하기

print('lr.coef_ : ', lr.coef_) # w(가중치, 기울기)
print('lr.intercept_ : ', lr.intercept_)

성능평가

# score() 함수 -> R2 ( 0 ~ 1 ) -> 1에 가까우면 예측을 잘하는 모델 -> 훈련 데이터, 테스트 데이터의 차이
print('훈련 세트의 R2(r squre) : ', lr.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', lr.score(X_test, y_test))
# 0.61719
# 0.63297
# 이건 underfitting 상태(과소 적합) 즉, 모델이 전혀 예측을 못하고 있는 상태 -> 모델을 변경

보스톤 주택 가격 데이터셋을 사용한 선형회귀

X, y = mglearn.datasets.load_extended_boston() # feature 104개
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=7)
X_train.shape

모델 학습하기

lr = LinearRegression().fit(X_train, y_train)
print('lr.coef_ : ', lr.coef_) # w(가중치, 기울기)
print('lr.intercept_ : ', lr.intercept_)

성능평가

# score() 함수 -> R2 ( 0 ~ 1 ) -> 1에 가까우면 예측을 잘하는 모델 -> 훈련 데이터, 테스트 데이터의 차이
print('훈련 세트의 R2(r squre) : ', lr.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', lr.score(X_test, y_test))
# 0.934694
# 0.663843
# overfitting(과대 적합) 상태 -> feature -> 모델 변경

Lidge 회귀 → 규제를 통해서 과대적합되지 않기 위한 선형 모델

from sklearn.linear_model import Ridge

ridge = Ridge().fit(X_train, y_train) # alpha라는 argument를 통해서 규제할 수 있음 alpha의 기본값은 1.0
# score() 함수 -> R2 ( 0 ~ 1 ) -> 1에 가까우면 예측을 잘하는 모델 -> 훈련 데이터, 테스트 데이터의 차이
# -> Ridge() -> 과대적합 -> 규제(alpha)를 조정 -> L2 version
print('훈련 세트의 R2(r squre) : ', ridge.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', ridge.score(X_test, y_test))

# alpha 값만 조정하여 성능 평가
# alpha = 10 규제하는 값을 올리면 -> 학습을 덜 한다. -> 과소적합
ridge10 = Ridge(alpha=10).fit(X_train, y_train) # alpha = 10
print('훈련 세트의 R2(r squre) : ', ridge10.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', ridge10.score(X_test, y_test))

# alpha 값만 조정하여 성능 평가
# alpha = 0.1 규제하는 값을 내리면 -> 학습을 더 한다. -> 
ridge001 = Ridge(alpha=0.1).fit(X_train, y_train) # alpha = 0.1
print('훈련 세트의 R2(r squre) : ', ridge001.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', ridge001.score(X_test, y_test))
# 즉, alpha값을 조정해서 규제하는 정도를 조정해 학습 정도를 조절해준다.

Lasso 회귀 → feature selection 자동으로 이루어짐

from sklearn.linear_model import Lasso
import numpy as np

# alpha 값만 조정하여 성능 평가
# alpha = 1 -> 과소 적합(underfitting) -> ????? 규제를 풀어서 더 많은 feature 학습하도록 진행 

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))
print('학습에 사용한 특성(feature)의 개수 : ', np.sum(lasso.coef_!= 0))

lasso001 = Lasso(alpha = 0.001).fit(X_train, y_train)
print('훈련 세트의 R2(r squre) : ', lasso001.score(X_train, y_train))
print('훈련 세트의 R2(r squre) : ', lasso001.score(X_test, y_test))
print('학습에 사용한 특성(feature)의 개수 : ', np.sum(lasso001.coef_!= 0))

lasso001.coef_

 

LIST