-
지도학습 | 라소 회귀 (Lasso Regression)Machine Learning/ML with Python Library 2024. 4. 1. 21:22
선형 회귀에 규제를 적용할 때, 지난번 공부한 Ridge의 대안으로 Lasso가 있다. Ridge와 마찬가지로, Lasso도 계수를 0에 가깝게 만들려고 하는데 방식이 조금 다르다. 이 규제를 L1 Regulation이라고 한다. Lasso를 사용할 때, 어떤 계수는 실제로 정말 0이 된다. 즉, 완전하게 제외되는 특성이 생기게 된다. Feature Selection을 이 회귀를 사용하면 자동으로 함께 처리된다. 이전의 보스턴 주택 가격 데이터셋에 Lasso를 적용해보자.
# !pip install mglearn import mglearn from sklearn.linear_model import Lasso from sklearn.model_selection import train_test_split import numpy as np X, Y = mglearn.datasets.load_extended_boston() X_train, X_test, Y_train, Y_test = train_test_split(X, Y, random_state=0) lasso = Lasso().fit(X_train, Y_train) print("training score: {:.2f}".format(lasso.score(X_train, Y_train))) print("testing score: {:.2f}".format(lasso.score(X_test, Y_test))) print("Number of Features:", np.sum(lasso.coef_ != 0))
training score: 0.29
testing score: 0.21
Number of Features: 4훈련 세트와 테스트 세트 모두에서 결과가 좋지 않았다. 이 이유는 무엇일까? 여기서 Features가 4개뿐인것을 볼 수 있다. 총 104개의 특성중 4개만 사용했기 때문이다. Ridge와 마찬가지로 Lasso도 계수를 얼마나 강하게 0으로 보낼지 조절하는 alpha 변수를 지원한다. 위 코드는 기본값인 alpha=1.0을 사용했다. 과소적합을 줄이기 위해, alpha값을 줄여보자. 이렇게 하려면 max_iter, 즉 반복 실행하는 최대 횟수의 기본값을 늘려야한다.
lasso001 = Lasso(alpha=0.01, max_iter=50000).fit(X_train, Y_train) print("training score: {:.2f}".format(lasso001.score(X_train, Y_train))) print("testing score: {:.2f}".format(lasso001.score(X_test, Y_test))) print("Number of Features:", np.sum(lasso001.coef_ != 0))
training score: 0.90
testing score: 0.77
Number of Features: 33alpha값을 낮춰서 모델 복잡도를 증가시켰고, 훈련/테스트 세트에서 성능이 좋아졌다. Ridge보다 성능이 아주 조금 나은데, 특성이 104개중 33개만 사용되었기 때문에, 모델 분석하기도 쉽다. 하지만, alpha값을 너무 낮추면, regulation의 효과가 떨어져 과대적합이 되기 때문에, Linear Regression과 비슷해진다. 코드로 확인해보자.
lasso00001 = Lasso(alpha=0.0001, max_iter=50000).fit(X_train, Y_train) print("training score: {:.2f}".format(lasso00001.score(X_train, Y_train))) print("testing score: {:.2f}".format(lasso00001.score(X_test, Y_test))) print("Number of Features:", np.sum(lasso00001.coef_ != 0))
training score: 0.95
testing score: 0.64
Number of Features: 96트레이닝 점수는 많이 올랐지만, 과대적합으로 테스팅 점수가 많이 떨어진것을 볼 수 있다. Feature은 전보다 3배이상 많은 96개를 사용했다. 그럼 이 lasso 모델들의 계수 크기를 시각화해서 확인해보자. alpha값이 0.1인 Ridge도 함께 보여주었다.
import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression, Ridge from sklearn.model_selection import train_test_split ridge01 = Ridge(alpha=0.1).fit(X_train, Y_train) plt.plot(lasso.coef_, 's', label="Lasso alpha=1") plt.plot(lasso001.coef_, '^', label="Lasso alpha=0.01") plt.plot(lasso00001.coef_, 'v', label="Lasso alpha=0.00001") plt.plot(ridge01.coef_, 'o', label="Ridge alpha=0.1") plt.legend(ncol=2, loc=(0, 1.05)) plt.ylim(-25, 25)
알파가 1일 때(파랑네모), 계수 대부분이 0이고, 다른 계수들도 크기가 아주 작았다. alpha를 0.01로 줄였을 때(오렌지색 세모), 대부분의 특성이 0이 되는 분포를 보여주었지만, 0이 아닌 계수도 존재했다. alpha값을 0.0001으로 줄였을 때(초록색 세모), 많은 값들이 규제받지 않은 모습을 보여주었다. alpha가 0.1인 Ridge(빨간 동그라미)의 경우, alpha=0.1인 Lasso모델과 성능이 비슷했다. 다만, 어떤 계수도 0이 되지 않는다.
실제로는 Lass와 Ridge중 Ridge회귀를 많이 선호한다고 한다. 하지만, 특성이 많고, 일부분의 특성만 중요하다면 Lasso도 좋은 선택이 될 수 있다고 한다.
Reference
https://colab.research.google.com/drive/1fzSiPpwbTUplw6G0PJSpGaVBWx5CEMIZ?usp=sharing
_02_supervised_machine_learning.ipynb
Colaboratory notebook
colab.research.google.com
https://www.yes24.com/Product/Goods/42806875
파이썬 라이브러리를 활용한 머신러닝 - 예스24
사이킷런 핵심 개발자에게 배우는 머신러닝 이론과 구현 현업에서 머신러닝을 연구하고 인공지능 서비스를 개발하기 위해 꼭 학위를 받을 필요는 없다. 사이킷런(scikit-learn)과 같은 훌륭한 머신
www.yes24.com
'Machine Learning > ML with Python Library' 카테고리의 다른 글
지도학습 | 다중클래스 분류용 선형 모델 (MultiClass Classification Linear Model) (0) 2024.04.02 지도학습 | 분류용 선형 모델 (Linear Classification Model) (0) 2024.04.01 지도학습 | 리지 회귀 (Ridge Regression) (0) 2024.03.30 지도학습 | Ordinary Least Squares (최소제곱법) (1) 2024.03.25 지도학습 | Linear Regression (선형회귀) (0) 2024.03.25