標籤:

線性回歸

以下內容來自劉建平Pinard-博客園的學習筆記,總結如下:

1 線性回歸的模型函數和損失函數

有m個樣本,每個樣本對應於n維特徵和一個結果輸出,如下:

問題是,對於一個新樣本 (x_{1}^{(x)},x_{2}^{(x)},...,x_{n}^{(x)}) ,它所對應的 y^{(x)} 是多少?如果這個問題裡面的 y 是連續的,則是一個回歸問題,否則是一個分類問題。

對於 n 維特徵的樣本數據,如果使用線性回歸,那麼對應的模型是這樣的:

用矩陣形式表示如下:

h_{	heta}(X) = X	heta

其中,假設函數 h_{	heta}(X)m	imes1 的向量, 	hetan	imes1 的向量,裡面有 n 個代數法的參數。 Xm	imes n 維矩陣。 m 代表樣本個數, n 代表特徵數。

得到了模型,需要求出損失函數,一般線性回歸用均方誤差作為損失函數。損失函數的代數法表示如下:

2 線性回歸演算法

對於線性回歸的損失函數 J(	heta)=frac{1}{2}(X	heta-Y)^{T}(X	heta-Y) ,常用的有兩種方法來求損失函數最小化時的 	heta 參數:一種是梯度下降法,一種是最小二乘法。

線性回歸,還有其他的常用演算法,比如牛頓法和擬牛頓法,這裡不詳細描述。

3 線性回歸的推廣:多項式回歸

4 線性回歸的推廣:廣義線性回歸

5 線性回歸的正則化

為了防止模型的過擬合,在建立線性模型的時候經常需要加入正則化項。一般有 L_{1} 正則化和 L_{2} 正則化。

(1)線性回歸的 L_{1} 正則化通常稱為 Lasso 回歸。

它和一般線性回歸的區別是在損失函數上增加了一個 L_{1} 正則化的項, L_{1} 正則化的項有一個常數係數 alpha 來調節損失函數的均方差項和正則化項的權重,具體 Lasso 回歸的損失函數表達式如下:

其中 n 為樣本個數, alpha 為常數係數,需要進行調優, left| left| 	heta 
ight| 
ight|_{1}L_{1} 範數。

Lasso 回歸可以使得一些特徵的係數變小,甚至還是一些絕對值較小的係數直接變為0。增強模型的泛化能力。

Lasso 回歸的求解辦法一般有坐標軸下降法(coordinate descent)和最小角回歸法( Least Angle Regression)。

(2)線性回歸的 L_{2} 正則化通常稱為 Ridge 回歸。

它和一般線性回歸的區別是在損失函數上增加了一個 L_{2} 正則化的項,和 Lasso 回歸的區別是 Ridge 回歸的正則化項是 L_{2} 範數,而 Lasso 回歸的正則化項是 L_{1} 範數。

具體 Ridge 回歸的損失函數表達式如下:

其中 alpha 為常數係數,需要進行調優, left| left| 	heta 
ight| 
ight|_{2}L_{2} 範數。

Ridge 回歸在不拋棄任何一個特徵的情況下,縮小了回歸係數,使得模型相對而言比較的穩定,但和 Lasso 回歸比,這會使得模型的特徵留的特別多,模型解釋性差。

Ridge 回歸的求解比較簡單,一般用最小二乘法。這裡給出用最小二乘法的矩陣推導形式,和普通線性回歸類似。

除了上面這兩種常見的線性回歸正則化,還有一些其他的線性回歸正則化演算法,區別主要就在於正則化項的不同,和損失函數的優化方式不同。

6 初識 Lasso 回歸

Lasso 回歸有時也叫做線性回歸的 L_{1} 正則化,和 Ridge 回歸的主要區別救贖在正則化項。 Ridge 回歸用的是 L_{2} 正則化,而 Lasso 回歸用的是 L_{1} 正則化。具體 Lasso 回歸的損失函數表達式如下:

其中 n 為樣本個數, alpha 為常數係數,需要進行調優。 left| left| 	heta 
ight| 
ight|_{1}L_{1} 範數。

Lasso 回歸使得一些係數變小,甚至還是一些絕對值較小的係數直接變為0,因此特別適用於參數數目縮減與參數的選擇,因而用來估計稀疏參數的線性模型。

