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

劉建平Pinard發表於2016-11-03

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

    線性迴歸的目的是要得到輸出向量\(\mathbf{Y}\)和輸入特徵\(\mathbf{X}\)之間的線性關係,求出線性迴歸係數\(\mathbf\theta\),也就是 \(\mathbf{Y = X\theta}\)。其中\(\mathbf{Y}\)的維度為mx1,\(\mathbf{X}\)的維度為mxn,而\(\mathbf{\theta}\)的維度為nx1。m代表樣本個數,n代表樣本特徵的維度。

    為了得到線性迴歸係數\(\mathbf{\theta}\),我們需要定義一個損失函式,一個極小化損失函式的優化方法,以及一個驗證演算法的方法。損失函式的不同,損失函式的優化方法的不同,驗證方法的不同,就形成了不同的線性迴歸演算法。scikit-learn中的線性迴歸演算法庫可以從這這三點找出各自的不同點。理解了這些不同點,對不同的演算法使用場景也就好理解了。

1. LinearRegression

    損失函式:

    LinearRegression類就是我們平時說的最常見普通的線性迴歸,它的損失函式也是最簡單的,如下:

    \(J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y})\)

    損失函式的優化方法:

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

    \( \mathbf{\theta} = (\mathbf{X^{T}X})^{-1}\mathbf{X^{T}Y} \)

    驗證方法:

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

    使用場景:

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

2. Ridge

    損失函式: 

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

    \(J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \frac{1}{2}\alpha||\theta||_2^2\)

    其中\(\alpha\)為常數係數,需要進行調優。\(||\theta||_2\)為L2範數。

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

    損失函式的優化方法:

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

    \(\mathbf{\theta = (X^TX + \alpha E)^{-1}X^TY}\)

    其中E為單位矩陣。

    驗證方法:

    Ridge類並沒有用到交叉驗證之類的驗證方法,需要我們自己把資料集分成訓練集和測試集,需要自己設定好超引數\(\alpha\)。然後訓練優化。

    使用場景:

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

3. RidgeCV

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

    驗證方法:

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

    使用場景:

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

4.  Lasso

    損失函式:

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

    \(J(\mathbf\theta) = \frac{1}{2m}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \alpha||\theta||_1\)

    其中n為樣本個數,\(\alpha\)為常數係數,需要進行調優。\(||\theta||_1\)為L1範數。

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

    損失函式的優化方法:

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

    驗證方法:

    Lasso類並沒有用到交叉驗證之類的驗證方法,和Ridge類類似。需要我們自己把資料集分成訓練集和測試集,需要自己設定好超引數\(\alpha\)。然後訓練優化。

    使用場景:

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

5. LassoCV    

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

    驗證方法:

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

    使用場景:  

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

6. LassoLars

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

    損失函式的優化方法:

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

    使用場景:

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

7. LassoLarsCV

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

    驗證方法:

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

    使用場景:  

    LassoLarsCV類是進行Lasso迴歸的第二選擇。第一選擇是前面講到LassoCV類。那麼LassoLarsCV類有沒有適用的場景呢?換句話說,用最小角迴歸法什麼時候比座標軸下降法好呢?場景一:如果我們想探索超引數\(\alpha\)更多的相關值的話,由於最小角迴歸可以看到迴歸路徑,此時用LassoLarsCV比較好。場景二: 如果我們的樣本數遠小於樣本特徵數的話,用LassoLarsCV也比LassoCV好。其餘場景最好用LassoCV。

 

8. LassoLarsIC

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

    驗證方法:

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

    使用場景:

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

 

9.  ElasticNet

    損失函式:

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

    \(J(\mathbf\theta) = \frac{1}{2m}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \alpha\rho||\theta||_1 + \frac{\alpha(1-\rho)}{2}||\theta||_2^2\)

    其中\(\alpha\)為正則化超引數,\(\rho\)為範數權重超引數。

    損失函式的優化方法:

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

    驗證方法:

    ElasticNet類並沒有用到交叉驗證之類的驗證方法,和Lasso類類似。需要我們自己把資料集分成訓練集和測試集,需要自己設定好超引數\(\alpha\)和\(\rho\)。然後訓練優化。

    使用場景:

    ElasticNet類需要自己對\(\alpha\)和\(\rho\)調優,所以不是ElasticNet迴歸的首選,一般用到的是下一節要講的ElasticNetCV類。

10. ElasticNetCV

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

    驗證方法:

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

    使用場景:

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

