天天看點

【skLearn 回歸模型】Lasso ---- 選擇最佳正則化參數 <帶交叉驗證的Lasso LassoCV()>

文章目錄

  • ​​一、linear_model.LassoCV()​​
  • ​​♦ 正則化路徑 regularization path​​
  • ​​♦ linear_model.LassoCV類​​
  • ​​① 自定義alpha範圍測試​​
  • ​​② LassoCV預設參數配置測試​​

一、linear_model.LassoCV()

使用交叉驗證的 Lasso類的參數看起來與嶺回歸略有不同,這是由于 Lasso對于alpha的取值更加敏感的性質決定的。之前提到過,由于 Lasso對正則化系數的變動過于敏感,是以我們往往讓α在很小的空間中變動。這個小空間小到超乎人們的想象(不是0.01到0.02之間這樣的空間,這個空間對 lasso而言還是太大了),是以我們設定了一個重要概念"正則化路徑”,用來設定正則化系數的變動.

♦ 正則化路徑 regularization path

假設我們的特征矩陣中有​

​n個特征​

​,則我們就有​

​特征向量x1,x2…xn​

​。對于​

​每一個α​

​的取值,我們都​

​可以得出一組對應這個特征向量的參數向量w​

​,其中​

​包含了n+1個參數​

​,分别是​

​w0,w1,w2,...wn​

​.​

​這些參數可以被看作是一個n維空間中的一個點​

​。對于​

​不同的α取值​

​,我們​

​就将得到許多個在n維空間中的點​

​,所有的這些​

​點形成的序列​

​,就​

​被我們稱之為是正則化路徑​

​。

我們把形成這個正則化路徑的α的最小值除以α的最大值得到的量(​

​α.min/α.max​

​)稱為​

​正則化路徑的長度(length of the path)​

​。在 sklearn中,我們可以通過規定正則化路徑的長度(即限制α的最小值和最大值之間的比例),以及路徑中α的個數,來讓 sklearn為我們自動生成α的取值,這就避免了我們需要自己生成非常非常小的α的取值清單來讓交叉驗證類使用,類Lassocv自己就可以計算了。

和嶺回歸的交叉驗證類相似,除了進行交叉驗證之外, LassoCV也會單獨建立模型。它會先找出最佳的正則化參數,然後在這個參數下按照模型評估名額進行模組化。需要注意的是, LassoCV的模型評估名額(交叉驗證結果)選用的是均方誤差,而嶺回歸的模型評估名額是可以自己設定的,并且預設是R2。

​​傳回頂部​​

♦ linear_model.LassoCV類

class sklearn.linear_model.LassoCV(*, eps=0.001, n_alphas=100, alphas=None, fit_intercept=True, 
                                   normalize=False, precompute='auto', max_iter=1000, tol=0.0001, 
                                   copy_X=True, cv=None, verbose=False, n_jobs=None, positive=False, 
                                   random_state=None, selection='cyclic')[source]      
【skLearn 回歸模型】Lasso ---- 選擇最佳正則化參數 <帶交叉驗證的Lasso LassoCV()>

① 自定義alpha範圍測試

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.datasets import fetch_california_housing as fch
from sklearn.linear_model import LassoCV
from sklearn.model_selection import train_test_split

# 擷取資料集
house_value = fch()
x = pd.DataFrame(house_value.data)
y = house_value.target
x.columns = ["住戶收入中位數","房屋使用年代中位數","平均房間數目","平均卧室數目","街區人口","平均入住率","街區的緯度","街區的經度"]

# 劃分測試集和訓練集
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3,random_state=420)
# 重置索引
for i in [xtrain,xtest]:
    i.index = range(i.shape[0])

# 自己建立Lasso進行alpha選擇的範圍
# 形成10為底的指數函數
# 10**(-10) -10**(-2)
alpha_range = np.logspace(-10,-2,200,base=10)
print(alpha_range) # 200個自定義的alpha值

# LassoCV
lasso_ = LassoCV(alphas=alpha_range,cv=5).fit(xtrain,ytrain)

# 檢視最佳正則化系數
best_alpha = lasso_.alpha_ # 0.0020729217795953697

# 調用所有的交叉驗證結果:均方誤差 --- 每個alpha對應的五折交叉驗證結果(200,5)
each_five_alpha = lasso_.mse_path_ 
#[[0.52454913 0.49856261 0.55984312 0.50526576 0.55262557]
# [0.52361933 0.49748809 0.55887637 0.50429373 0.55283734]
# [0.52281927 0.49655113 0.55803797 0.5034594  0.55320522]
# [0.52213811 0.49574741 0.55731858 0.50274517 0.55367515]
# [0.52155715 0.49505688 0.55669995 0.50213252 0.55421553]

mean = lasso_.mse_path_.mean(axis=1)#有注意到在嶺回歸中我們的軸向是axis=0嗎?
print(mean.shape)
# (200,)
#在嶺回歸當中,我們是留一驗證,是以我們的交叉驗證結果傳回的是,每一個樣本在每個 alpha下的交叉驗證結果
#是以我們要求每個alpha下的交叉驗證均值,就是axis=,跨行求均值
#而在這裡,我們傳回的是,每一個 alpha取值下,每一折交叉驗證的結果
#是以我們要求每個 alpha下的交叉驗證均值,就是axis=1,跨列求均值

# 最佳正則化系數下獲得的模型的系數結果
w = lasso_.coef_
# [ 4.29867301e-01  1.03623683e-02 -9.32648616e-02  5.51755252e-01,  1.14732262e-06 -3.31941716e-03 -4.10451223e-01 -4.22410330e-01]

# 擷取R2指數
r2_score = lasso_.score(xtest,ytest) # 0.6038982670571436      

② LassoCV預設參數配置測試

# 使用LassoCV自帶正則化路徑長度和路徑中的alpha個數來自動建立alpha選擇的範圍
ls_ = LassoCV(eps=0.0001,n_alphas=300,cv=5).fit(xtrain,ytrain)
# 檢視最佳alpha
b_alpha = ls_.alpha_  # 0.0029405973698326477
# 檢視是否有自動生成的alpha取值
new_alpha = ls_.alphas_
print(ls_.alphas_.shape) # (300,)
# 檢視R2指數
r2 = ls_.score(xtest,ytest) # 0.6036135609816554
# 檢視特征系數
W = ls_.coef_
# [ 4.26722427e-01  1.04253992e-02 -8.71648975e-02  5.20444027e-01,  1.40841579e-06 -3.30718197e-03 -4.09361522e-01 -4.20836139e-01]      

繼續閱讀