但是 Lasso 回歸有一個很大的問題,就是它的損失函數不是連續可導的,由於 L_{1} 範數用的是絕對值之和,導致損失函數有不可導的點。也就是說,我們的最小二乘法,梯度下降法,牛頓法與擬牛頓法對它統統失效了。那我們怎麼才能求有這個 L_{1} 範數的損失函數極小值呢?

兩種全新的求極值解法坐標軸下降法(coordinate descent)和最小角回歸法( Least Angle Regression, LARS)。

7 用坐標軸下降法求解 Lasso 回歸

坐標軸下降法顧名思義,是沿著坐標軸的方向去下降,這和梯度下降不同。梯度下降是沿著梯度的負方向下降。不過梯度下降和坐標軸下降的共性就都是迭代法,通過啟發式的方式一步步迭代求解函數的最小值。

坐標軸下降法的數學依據是:一個 可微的凸函數 J(	heta) ,其中 	hetan	imes1 的向量,即有 n 個維度。如果在某一點 ar{	heta} ,使得 J(	heta) 在每一個坐標軸 ar{	heta_{i}}(i=1,2,...,n) 上都是最小值,那麼 J(ar{	heta_{i}}) 就是一個全局的最小值。

於是我們的優化目標就是在 	hetan 個坐標軸上(或者說向量的方向上)對損失函數做迭代的下降,當所有的坐標軸上的 	heta_{i}(i =1,2,...,n) 都達到收斂時,我們的損失函數最小,此時的

	heta 即為我們要求的結果。

下面我們看看具體的演算法過程:

以上就是坐標軸下降法的求極值過程,可以和梯度下降做一個比較:

a) 坐標軸下降法在每次迭代中在當前點處沿一個坐標方向進行一維搜索 ,固定其他的坐標方向,找到一個函數的局部極小值。而梯度下降總是沿著梯度的負方向求函數的局部最小值。

b) 坐標軸下降優化方法是一種非梯度優化演算法。在整個過程中依次循環使用不同的坐標方向進行迭代,一個周期的一維搜索迭代過程相當於一個梯度下降的迭代。

c) 梯度下降是利用目標函數的導數來確定搜索方向的,該梯度方向可能不與任何坐標軸平行。而坐標軸下降法是利用當前坐標方向進行搜索,不需要求目標函數的導數,只按照某一坐標方向進行搜索最小值。

d) 兩者都是迭代方法,且每一輪迭代,都需要O(mn)的計算量(m為樣本數,n為係數向量維度)

8 用最小角回歸法求解 Lasso 回歸

最小角回歸法(Least Angle Regression, LARS)。在介紹最小角回歸前,我們先看看兩個預備演算法。

8.1 前向選擇演算法

前向選擇演算法的原理是一種典型的貪心演算法,要解決的問題是對於 Y=X	heta 這樣的線性關係,如何求解係數向量 	heta 的問題。其中 Ym	imes1 的向量, Xm	imes n 矩陣, 	hetan	imes 1 向量, m 為樣本數量, n 為特徵維度。

8.2 前向梯度演算法

第二個預備演算法是前向(Forward Stagewise)演算法。

當演算法在 varepsilon 很小的時候,可以很精確的給出最優解,其計算的迭代次數也是大大的增加。和前向選擇演算法相比,前向梯度演算法更加精確,但是更加複雜。

8.3 最小角回歸演算法

最小角回歸(Least Angle Regression, LARS)演算法對前向梯度演算法和前向選擇演算法做了折中,保留了前向梯度演算法一定程度的精確性,同時簡化了前向梯度演算法一步步迭代的過程。

具體演算法是這樣的:

最小角回歸法是一個適用於高維數據的回歸演算法,其主要的優點有:

1)特別適合於特徵維度n 遠高於樣本數m的情況。

2)演算法的最壞計算複雜度和最小二乘法類似,但是其計算速度幾乎和前向選擇演算法一樣。

3)可以產生分段線性結果的完整路徑,這在模型的交叉驗證中極為有用。

主要的缺點是:

由於LARS的迭代方向是根據目標的殘差而定,所以該演算法對樣本的雜訊極為敏感。

Lasso 回歸是在 Ridge 回歸的基礎上發展起來的,如果模型的特徵非常多,需要壓縮,那麼 Lasso 回歸是很好的選擇。一般的情況下,普通的線性回歸模型就夠了。

9 用scikit-learn和pandas學習線性回歸

9.1 獲取數據,定義問題

這裡我們用UCI大學公開的機器學習數據來跑線性回歸。

數據的介紹在這: archive.ics.uci.edu/ml/

數據的下載地址在這: archive.ics.uci.edu/ml/

