機器學習之線性迴歸 Linear Regression(三)scikit-learn算法庫

參考http://www.cnblogs.com/pinard/p/6026343.html


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

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

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

1、LinearRegression

        損失函數:

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


        損失函數的優化方法:

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


        驗證方法:

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

        使用場景:

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

2、Ridge迴歸類家族

2.1 Ridge

        損失函數:

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

        其中α爲常數係數,需要進行調優。||θ||2爲L2範數。
        Ridge迴歸在不拋棄任何一個特徵的情況下,縮小了迴歸係數,使得模型相對而言比較的穩定,不至於過擬合。
        損失函數的優化方法:
        對於這個損失函數,一般有梯度下降法和最小二乘法兩種極小化損失函數的優化方法,而scikit中的Ridge類用的是最小二乘法。通過最小二乘法,可以解出線性迴歸係數θ爲:

        其中E爲單位矩陣。

        驗證方法:

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

        使用場景:

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

2.2 RidgeCV

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

        驗證方法:

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

        使用場景:

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

3、Lasso迴歸類家族

3.1 Lasso

        損失函數:

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

  
        其中n爲樣本個數,α爲常數係數,需要進行調優。||θ||1爲L1範數。

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

        損失函數的優化方法:

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

        驗證方法:

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

        使用場景:

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

3.2 LassoCV

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

        驗證方法:

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

        使用場景:

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

3.3 LassoLars

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

        損失函數的優化方法:

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

        使用場景:

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

3.4 LassoLarsCV

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

        驗證方法:

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

        使用場景:

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

3.5 LassoLarsIC

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

        驗證方法:

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

        使用場景:

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

4、ElasticNet迴歸類家族

4.1 ElasticNet

        損失函數:

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


        其中α爲正則化超參數,ρ爲範數權重超參數。

        損失函數的優化方法:

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

        驗證方法:

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

       使用場景:

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

4.2 ElasticNetCV

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

        驗證方法:

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

        使用場景:

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

5、OrthogonalMatchingPursuit迴歸類家族

5.1 OrthogonalMatchingPursuit

        損失函數:

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


        其中(||θ||0代表θ的L0範數,即非0迴歸係數的個數。

        損失函數的優化方法:

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

        驗證方法:

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

        使用場景:

        OrthogonalMatchingPursuit類需要自己選擇nnon−zero−coefs,所以不是OrthogonalMatchingPursuit迴歸的首選,一般用到的是下一節要講的OrthogonalMatchingPursuitCV類,不過如果已經定好了nnon−zero−coefs的值,那使用OrthogonalMatchingPursuit比較方便。

5.2 OrthogonalMatchingPursuitCV

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

        驗證方法:

        OrthogonalMatchingPursuitCV類使用交叉驗證,在S折交叉驗證中以MSE最小爲標準來選擇最好的nnon−zero−coefs。

        使用場景:

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

6、MultiTaskLasso迴歸類家族

6.1 MultiTaskLasso

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

        損失函數:

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


其中,是Y=XW的Frobenius範數。而||W||21代表W的各列的根平方和之和。

        損失函數的優化方法:

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

        驗證方法:

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

        使用場景:

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

6.2 MultiTaskLassoCV

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

        驗證方法:

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

        使用場景:

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

6.3 MultiTaskElasticNet

        損失函數:

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


        其中, 是Y=XW的Frobenius範數。而||W||21代表W的各列的根平方和之和。

        損失函數的優化方法: 

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

        驗證方法:

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

        使用場景:

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

6.4 MultiTaskElasticNetCV

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

        驗證方法:

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

        使用場景:

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

7、貝葉斯迴歸模型

7.1 BayesianRidge

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

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

        使用場景:

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

7.2 ARDRegression

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

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

        使用場景:

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

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