11. OrthogonalMatchingPursuit

    損失函式:

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

    \(J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) \)

    subject to \(||\theta||_0 \leq n_{non-zero-coefs}\) ,其中\((||\theta||_0\)代表\(\theta\)的L0範數,即非0迴歸係數的個數。

    損失函式的優化方法:   

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

    驗證方法:

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

    使用場景:

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

12. OrthogonalMatchingPursuitCV

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

    驗證方法:

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

    使用場景:

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

13.  MultiTaskLasso

    從這節到第16節,類裡面都帶有一個“MultiTask”的字首。不過他不是程式設計裡面的多執行緒,而是指多個線性迴歸模型共享樣本特徵,但是有不同的迴歸係數和特徵輸出。具體的線性迴歸模型是\(\mathbf{Y = XW}\)。其中X是mxn維度的矩陣。W為nxk維度的矩陣,Y為mxk維度的矩陣。m為樣本個數,n為樣本特徵,而k就代表多個迴歸模型的個數。所謂的“MultiTask”這裡其實就是指k個線性迴歸的模型一起去擬合。

    損失函式:

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

    \(J(\mathbf{W}) = \frac{1}{2m}\mathbf{(||XW-Y||)_{Fro}^2} + \alpha||\mathbf{W}||_{21}\)

    其中, \(\mathbf{(||XW-Y||)_{Fro}}\)是\(\mathbf{Y = XW}\)的Frobenius範數。而\(\mathbf{||W||_{21}}\)代表W的各列的根平方和之和。

    損失函式的優化方法:   

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

    驗證方法:

    MultiTaskLasso類並沒有用到交叉驗證之類的驗證方法,和Lasso類類似。需要我們自己把資料集分成訓練集和測試集,需要自己設定好超引數\(\alpha\)。然後訓練優化。

    使用場景:

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

14.  MultiTaskLassoCV

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

    驗證方法:

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

    使用場景:

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

15.  MultiTaskElasticNet

    損失函式:

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

    \(J(\mathbf{W}) = \frac{1}{2m}\mathbf{(||XW-Y||)_{Fro}^2} + \alpha\rho||\mathbf{W}||_{21} + \frac{\alpha(1-\rho)}{2}\mathbf{(||W||)_{Fro}^2}\)

    其中, \(\mathbf{(||XW-Y||)_{Fro}}\)是\(\mathbf{Y = XW}\)的Frobenius範數。而\(\mathbf{||W||_{21}}\)代表W的各列的根平方和之和。

    損失函式的優化方法:   

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

    驗證方法:

    MultiTaskElasticNet類並沒有用到交叉驗證之類的驗證方法,和Lasso類類似。需要我們自己把資料集分成訓練集和測試集,需要自己設定好超引數\(\alpha\)和\(\rho\)。然後訓練優化。 

    使用場景:

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

    

16.  MultiTaskElasticNetCV

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

    驗證方法:

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

    使用場景:

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

17. BayesianRidge

    第17和18節講的都是貝葉斯迴歸模型。貝葉斯迴歸模型假設先驗概率,似然函式和後驗概率都是正態分佈。先驗概率是假設模型輸出Y是符合均值為\(X\theta\)的正態分佈,正則化引數\(\alpha\)被看作是一個需要從資料中估計得到的隨機變數。迴歸係數\(\theta\)的先驗分佈規律為球形正態分佈,超引數為\(\lambda\)。我們需要通過最大化邊際似然函式來估計超引數\(\alpha\)和\(\lambda\),以及迴歸係數\(\theta\)。

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

    使用場景:

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

18. ARDRegression

    ARDRegression和BayesianRidge很像,唯一的區別在於對迴歸係數\(\theta\)的先驗分佈假設。BayesianRidge假設\(\theta\)的先驗分佈規律為球形正態分佈,而ARDRegression丟掉了BayesianRidge中的球形高斯的假設,採用與座標軸平行的橢圓形高斯分佈。這樣對應的超引數\(\lambda\)有n個維度,各不相同。而上面的BayesianRidge中球形分佈的\(\theta\)對應的\(\lambda\)只有一個。

    ARDRegression也是通過最大化邊際似然函式來估計超引數\(\alpha\)和\(\lambda\)向量,以及迴歸係數\(\theta\)。

    使用場景:

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

 

以上就是scikit-learn中線性迴歸的一個總結,希望可以幫到朋友們。

 (歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 

相關文章