裡面是一個循環發電場的數據,共有9568個樣本數據,每個數據有5列,分別是:AT(溫度), V(壓力), AP(濕度), RH(壓強), PE(輸出電力)。

我們的問題是得到一個線性的關係,對應PE是樣本輸出,而AT/V/AP/RH這4個是樣本特徵, 機器學習的目的就是得到一個線性回歸模型,即:

而需要學習的,就是 	heta_{0},	heta_{1},	heta_{2},	heta_{3} ,	heta_{4} 這5個參數。

9.2 整理數據

下載後的數據可以發現是一個壓縮文件,解壓後可以看到裡面有一個xlsx文件,我們先用excel把它打開,接著「另存為「」csv格式,保存下來,後面我們就用這個csv來運行線性回歸。

打開這個csv可以發現數據已經整理好,沒有非法數據,因此不需要做預處理。但是這些數據並沒有歸一化,也就是轉化為均值0,方差1的格式。後面scikit-learn在線性回歸時會先幫我們把歸一化搞定。

9.3 用pandas來讀取數據

我們先打開ipython notebook,新建一個notebook。下面的例子和輸出都是在notebook里跑的。

先把要導入的庫聲明了:

接著可以用pandas讀取數據了:

測試讀取數據是否成功:

運行結果如下,說明pandas讀取數據成功:

9.4 準備運行演算法的數據

查看數據的維度:

結果是(9568, 5)。說明我們有9568個樣本,每個樣本有5列。

現在我們開始準備樣本特徵X,我們用AT, V,AP和RH這4個列作為樣本特徵。

可以看到X的前五條輸出如下:

接著我們準備樣本輸出y, 我們用PE作為樣本輸出。

可以看到y的前五條輸出如下:

9.5 劃分訓練集和測試集

把X和y的樣本組合劃分成兩部分,一部分是訓練集,一部分是測試集,代碼如下:

查看下訓練集和測試集的維度:

結果如下:

(7176,4),(7176,1),(2392,4),(2392,1)

可以看到75%的樣本數據被作為訓練集,25%的樣本被作為測試集。

9.6 運行scikit-learn的線性模型

用scikit-learn的線性模型來擬合我們的問題了。scikit-learn的線性回歸演算法使用的是最小二乘法來實現的。代碼如下:

擬合完畢後,我們看看我們的需要的模型係數結果:

輸出如下:

[ 447.06297099]

[[-1.97376045 -0.23229086 0.0693515 -0.15806957]]

這樣我們就得到了在步驟1裡面需要求得的5個值。也就是說PE和其他4個變數的關係如下:

9.7 模型評價

需要評估我們的模型的好壞程度,對於線性回歸來說,我們一般用均方差(Mean Squared Error, MSE)或者均方根差(Root Mean Squared Error, RMSE)在測試集上的表現來評價模型的好壞。

我們看看我們的模型的MSE和RMSE,代碼如下:

輸出如下:

MSE: 20.0804012021RMSE: 4.48111606657

得到了MSE或者RMSE,如果我們用其他方法得到了不同的係數,需要選擇模型時,就用MSE小的時候對應的參數。

比如這次我們用AT, V,AP這3個列作為樣本特徵。不要RH, 輸出仍然是PE。代碼如下:

 輸出如下:

MSE: 23.2089074701RMSE: 4.81756239919

可以看出,去掉RH後,模型擬合的沒有加上RH的號,MSE變大了。

9.8 交叉驗證

通過交叉驗證來持續優化模型,代碼如下,我們採用10折交叉驗證,即cross_val_predict中的cv參數為10:

輸出如下:

MSE: 20.7955974619RMSE: 4.56021901469

可以看出,採用交叉驗證模型的MSE比第6節的大,主要原因是我們這裡是對所有折的樣本做測試集對應的預測值的MSE,而第6節僅僅對25%的測試集做了MSE。兩者的先決條件並不同。

9.9 畫圖觀察結果

畫出真實值和預測值的變化關係,離中間的直線y=x直接越近的點代表預測損失越低。代碼如下:

輸出的圖像如下:

10 用scikit-learn和pandas學習Ridge回歸

10.1 Ridge回歸的損失函數

Ridge回歸的損失函數表達形式是: 

演算法需要解決的就是在找到一個合適的超參數 alpha 情況下,求出使 J(	heta) 最小的 	heta 。一般可以用梯度下降法和最小二乘法來解決這個問題。scikit-learn用的是最小二乘法。

