[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/Data & AI

[scikit-learn 라이브러리] Rasso 예제

inu 2020. 7. 24. 10:39
반응형

Rasso 모델

Lasso(alpha, fit_intercept, normalize, precompute, copy_X, max_iter, tol, warm_start, positive, solver, random_state, selection)
  • alpha : 값이 클수록 강력한 정규화(규제) 설정하여 분산을 줄임, 양수로 설정
  • fit_intercept : 모형에 상수항 (절편)이 있는가 없는가를 결정하는 인수 (default : True)
  • normalize : 매개변수 무시 여부
  • precompute : 계산속도를 높이기 위해 미리 계산된 그램 매트릭스를 사용할 것인지 여부
  • copy_X : X의 복사 여부
  • max_iter : 계산에 사용할 작업 수
  • tol : 정밀도
  • warm_start : 이전 모델을 초기화로 적합하게 사용할 것인지 여부
  • positive : 계수가 양수로 사용할 것인지 여부
  • solver : 계산에 사용할 알고리즘 (auto, svd, cholesky, lsqr, sparse_cg, sag, saga)
  • random_state : 난수 seed 설정
  • selection : 계수의 업데이트 방법 설정 (random으로 설정하면 tol이 1e-4보다 높을 때 빠른 수렴)

Rasso 예제

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression, Ridge, Lasso
  • 현재 필요한 라이브러리 import
# 확장 보스턴 집값
from sklearn.model_selection import train_test_split
import mglearn

X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
  • 데이터를 불러오는 과정
  • mglearn의 보스턴 집값모델을 불러왔다.
  • 해당모델은 학습 세트 정확도에 비해 테스트 세트 정확도가 매우 낮은 '과적합'의 형태를 보인다.
mode_lr = LinearRegression().fit(X_train, y_train)
print("훈련 세트 점수: {:.2f}".format(mode_lr.score(X_train, y_train)))
print("테스트 세트 점수: {:.2f}".format(mode_lr.score(X_test, y_test)))
print("사용한 특성의 수: {}".format(   np.sum( mode_lr.coef_ != 0 )   ))

model_lasso00001 = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train)
print("훈련 세트 점수: {:.2f}".format(model_lasso00001.score(X_train, y_train)))
print("테스트 세트 점수: {:.2f}".format(model_lasso00001.score(X_test, y_test)))
print("사용한 특성의 수: {}".format(   np.sum( model_lasso00001.coef_ != 0 )   ))

model_lasso001 = Lasso(alpha=0.01, max_iter=10000).fit(X_train, y_train)
print("훈련 세트 점수: {:.2f}".format(model_lasso001.score(X_train, y_train)))
print("테스트 세트 점수: {:.2f}".format(model_lasso001.score(X_test, y_test)))
print("사용한 특성의 수: {}".format(   np.sum( model_lasso001.coef_ != 0 )   ))

model_lasso = Lasso().fit(X_train, y_train)
print("훈련 세트 점수: {:.2f}".format(model_lasso.score(X_train, y_train)))
print("테스트 세트 점수: {:.2f}".format(model_lasso.score(X_test, y_test)))
print("사용한 특성의 수: {}".format(   np.sum( model_lasso.coef_ != 0 )   ))
==결과==
훈련 세트 점수: 0.95
테스트 세트 점수: 0.61
사용한 특성의 수: 104

훈련 세트 점수: 0.95
테스트 세트 점수: 0.64
사용한 특성의 수: 96

훈련 세트 점수: 0.90
테스트 세트 점수: 0.77
사용한 특성의 수: 33

훈련 세트 점수: 0.29
테스트 세트 점수: 0.21
사용한 특성의 수: 4
  • alpha값이 커질수록 훈련 세트의 점수가 떨어진다. Ridge보다 더 급격하게 떨어짐을 알 수 있다. (Rasso는 L1 Norm을 사용하기 때문)
  • 그와 함께 특성 자체가 0이 되어 사라지기도 한다.
  • 1이상의 값을 적용하면 사라지는 특성이 많아져 과소적합이 발생한다.
# α 값의 변화에 따른 가중치 (coef_)의 변화
plt.plot(mode_lr.coef_, 'o', label='LinearRegression')
plt.plot(model_lasso.coef_, 's', label='Lasso alpha=1')
plt.plot(model_lasso001.coef_, 'v', label='Lasso alpha=0.01')
plt.plot(model_lasso00001.coef_, '^', label='Lasso alpha=0.0001')

plt.xlabel("Coef list") # 가중치(w) 목록
plt.ylabel("Coef size") # 가중치(w) 값

plt.ylim(-25, 25)
plt.legend(ncol=2, loc=(0, 1.05))

  • 시각화를 해보면 결과를 더 잘 알 수 있다.
  • 단순 선형회귀에선 학습 세트에 대해서만 최적화가 되어 있어 각 특성(가중치)의 값들이 많이 흩어져 있다.
  • 하지만 Rasso 적용, alpha값을 늘릴 수록 특성의 값들이 0으로 몰리는 것을 확인할 수 있다.
  • 1이 0.01에 가려져 잘 보이지 않지만 거의 극단적 0에 가깝다.
반응형