【機器學習】套索迴歸

上一節中,瞭解了什麼是標準線性模型與什麼是嶺迴歸。並且也知道嶺迴歸存在一種被叫做L2正則化的約束。

除了Ridge,還有一種正則化的線性迴歸是lasso。與嶺迴歸相同,使用lassob也是約束係數使其接近於0.但用到的方法不同,叫作L1正則化。L1正則化的結果是,使用lasso某些係數剛好爲0。這說明某些特徵被模型完全忽略。這可以看作是一種自動化的特徵選擇。某些係數剛好爲0,這樣模型量多容易解釋,也可以帶刺模型最重要的特徵。

lasso模塊的使用在linear_model下的Lasso中。

# 在學習之前,先導入這些常用的模塊
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import mglearn

套索迴歸 Lasso

接下來,我們將lasso應用在擴展的波士頓房價數據集上:

# 導入lasso模塊
from sklearn.linear_model import Lasso
# 導入 train_test_split 模塊 
from sklearn.model_selection import train_test_split

# 導入波士頓房價數據
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 = Lasso().fit(X_train, y_train)
print('lasso在訓練集的評估分數:', lasso.score(X_train, y_train))
print('lasso在測試集的評估分數:', lasso.score(X_test, y_test))
print('lasso模型保存的特徵數量:', np.sum(lasso.coef_ != 0))
lasso在訓練集的評估分數: 0.29323768991114607
lasso在測試集的評估分數: 0.20937503255272294
lasso模型保存的特徵數量: 4

結果顯示,Lasso在訓練集和測試集上的表現都不好,這說明這個模型存在欠擬合的現象。

當顯示某數據的特徵(斜率)是0的時候,表示是被模型忽略的。這裏非0的特徵數量只有4個,說明有過多的特徵被忽略了。

爲了降低欠擬合,需要降低alpha參數,也就是讓模型顯得“更復雜一點”。除了這麼做,還需要增加max_iter參數,並適當修改它的值。該值表示運行迭代的最大次數。

# 降低alpha的值,增大max_iter的值
lasso001 = Lasso(alpha=0.01, max_iter=100000).fit(X_train, y_train)
print('lasso001在訓練集的評估分數:', lasso001.score(X_train, y_train))
print('lasso001在測試集的評估分數:', lasso001.score(X_test, y_test))
print('lasso001模型保存的特徵數量:', np.sum(lasso001.coef_ != 0))
lasso001在訓練集的評估分數: 0.896506955975129
lasso001在測試集的評估分數: 0.7656489887843521
lasso001模型保存的特徵數量: 33

由此可見,我調小了alpha的值,並加大了max_iter的值。模型的的評估結果表現變得好了許多,並且,使用到的特徵數量也有所增加。

但需要注意的是,不能爲了繼續提高模型的泛化能力而將alpha的值改爲0,這樣該模型將與LinearRegression的結果類似,將出現過擬合的情況。

不信看下面:

# 讓alpha的值接近於0
lasso00001 = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train)
print('lasso00001在訓練集的評估分數:', lasso00001.score(X_train, y_train))
print('lasso00001在測試集的評估分數:', lasso00001.score(X_test, y_test))
print('lasso00001模型保存的特徵數量:', np.sum(lasso00001.coef_ != 0))
lasso00001在訓練集的評估分數: 0.9510610436181262
lasso00001在測試集的評估分數: 0.6403098994161569
lasso00001模型保存的特徵數量: 94

這樣的結果表明,模型在訓練集表現相當優異,而在測試集的表現一般,這種現在是因爲近擬合造成的,只能適配於訓練的數據,而無法很好的適應於新的數據集。

接下來,就將alpha不同值情況下,模型的泛化能力結果圖示化展示現在,以方便大家理解。

plt.plot(lasso.coef_, 's', label='Lasso alpha=1')
plt.plot(lasso001.coef_, '^', label='Lasso alpha=0.01')
plt.plot(lasso00001.coef_, 's', label='Lasso alpha=0.0001')

plt.legend(ncol=2, loc=(0, 1.05))
plt.ylim(-25, 25)
plt.xlabel('Coefficient index')
plt.ylabel('Coefficient magnitude')
plt.show()

從上圖可以看出,當alpah的值越小時,將有越多的係數在0附近。

在實踐中,嶺迴歸套索迴歸首先嶺迴歸。但是,如果特徵特別多,而某些特徵更重要,具有選擇性,那就選擇Lasso可能更好。

scikit-learn還提供了ElasticNet類,結合了LassoRidge的懲罰項。在實踐中,這種結合的效果最好,不過代價是要調節兩個參數:一個用於L1正則化,一個用於L2正則化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章