10.2 數據獲取與預處理

這裡我們仍然用UCI大學公開的機器學習數據來跑Ridge回歸。

數據的介紹在這: archive.ics.uci.edu/ml/

數據的下載地址在這: archive.ics.uci.edu/ml/

裡面是一個循環發電場的數據,共有9568個樣本數據,每個數據有5列,分別是:AT(溫度), V(壓力), AP(濕度), RH(壓強), PE(輸出電力)。

我們的問題是得到一個線性的關係,對應PE是樣本輸出,而AT/V/AP/RH這4個是樣本特徵, 機器學習的目的就是通過調節超參數 alpha 得到一個線性回歸模型,即:

下載後的數據可以發現是一個壓縮文件,解壓後可以看到裡面有一個xlsx文件,我們先用excel把它打開,接著「另存為「」csv格式,保存下來,後面我們就用這個csv來運行Ridge回歸。

這組數據並不一定適合用Ridge回歸模型,實際上這組數據是高度線性的,使用正則化的Ridge回歸僅僅只是為了講解方便。

10.3 數據讀取與訓練集、測試集劃分

我們先打開ipython notebook,新建一個notebook。下面的例子和輸出都是在notebook里跑的。

先把要導入的庫聲明了:

接著用pandas讀取數據:

用AT, V,AP和RH這4個列作為樣本特徵。用PE作為樣本輸出:

接著把數據集劃分為訓練集和測試集:

10.4 用scikit-learn運行Ridge回歸

要運行Ridge回歸,我們必須要指定超參數 alpha 。先隨機指定一個(比如1),後面我們會講到用交叉驗證從多個輸入超參數 alpha 中快速選擇最優超參數的辦法。

訓練完了,可以看看模型參數是多少:

輸出結果如下:

[[-1.97373209 -0.2323016 0.06935852 -0.15806479]][ 447.05552892]

也就是說我們得到的模型是:

我們假設了超參數α為1, 實際上我們並不知道超參數α取多少最好,實際研究是需要在多組自選的α中選擇一個最優的。scikit-learn提供了一個交叉驗證選擇最優α的API,下面我們就用這個API來選擇α。

10.5 用scikit-learn選擇Ridge回歸超參數 alpha

這裡我們假設我們想在這10個α值中選擇一個最優的值。代碼如下:

輸出結果為:7.0,說明在我們給定的這組超參數中, 7是最優的α值。

10.6 用scikit-learn研究超參數 alpha 和回歸係數 	heta 的關係

通過Ridge回歸的損失函數表達式可以看到,α越大,那麼正則項懲罰的就越厲害,得到回歸係數 	heta 就越小,最終趨近與0。而如果α越小,即正則化項越小,那麼回歸係數 	heta 就越來越接近於普通的線性回歸係數。

這裡我們用scikit-learn來研究這種Ridge回歸的變化,例子參考了scikit-learn的官網例子。我們單獨啟動一個notebook或者python shell來運行這個例子。

首先還是載入類庫:

接著我們自己生成一個10 	imes 10的矩陣X,表示一組有10個樣本,每個樣本有10個特徵的數據。生成一個10 	imes 1的向量y代表樣本輸出。

這樣我們的數據有了,接著就是準備超參數α了。我們準備了200個超參數,來分別跑 Ridge回歸。準備這麼多的目的是為了後面畫圖看α和θ的關係。

有了這200個超參數α,我們做200次循環,分別求出各個超參數對應的θ(10個維度),存起來後面畫圖用。

有了200個超參數α,以及對應的θ,我們可以畫圖了。我們的圖是以α為x軸,θ的10個維度為y軸畫的。代碼如下:

最後得到的圖如下:

從圖上可以看出,當 alpha 比較大,接近於 10^{-2} 時, 	heta 的10個維度 都趨於0,而當 alpha 比較小,接近於 10^{-10} 時, 	heta 的10個維度都趨於線性回歸的回歸係數。

11 scikit-learn線性回歸演算法庫小結

scikit-learn對於線性回歸提供了比較多的類庫,這些類庫都可以用來做線性回歸分析,本文就對這些類庫的使用做一個總結,重點講述這些線性回歸演算法庫的不同和各自的使用場景。

線性回歸的目的是要得到輸出向量 Y 和輸入特徵 X 之間的線性關係,求出線性回歸係數 	heta ,即 Y=X	heta 。其中 Y 的維度是 m	imes1X 的維度是 m	imes n ,而 	heta 的維度為 n	imes1m 代表樣本個數, n 代表樣本特徵維度。

