1. 程式人生 > 其它 >機器學習sklearn(78):演算法例項(三十五)迴歸(七)線性迴歸大家族(五)多重共線性:嶺迴歸與Lasso(二)Lasso

機器學習sklearn(78):演算法例項(三十五)迴歸(七)線性迴歸大家族(五)多重共線性:嶺迴歸與Lasso(二)Lasso

3 Lasso

3.1 Lasso與多重共線性

3.2 Lasso的核心作用:特徵選擇
import numpy as np
import pandas as pd
from sklearn.linear_model import Ridge, LinearRegression, Lasso
from sklearn.model_selection import train_test_split as TTS
from sklearn.datasets import fetch_california_housing as fch
import matplotlib.pyplot as plt
housevalue 
= fch() X = pd.DataFrame(housevalue.data) y = housevalue.target X.columns = ["住戶收入中位數","房屋使用年代中位數","平均房間數目" ,"平均臥室數目","街區人口","平均入住率","街區的緯度","街區的經度"] X.head() Xtrain,Xtest,Ytrain,Ytest = TTS(X,y,test_size=0.3,random_state=420) #恢復索引 for i in [Xtrain,Xtest]: i.index = range(i.shape[0]) #線性迴歸進行擬合
reg = LinearRegression().fit(Xtrain,Ytrain) (reg.coef_*100).tolist() #嶺迴歸進行擬合 Ridge_ = Ridge(alpha=0).fit(Xtrain,Ytrain) (Ridge_.coef_*100).tolist() #Lasso進行擬合 lasso_ = Lasso(alpha=0).fit(Xtrain,Ytrain) (lasso_.coef_*100).tolist()
#嶺迴歸進行擬合
Ridge_ = Ridge(alpha=0.01).fit(Xtrain,Ytrain) (Ridge_.coef_*100).tolist()
#Lasso進行擬合 lasso_ = Lasso(alpha=0.01).fit(Xtrain,Ytrain) (lasso_.coef_*100).tolist()
這樣就不會報任何錯誤了。
#加大正則項係數,觀察模型的係數發生了什麼變化
Ridge_ = Ridge(alpha=10**4).fit(Xtrain,Ytrain) (Ridge_.coef_*100).tolist()
lasso_ = Lasso(alpha=10**4).fit(Xtrain,Ytrain) (lasso_.coef_*100).tolist()
#看來10**4對於Lasso來說是一個過於大的取值
lasso_ = Lasso(alpha=1).fit(Xtrain,Ytrain) (lasso_.coef_*100).tolist()
#將係數進行繪圖
plt.plot(range(1,9),(reg.coef_*100).tolist(),color="red",label="LR")
plt.plot(range(1,9),(Ridge_.coef_*100).tolist(),color="orange",label="Ridge")
plt.plot(range(1,9),(lasso_.coef_*100).tolist(),color="k",label="Lasso")
plt.plot(range(1,9),[0]*8,color="grey",linestyle="--")
plt.xlabel('w') #橫座標是每一個特徵所對應的係數
plt.legend()
plt.show()
3.3 選取最佳的正則化引數取值 來看看將這些引數和屬性付諸實踐的程式碼:
from sklearn.linear_model import LassoCV
#自己建立Lasso進行alpha選擇的範圍
alpharange = np.logspace(-10, -2, 200,base=10) #其實是形成10為底的指數函式
#10**(-10)到10**(-2)次方
alpharange.shape
Xtrain.head()
lasso_ = LassoCV(alphas=alpharange #自行輸入的alpha的取值範圍
        ,cv=5 #交叉驗證的折數
        ).fit(Xtrain, Ytrain) #檢視被選擇出來的最佳正則化係數
lasso_.alpha_
#呼叫所有交叉驗證的結果
lasso_.mse_path_
lasso_.mse_path_.shape #返回每個alpha下的五折交叉驗證結果
lasso_.mse_path_.mean(axis=1) #有注意到在嶺迴歸中我們的軸向是axis=0嗎?
#在嶺迴歸當中,我們是留一驗證,因此我們的交叉驗證結果返回的是,每一個樣本在每個alpha下的交叉驗證結果
#因此我們要求每個alpha下的交叉驗證均值,就是axis=0,跨行求均值
#而在這裡,我們返回的是,每一個alpha取值下,每一折交叉驗證的結果
#因此我們要求每個alpha下的交叉驗證均值,就是axis=1,跨列求均值
#最佳正則化係數下獲得的模型的係數結果
lasso_.coef_
lasso_.score(Xtest,Ytest) #與線性迴歸相比如何?
reg = LinearRegression().fit(Xtrain,Ytrain)
reg.score(Xtest,Ytest) #使用lassoCV自帶的正則化路徑長度和路徑中的alpha個數來自動建立alpha選擇的範圍
ls_ = LassoCV(eps=0.00001
       ,n_alphas=300
       ,cv=5
        ).fit(Xtrain, Ytrain)
ls_.alpha_
ls_.alphas_ #檢視所有自動生成的alpha取值
ls_.alphas_.shape
ls_.score(Xtest,Ytest)
ls_.coef_