반응형
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에 가깝다.
반응형
'🛠 기타 > Data & AI' 카테고리의 다른 글
워드임베딩 - Word2Vec 기초활용 (0) | 2020.07.27 |
---|---|
단층 퍼셉트론 - 이진판단 이론 (0) | 2020.07.24 |
[scikit-learn 라이브러리] Ridge 예제 (0) | 2020.07.24 |
규제 선형모델 Ridge와 Lasso 개념 이해 (0) | 2020.07.23 |
[scikit-learn 라이브러리] LinearRegression (선형회귀) (0) | 2020.07.23 |