為了得到線性回歸係數θ,我們需要定義一個損失函數,一個極小化損失函數的優化方法,以及一個驗證演算法的方法。損失函數的不同,損失函數的優化方法的不同,驗證方法的不同,就形成了不同的線性回歸演算法。scikit-learn中的線性回歸演算法庫可以從這這三點找出各自的不同點。

11.1 LinearRegression

損失函數:

LinearRegression類就是最常見普通的線性回歸,它的損失函數也是最簡單的,如下:

損失函數的優化方法:

對於這個損失函數,一般有梯度下降法和最小二乘法兩種極小化損失函數的優化方法,而scikit中的LinearRegression類用的是最小二乘法。通過最小二乘法,可以解出線性回歸係數θ為:

驗證方法:

LinearRegression類並沒有用到交叉驗證之類的驗證方法,需要我們自己把數據集分成訓練集和測試集,然後訓練優化。

使用場景:

一般來說,只要我們覺得數據有線性關係,LinearRegression類是我們的首先。如果發現擬合或者預測的不好,再考慮用其他的線性回歸庫。如果是學習線性回歸,推薦先從這個類開始第一步的研究。

11.2 Ridge

損失函數:

由於第一節的LinearRegression沒有考慮過擬合的問題,有可能泛化能力較差,這時損失函數可以加入正則化項,如果加入的是L2範數的正則化項,這就是Ridge回歸。損失函數如下:

Ridge回歸在不拋棄任何一個特徵的情況下,縮小了回歸係數,使得模型相對而言比較的穩定,不至於過擬合。

損失函數的優化方法:

對於這個損失函數,一般有梯度下降法和最小二乘法兩種極小化損失函數的優化方法,而scikit中的Ridge類用的是最小二乘法。通過最小二乘法,可以解出線性回歸係數θ為:

驗證方法:

Ridge類並沒有用到交叉驗證之類的驗證方法,需要我們自己把數據集分成訓練集和測試集,需要自己設置好超參數α。然後訓練優化。

使用場景:

一般來說,只要我們覺得數據有線性關係,用LinearRegression類擬合的不是特別好,需要正則化,可以考慮用Ridge類。但是這個類最大的缺點是每次我們要自己指定一個超參數α,然後自己評估α的好壞,比較麻煩,一般我都用下一節講到的RidgeCV類來跑Ridge回歸,不推薦直接用這個Ridge類,除非你只是為了學習Ridge回歸。

11.3 RidgeCV

RidgeCV類的損失函數和損失函數的優化方法完全與Ridge類相同,區別在於驗證方法。

驗證方法:

RidgeCV類對超參數α使用了交叉驗證,來幫忙我們選擇一個合適的α。在初始化RidgeCV類時候,我們可以傳一組備選的α值,10個,100個都可以。RidgeCV類會幫我們選擇一個合適的

α。免去了我們自己去一輪輪篩選α的苦惱。  

使用場景:

一般來說,只要我們覺得數據有線性關係,用LinearRegression類擬合的不是特別好,需要正則化,可以考慮用RidgeCV類。不是為了學習的話就不用Ridge類。為什麼這裡只是考慮用RidgeCV類呢?因為線性回歸正則化有很多的變種,Ridge只是其中的一種。所以可能需要比選。如果輸入特徵的維度很高,而且是稀疏線性關係的話,RidgeCV類就不合適了。這時應該主要考慮下面幾節要講到的Lasso回歸類家族。

11.4 Lasso

損失函數:

線性回歸的L1正則化通常稱為Lasso回歸,它和Ridge回歸的區別是在損失函數上增加了的是L1正則化的項,而不是L2正則化項。L1正則化的項也有一個常數係數α來調節損失函數的均方差項和正則化項的權重,具體Lasso回歸的損失函數表達式如下: 

Lasso回歸可以使得一些特徵的係數變小,甚至還是一些絕對值較小的係數直接變為0。增強模型的泛化能力。

損失函數的優化方法:

Lasso回歸的損失函數優化方法常用的有兩種,坐標軸下降法和最小角回歸法。Lasso類採用的是坐標軸下降法,後面講到的LassoLars類採用的是最小角回歸法。

驗證方法:

Lasso類並沒有用到交叉驗證之類的驗證方法,和Ridge類類似。需要我們自己把數據集分成訓練集和測試集,需要自己設置好超參數α。然後訓練優化。

使用場景:

