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中的線性迴歸算法庫能夠從這這三點找出各自的不一樣點。理解了這些不一樣點,對不一樣的算法使用場景也就好理解了。微信
損失函數:多線程
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} $ui
驗證方法:spa
LinearRegression類並無用到交叉驗證之類的驗證方法,須要咱們本身把數據集分紅訓練集和測試集,而後訓練優化。
使用場景:
通常來講,只要咱們以爲數據有線性關係,LinearRegression類是咱們的首先。若是發現擬合或者預測的很差,再考慮用其餘的線性迴歸庫。若是是學習線性迴歸,推薦先從這個類開始第一步的研究。
損失函數:
因爲第一節的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迴歸。
RidgeCV類的損失函數和損失函數的優化方法徹底與Ridge類相同,區別在於驗證方法。
驗證方法:
RidgeCV類對超參數\(\alpha\)使用了交叉驗證,來幫忙咱們選擇一個合適的\(\alpha\)。在初始化RidgeCV類時候,咱們能夠傳一組備選的\(\alpha\)值,10個,100個均可以。RidgeCV類會幫咱們選擇一個合適的\(\alpha\)。免去了咱們本身去一輪輪篩選\(\alpha\)的苦惱。
使用場景:
通常來講,只要咱們以爲數據有線性關係,用LinearRegression類擬合的不是特別好,須要正則化,能夠考慮用RidgeCV類。不是爲了學習的話就不用Ridge類。爲何這裏只是考慮用RidgeCV類呢?由於線性迴歸正則化有不少的變種,Ridge只是其中的一種。因此可能須要比選。若是輸入特徵的維度很高,並且是稀疏線性關係的話,RidgeCV類就不合適了。這時應該主要考慮下面幾節要講到的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類。
LassoCV類的損失函數和損失函數的優化方法徹底與Lasso類相同,區別在於驗證方法。
驗證方法:
LassoCV類對超參數\(\alpha\)使用了交叉驗證,來幫忙咱們選擇一個合適的\(\alpha\)。在初始化LassoCV類時候,咱們能夠傳一組備選的\(\alpha\)值,10個,100個均可以。LassoCV類會幫咱們選擇一個合適的\(\alpha\)。免去了咱們本身去一輪輪篩選\(\alpha\)的苦惱。
使用場景:
LassoCV類是進行Lasso迴歸的首選。當咱們面臨在一堆高位特徵中找出主要特徵時,LassoCV類更是必選。當面對稀疏線性關係時,LassoCV也很好用。
LassoLars類的損失函數和驗證方法與Lasso類相同,區別在於損失函數的優化方法。
損失函數的優化方法:
Lasso迴歸的損失函數優化方法經常使用的有兩種,座標軸降低法和最小角迴歸法。LassoLars類採用的是最小角迴歸法,前面講到的Lasso類採用的是座標軸降低法。
使用場景:
****LassoLars類須要本身對\(\alpha\)調優,因此不是Lasso迴歸的首選,通常用到的是下一節要講的LassoLarsCV類。
LassoLarsCV類的損失函數和損失函數的優化方法徹底與LassoLars類相同,區別在於驗證方法。
驗證方法:
LassoLarsCV類對超參數\(\alpha\)使用了交叉驗證,來幫忙咱們選擇一個合適的\(\alpha\)。在初始化LassoLarsCV類時候,咱們能夠傳一組備選的\(\alpha\)值,10個,100個均可以。LassoLarsCV類會幫咱們選擇一個合適的\(\alpha\)。免去了咱們本身去一輪輪篩選\(\alpha\)的苦惱。
使用場景:
LassoLarsCV類是進行Lasso迴歸的第二選擇。第一選擇是前面講到LassoCV類。那麼LassoLarsCV類有沒有適用的場景呢?換句話說,用最小角迴歸法何時比座標軸降低法好呢?場景一:若是咱們想探索超參數\(\alpha\)更多的相關值的話,因爲最小角迴歸能夠看到迴歸路徑,此時用LassoLarsCV比較好。場景二: 若是咱們的樣本數遠小於樣本特徵數的話,用LassoLarsCV也比LassoCV好。其他場景最好用LassoCV。
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。而實際上咱們獲得的數據大部分都不能知足這個要求,實際應用中我沒有用到過這個看上去很美的類。
損失函數:
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類。
ElasticNetCV類的損失函數和損失函數的優化方法徹底與ElasticNet類相同,區別在於驗證方法。
驗證方法:
ElasticNetCV類對超參數\(\alpha\)和
\[ \rho \]
使用了交叉驗證,來幫忙咱們選擇合適的\(\alpha\)和\(\rho\)。在初始化ElasticNetCV類時候,咱們能夠傳一組備選的\(\alpha\)值和\(\rho\),10個,100個均可以。ElasticNetCV類會幫咱們選擇一個合適的\(\alpha\)和\(\rho\)。免去了咱們本身去一輪輪篩選\(\alpha\)和\(\rho\)的苦惱。
使用場景:
ElasticNetCV類用在咱們發現用Lasso迴歸太過(太多特徵被稀疏爲0),而用Ridge迴歸又正則化的不夠(迴歸係數衰減的太慢)的時候。通常不推薦拿到數據就直接就上ElasticNetCV。
損失函數:
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比較方便。
OrthogonalMatchingPursuitCV類的損失函數和損失函數的優化方法徹底與OrthogonalMatchingPursuit類相同,區別在於驗證方法。
驗證方法:
OrthogonalMatchingPursuitCV類使用交叉驗證,在S折交叉驗證中以MSE最小爲標準來選擇最好的\(n_{non-zero-coefs}\)。
使用場景:
OrthogonalMatchingPursuitCV類一般用在稀疏迴歸係數的特徵選擇上,這點和LassoCV有相似的地方。不過因爲它的損失函數優化方法是前向選擇算法,精確度較低,通常狀況不是特別推薦用,用LassoCV就夠,除非你對稀疏迴歸係數的精確個數很在乎,那能夠考慮用OrthogonalMatchingPursuitCV。
從這節到第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類。
MultiTaskLassoCV類的損失函數和損失函數的優化方法徹底與MultiTaskLasso類相同,區別在於驗證方法。
驗證方法:
MultiTaskLassoCV類對超參數\(\alpha\)使用了交叉驗證,來幫忙咱們選擇一個合適的\(\alpha\)。在初始化LassoLarsCV類時候,咱們能夠傳一組備選的\(\alpha\)值,10個,100個均可以。MultiTaskLassoCV類會幫咱們選擇一個合適的\(\alpha\)。
使用場景:
MultiTaskLassoCV是多個迴歸模型須要一塊兒共享樣本特徵一塊兒擬合時候的首選。它能夠保證選到的特徵每一個模型都用到。不會出現某個模型選到了某特徵而另外一個模型沒選到這個特徵的狀況。
損失函數:
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類。
MultiTaskElasticNetCV類的損失函數和損失函數的優化方法徹底與MultiTaskElasticNet類相同,區別在於驗證方法。
驗證方法:
MultiTaskElasticNetCV類對超參數\(\alpha\)和
\[ \rho \]
使用了交叉驗證,來幫忙咱們選擇合適的\(\alpha\)和\(\rho\)。在初始化MultiTaskElasticNetCV類時候,咱們能夠傳一組備選的\(\alpha\)值和\(\rho\),10個,100個均可以。ElasticNetCV類會幫咱們選擇一個合適的\(\alpha\)和\(\rho\)。免去了咱們本身去一輪輪篩選\(\alpha\)和\(\rho\)的苦惱。
使用場景:
MultiTaskElasticNetCV是多個迴歸模型須要一塊兒共享樣本特徵一塊兒擬合時候的兩個備選之一,首選是MultiTaskLassoCV。若是咱們發現用MultiTaskLassoCV時迴歸係數衰減的太快,那麼能夠考慮用MultiTaskElasticNetCV。
第17和18節講的都是貝葉斯迴歸模型。貝葉斯迴歸模型假設先驗機率,似然函數和後驗機率都是正態分佈。先驗機率是假設模型輸出Y是符合均值爲\(X\theta\)的正態分佈,正則化參數\(\alpha\)被看做是一個須要從數據中估計獲得的隨機變量。迴歸係數\(\theta\)的先驗分佈規律爲球形正態分佈,超參數爲\(\lambda\)。咱們須要經過最大化邊際似然函數來估計超參數\(\alpha\)和\(\lambda\),以及迴歸係數\(\theta\)。
此處對損失函數即負的最大化邊際似然函數很少討論,不過其形式和Ridge迴歸的損失函數很像,因此也取名BayesianRidge。
使用場景:
****若是咱們的數據有不少缺失或者矛盾的病態數據,能夠考慮BayesianRidge類,它對病態數據魯棒性很高,也不用交叉驗證選擇超參數。可是極大化似然函數的推斷過程比較耗時,通常狀況不推薦使用。
ARDRegression和BayesianRidge很像,惟一的區別在於對迴歸係數\(\theta\)的先驗分佈假設。BayesianRidge假設\(\theta\)的先驗分佈規律爲球形正態分佈,而ARDRegression丟掉了BayesianRidge中的球形高斯的假設,採用與座標軸平行的橢圓形高斯分佈。這樣對應的超參數\(\lambda\)有n個維度,各不相同。而上面的BayesianRidge中球形分佈的\(\theta\)對應的\(\lambda\)只有一個。
ARDRegression也是經過最大化邊際似然函數來估計超參數\(\alpha\)和\(\lambda\)向量,以及迴歸係數\(\theta\)。
使用場景:
****若是咱們的數據有不少缺失或者矛盾的病態數據,能夠考慮BayesianRidge類,若是發現擬合很差,能夠換ARDRegression試一試。由於ARDRegression對迴歸係數先驗分佈的假設沒有BayesianRidge嚴格,某些時候會比BayesianRidge產生更好的後驗結果。
以上就是scikit-learn中線性迴歸的一個總結,但願能夠幫到朋友們。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)