一般來說,對於高維的特徵數據,尤其線性關係是稀疏的,我們會採用Lasso回歸。或者是要在一堆特徵裡面找出主要的特徵,那麼Lasso回歸更是首選了。但是Lasso類需要自己對α調優,所以不是Lasso回歸的首選,一般用到的是下一節要講的LassoCV類。

11.5 LassoCV    

LassoCV類的損失函數和損失函數的優化方法完全與Lasso類相同,區別在於驗證方法。

驗證方法:

LassoCV類對超參數α使用了交叉驗證,來幫忙我們選擇一個合適的 alpha 。在初始化LassoCV類時候,我們可以傳一組備選的α值,10個,100個都可以。LassoCV類會幫我們選擇一個合適的α。免去了我們自己去一輪輪篩選α的苦惱。 

使用場景:

LassoCV類是進行Lasso回歸的首選。當我們面臨在一堆高位特徵中找出主要特徵時,LassoCV類更是必選。當面對稀疏線性關係時,LassoCV也很好用。

11.6 LassoLars

LassoLars類的損失函數和驗證方法與Lasso類相同,區別在於損失函數的優化方法。

損失函數的優化方法:

Lasso回歸的損失函數優化方法常用的有兩種,坐標軸下降法和最小角回歸法。LassoLars類採用的是最小角回歸法,前面講到的Lasso類採用的是坐標軸下降法。   

使用場景:

LassoLars類需要自己對α調優,所以不是Lasso回歸的首選,一般用到的是下一節要講的LassoLarsCV類。

11.7 LassoLarsCV

LassoLarsCV類的損失函數和損失函數的優化方法與LassoLars類相同,區別在於驗證方法。

驗證方法:

LassoLarsCV類對超參數α使用了交叉驗證,來幫忙我們選擇一個合適的α。在初始化LassoLarsCV類時候,我們可以傳一組備選的α值,10個,100個都可以。LassoLarsCV類會幫我們選擇一個合適的α。免去了我們自己去一輪輪篩選α的苦惱。 

使用場景:

LassoLarsCV類是進行Lasso回歸的第二選擇。第一選擇是前面講到LassoCV類。那麼LassoLarsCV類有沒有適用的場景呢?換句話說,用最小角回歸法什麼時候比坐標軸下降法好呢?

場景一:如果我們想探索超參數α更多的相關值的話,由於最小角回歸可以看到回歸路徑,此時用LassoLarsCV比較好。

場景二: 如果我們的樣本數遠小於樣本特徵數的話,用LassoLarsCV也比LassoCV好。其餘場景最好用LassoCV。

11.8 LassoLarsIC

LassoLarsIC類損失函數和損失函數的優化方法與LassoLarsCV類相同,區別在於驗證方法。

驗證方法:

LassoLarsIC類對超參數α沒有使用交叉驗證,而是用 Akaike信息準則(AIC)和貝葉斯信息準則(BIC)。此時我們並不需要指定備選的α值,而是由LassoLarsIC類基於AIC和BIC自己選擇。用LassoLarsIC類我們可以一輪找到超參數α,而用K折交叉驗證的話,我們需要K+1輪才能找到。相比之下LassoLarsIC類尋找α更快。

使用場景:

從驗證方法可以看出,驗證α,LassoLarsIC比LassoLarsCV快很多。那麼是不是LassoLarsIC類一定比LassoLarsCV類好呢? 不一定!由於使用了AIC和BIC準則,我們的數據必須滿足一定的條件才能用LassoLarsIC類。這樣的準則需要對解的自由度做一個適當的估計。該估計是來自大樣本(漸近結果),並假設該模型是正確的(即這些數據確實是由假設的模型產生的)。當待求解的問題的條件數很差的時候(比如特徵個數大於樣本數量的時候),這些準則就會有崩潰的風險。所以除非我們知道數據是來自一個模型確定的大樣本,並且樣本數量夠大,我們才能用LassoLarsIC。而實際上我們得到的數據大部分都不能滿足這個要求,實際應用中我沒有用到過這個看上去很美的類。

11.9 ElasticNet

損失函數:

ElasticNet可以看做Lasso和Ridge的中庸化的產物。它也是對普通的線性回歸做了正則化,但是它的損失函數既不全是L1的正則化,也不全是L2的正則化,而是用一個權重參數ρ來平衡L1和L2正則化的比重,形成了一個全新的損失函數如下: 

損失函數的優化方法:

ElasticNet回歸的損失函數優化方法常用的有兩種,坐標軸下降法和最小角回歸法。ElasticNet類採用的是坐標軸下降法。

驗證方法:

ElasticNet類並沒有用到交叉驗證之類的驗證方法,和Lasso類類似。需要我們自己把數據集分成訓練集和測試集,需要自己設置好超參數α和ρ。然後訓練優化。

使用場景:

ElasticNet類需要自己對α和ρ調優,所以不是ElasticNet回歸的首選,一般用到的是下一節要講的ElasticNetCV類。

11.10 ElasticNetCV

ElasticNetCV類的損失函數和損失函數的優化方法與ElasticNet類相同,區別在於驗證方法。

驗證方法:

ElasticNetCV類對超參數α和 ρ使用了交叉驗證,來幫忙我們選擇合適的α和ρ。在初始化ElasticNetCV類時候,我們可以傳一組備選的α值和ρ,10個,100個都可以。ElasticNetCV類會幫我們選擇一個合適的α和ρ。免去了我們自己去一輪輪篩選α和ρ的苦惱。

使用場景:

ElasticNetCV類用在我們發現用Lasso回歸太過(太多特徵被稀疏為0),而用Ridge回歸又正則化的不夠(回歸係數衰減的太慢)的時候。一般不推薦拿到數據就直接就上ElasticNetCV。

11.11 OrthogonalMatchingPursuit

損失函數:

OrthogonalMatchingPursuit(OMP)演算法和普通的線性回歸損失函數的區別是增加了一個限制項,來限制回歸係數中非0元素的最大個數。形成了一個全新的損失函數如下:

損失函數的優化方法:

OrthogonalMatchingPursuit類使用前向選擇演算法來優化損失函數。它是最小角回歸演算法的縮水版。雖然精度不如最小角回歸演算法,但是運算速度很快。

驗證方法:

OrthogonalMatchingPursuit類並沒有用到交叉驗證之類的驗證方法,和Lasso類類似。需要我們自己把數據集分成訓練集和測試集,需要自己選擇限制參數 n_{non-zero-coefs} 。然後訓練優化。

使用場景:

OrthogonalMatchingPursuit類需要自己選擇 n_{non-zero-coefs} ,所以不是OrthogonalMatching Pursuit 回歸的首選,一般用到的是下一節要講的OrthogonalMatchingPursuitCV類,不過如果你已經定好了 n_{non-zero-coefs} 的值,那用OrthogonalMatchingPursuit比較方便。

11.12 OrthogonalMatchingPursuitCV

OrthogonalMatchingPursuitCV類的損失函數和損失函數的優化方法完全與OrthogonalMatching Pursuit 類相同,區別在於驗證方法。

驗證方法:

OrthogonalMatchingPursuitCV類使用交叉驗證,在S折交叉驗證中以MSE最小為標準來選擇最好的 n_{non-zero-coefs}

使用場景:

OrthogonalMatchingPursuitCV類通常用在稀疏回歸係數的特徵選擇上,這點和LassoCV有類似的地方。不過由於它的損失函數優化方法是前向選擇演算法,精確度較低,一般情況不是特別推薦用,用LassoCV就夠,除非你對稀疏回歸係數的精確個數很在意,那可以考慮用OrthogonalMatchingPursuitCV。

11.13 MultiTaskLasso

從這節到第16節,類裡面都帶有一個「MultiTask」的前綴。不過他不是編程裡面的多線程,而是指多個線性回歸模型共享樣本特徵,但是有不同的回歸係數和特徵輸出。具體的線性回歸模型是Y=XW。其中X是mxn維度的矩陣。W為nxk維度的矩陣,Y為mxk維度的矩陣。m為樣本個數,n為樣本特徵,而k就代表多個回歸模型的個數。所謂的「MultiTask」這裡其實就是指k個線性回歸的模型一起去擬合。

損失函數:

由於這裡是多個線性回歸一起擬合,所以損失函數和前面的都很不一樣:

損失函數的優化方法:

MultiTaskLasso類使用坐標軸下降法來優化損失函數。

驗證方法:

MultiTaskLasso類並沒有用到交叉驗證之類的驗證方法,和Lasso類類似。需要我們自己把數據集分成訓練集和測試集,需要自己設置好超參數α。然後訓練優化。

使用場景:

MultiTaskLasso類需要自己對α調優,所以不是共享特徵協同回歸的首選,一般用到的是下一節要講的MultiTaskLassoCV類。

11.14 MultiTaskLassoCV

MultiTaskLassoCV類的損失函數和損失函數的優化方法完全與MultiTaskLasso類相同,區別在於驗證方法。

驗證方法:

MultiTaskLassoCV類對超參數α使用了交叉驗證,來幫忙我們選擇一個合適的α。在初始化LassoLarsCV類時候,我們可以傳一組備選的α值,10個,100個都可以。MultiTaskLassoCV類會幫我們選擇一個合適的α。

使用場景:

MultiTaskLassoCV是多個回歸模型需要一起共享樣本特徵一起擬合時候的首選。它可以保證選到的特徵每個模型都用到。不會出現某個模型選到了某特徵而另一個模型沒選到這個特徵的情況。

11.15 MultiTaskElasticNet

損失函數:

MultiTaskElasticNet類和MultiTaskLasso類的模型是相同的。不過損失函數不同。損失函數表達式如下: 

損失函數的優化方法:

MultiTaskElasticNet類使用坐標軸下降法來優化損失函數。

驗證方法:

MultiTaskElasticNet類並沒有用到交叉驗證之類的驗證方法,和Lasso類類似。需要我們自己把數據集分成訓練集和測試集,需要自己設置好超參數α和ρ。然後訓練優化。 

使用場景:

MultiTaskElasticNet類需要自己對α調優,所以不是共享特徵協同回歸的首選,如果需要用MultiTaskElasticNet,一般用到的是下一節要講的MultiTaskElasticNetCV類。 

11.16 MultiTaskElasticNetCV

MultiTaskElasticNetCV類的損失函數和損失函數的優化方法完全與MultiTaskElasticNet類相同,區別在於驗證方法。

驗證方法:

MultiTaskElasticNetCV類對超參數alpha 和 ρ使用了交叉驗證,來幫忙我們選擇合適的α和

ρ。在初始化MultiTaskElasticNetCV類時候,我們可以傳一組備選的α值和ρ,10個,100個都可以。ElasticNetCV類會幫我們選擇一個合適的α和ρ。免去了我們自己去一輪輪篩選α和ρ的苦惱。

使用場景:

MultiTaskElasticNetCV是多個回歸模型需要一起共享樣本特徵一起擬合時候的兩個備選之一,首選是MultiTaskLassoCV。如果我們發現用MultiTaskLassoCV時回歸係數衰減的太快,那麼可以考慮用MultiTaskElasticNetCV。

11.17 BayesianRidge

第17和18節講的都是貝葉斯回歸模型。貝葉斯回歸模型假設先驗概率,似然函數和後驗概率都是正態分布。先驗概率是假設模型輸出Y是符合均值為Xθ的正態分布,正則化參數α被看作是一個需要從數據中估計得到的隨機變數。回歸係數θ的先驗分布規律為球形正態分布,超參數為λ。我們需要通過最大化邊際似然函數來估計超參數α和λ,以及回歸係數θ。

此處對損失函數即負的最大化邊際似然函數不多討論,不過其形式和Ridge回歸的損失函數很像,所以也取名BayesianRidge。

使用場景:

如果我們的數據有很多缺失或者矛盾的病態數據,可以考慮BayesianRidge類,它對病態數據魯棒性很高,也不用交叉驗證選擇超參數。但是極大化似然函數的推斷過程比較耗時,一般情況不推薦使用。

11.18 ARDRegression

ARDRegression和BayesianRidge很像,唯一的區別在於對回歸係數θ的先驗分布假設。BayesianRidge假設θ的先驗分布規律為球形正態分布,而ARDRegression丟掉BayesianRidge中的球形高斯的假設,採用與坐標軸平行的橢圓形高斯分布。這樣對應的超參數λ有n個維度,各不相同。而上面的BayesianRidge中球形分布的θ對應的λ只有一個。

ARDRegression也是通過最大化邊際似然函數來估計超參數α和λ向量,以及回歸係數θ。

使用場景:

如果我們的數據有很多缺失或者矛盾的病態數據,可以考慮BayesianRidge類,如果發現擬合不好,可以換ARDRegression試一試。因為ARDRegression對回歸係數先驗分布的假設沒有BayesianRidge嚴格,某些時候會比BayesianRidge產生更好的後驗結果。


推薦閱讀:

簡單線性回歸
簡單線性回歸與機器學習基礎
筆記:簡單理解線性回歸
【線上直播】線性回歸——求解介紹及回歸拓展
一文讀懂回歸樣條(regression splines),附Python代碼

TAG:線性回歸 |