迴歸問題-Lasso迴歸

Lasso(Least absolute shrinkage and selection operator)方法是以縮小變量集(降階)爲思想的壓縮估計方法。它通過構造一個懲罰函數,可以將變量的係數進行壓縮並使某些迴歸係數變爲0,進而達到變量選擇的目的。

正則化

正則化(Regularizaiton)是一種防止過擬合的方法。

                                                                        圖1 欠擬合與過擬合

圖來自:百度百科(過擬合)

從圖中可以看出,最右邊的屬於一種過擬合,過擬合的問題通常發生在變量(特徵)過多的時候,這種情況下訓練出的方程總是能很好的擬合訓練數據,也就是損失函數可能非常接近於 0 或者就爲 0。 但是,這樣的曲線會導致它無法泛化到新的數據樣本中。

如果解決過擬合問題?

(1)儘量減少選取變量的數量

可以人工檢查每一項變量,並以此來確定哪些變量更爲重要,保留那些更爲重要的特徵變量。這種做法非常有效,但是其缺點是當捨棄一部分特徵變量時,也捨棄了問題中的一些信息。例如,所有的特徵變量對於預測房價都是有用的,實際上並不想捨棄一些信息或者說捨棄這些特徵變量。

(2)正則化

在正則化中將保留所有的特徵變量,但是會減小特徵變量的數量級。 當有很多特徵變量時,其中每一個變量都能對預測產生一點影響。假設在房價預測的例子中,可以有很多特徵變量,其中每一個變量都是有用的,因此不希望把任何一個變量刪掉,這就導致了正則化概念的發生。

如果應用正則化去解決實際問題?

在圖1中,可以看出最右邊的是過擬合的,但是不想拋棄\theta_{3}\theta_{4}變量自帶的信息,因此加上懲罰項,使得\theta_{3}\theta_{4}足夠小。

優化目標爲:

                                                     \min _{\theta} \frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}

在優化目標的基礎上,添加一些項(懲罰項),如下:

                                      \min _{\theta} \frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+1000 \theta_{3}^{2}+1000 \theta_{4}^{2}

1000 只是隨便寫的一個表示很大的數字。現在,如果想要最小化這個函數,那麼爲了最小化這個新的損失函數,就要讓 \theta_{3}\theta_{4}儘可能小。因爲,如果在原有代價函數的基礎上加上 1000 \theta_{3}^{2}+1000 \theta_{4}^{2}這一項 ,那麼這個新的代價函數將變得很大,所以,當最小化這個新的代價函數時, \theta_{3}\theta_{4}儘可能小或者接近於0,就像我們忽略了這兩個值一樣。如果做到這一點(\theta_{3}\theta_{4}接近於0),那麼我們將得到一個近似的二次函數,並且h_{\theta}中並沒有丟失\theta_{3}\theta_{4}的信息(雖然\theta_{3}\theta_{4}接近於0,但是還是存在的)

但是在真實問題中,一個預測問題可能有上百種特徵,並不知道哪一些是高階多項式的項,就像不知道\theta_{3}\theta_{4}是高階的項。所以,如果假設有一百個特徵,並不知道如何選擇關聯度更好的參數,如何縮小參數的數目等等。 因此在正則化裏,要做的事情,就是把減小損失函數中所有的參數值,(因爲並不知道是哪一個或哪幾個是要去縮小的)。

因此,我們需要修改代價函數,變成如下形式:

 

                                            \frac{1}{2 m}\left[\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+\lambda \sum_{j=1}^{n} \theta_{j}^{2}\right]   

其中\lambda \sum_{j=1}^{n} \theta_{j}^{2}就是正則化項; λ稱爲正則化參數,作用是控平衡擬合訓練的目標和保持參數值較小。

Lasso迴歸模型

Lasso迴歸是在損失函數後,加L1正則化,如下所示:

                                              \frac{1}{2 m}\left[\sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}+ \lambda \sum_{j=1}^{k}\left|w_{j}\right|\right]

m爲樣本個數,k爲參數個數,其中\lambda \sum_{j=1}^{k}\left|w_{j}|\right爲L1正則化。

此外:還有L2正則化:\lambda \sum_{j=1}^{n} w_{j}^{2},加了這種正則化的損失函數模型爲:脊(嶺)迴歸(Ridge Regression)。

爲什麼Lasso可以做降維?

                                             

                                                                                        圖2    

以二維數據空間爲例,說明Lasso和Ridge兩種方法的差異,左圖對應於Lasso方法,右圖對應於Ridge方法。 

如上圖所示,兩個圖是對應於兩種方法的等高線與約束域。紅色的橢圓代表的是隨着λ的變化所得到的殘差平方和,βˆ爲橢圓的中心點,爲對應普通線性模型的最小二乘估計。左右兩個圖的區別在於約束域,即對應的藍色區域。 

等高線和約束域的切點就是目標函數的最優解,Ridge方法對應的約束域是圓,其切點只會存在於圓周上,不會與座標軸相切,則在任一維度上的取值都不爲0,因此沒有稀疏;對於Lasso方法,其約束域是正方形,會存在與座標軸的切點,使得部分維度特徵權重爲0,因此很容易產生稀疏的結果。 

所以,Lasso方法可以達到變量選擇的效果,將不顯著的變量係數壓縮至0,而Ridge方法雖然也對原本的係數進行了一定程度的壓縮,但是任一系數都不會壓縮至0,最終模型保留了所有的變量。

以二維空間爲例,約束域在L1中,爲|\beta _{1}|+|\beta _{2}|=1,對應左圖藍色。

約束域在L2中,爲{\beta_{1}}^{2}+{\beta_{2}}^{2}=1,對應左圖藍色。

 

由圖也可以看出,Lasso的複雜程度由λ來控制,λ越大對變量較多的線性模型的懲罰力度就越大,從而最終獲得一個變量較少的模型。

上述參考:https://blog.csdn.net/xiaozhu_1024/article/details/80585151

參數求解

但是Lasso迴歸有一個很大的問題,就是由於L1正則化項用的是絕對值之和,導致損失函數有不可導的點。也就是說,梯度下降法等優化算法對它統統失效了。

那怎麼才能求損失函數極小值呢?接下來介紹兩種全新的求極值解法:座標軸下降法(coordinate descent)和最小角迴歸法( Least Angle Regression, LARS)

(1)座標軸下降法

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

座標軸下降法的數學依據主要是如下的這個結論:

一個可微的凸函數J(θ),其中θ是nx1的向量,即有n個維度。如果在某一點{\theta}',使得J(θ)在每一個座標軸{\theta}'_{i}(i=1,2,..,n)上都是最小值,那麼J({\theta }'_{i})就是一個全局的最小值。 於是優化目標就是在θ的n個座標軸上(或者說向量的方向上)對損失函數做迭代的下降,當所有的座標軸上的{\theta }'_{i}都達到收斂時,損失函數最小,此時的θ即爲要求的結果。

具體的算法過程:

(1)把θ向量隨機取一個初值。記爲{\theta_{0}}^{0},上面的括號裏面的數字代表我們迭代的輪數,當前初始輪數爲0。

(2)對於第k輪的迭代,我們從{\theta_{1}}^{k}開始,到{\theta_{n}}^{k}爲止,依次求{\theta_{i}}^{k},其中{\theta_{i}}^{k}的表達式如下:

{\theta_{i}}^{k}=argmin J({\theta_{1}}^{k},{\theta_{2}}^{k},..,{\theta_{i-1}}^{k},{\theta_{i}},{\theta_{i+1}}^{k-1},...,{\theta_{n}}^{k-1})也就是說{\theta_{i}}^{k}是使J(\theta )最小化時候的\theta _{i}值。此時J(θ)只有{\theta_{i}}^{k}是變量,其餘均爲常量,因此最小值容易通過求導求得。

(3)檢查\theta^{k}向量和\theta^{k-1}向量在各個維度上的變化情況,如果在所有維度上變化都足夠小,那麼\theta^{k}即爲最終結果,否則轉入2,繼續第k+1輪的迭代。

此外,SVM中對於帶有懲罰項的軟間隔問題,利用的就是此種思想:序列最小優化算法(SMO)。

(2)最小角迴歸法

預備算法:A.前向選擇(Forward Selection)算法

前向選擇算法的原理是是一種典型的貪心算法。要解決的問題是對於:

   Y=X \theta這樣的線性關係,如何求解係數向量θ的問題。其中Y爲 m*1的向量,X爲m*n的矩陣,θ爲n*1的向量。m爲樣本數量,n爲特徵維度。

   把矩陣X看做n個m*1的向量X_{i}(i=1,2,...n),在Y的X變量X_{i}(i=1,2,...n)中,選擇和目標Y最爲接近的一個變量X_{k},(餘弦值的絕對值小,夾角小,則最爲接近)用X_{k}來逼近Y,得到下式:

    \bar{Y}=X_{k} \theta_{k}

    其中: \theta_{\mathbf{k}}=\frac{\left\langle\mathbf{X}_{\mathbf{k}} \mathbf{Y}\right\rangle} {{\left\|\mathbf{X}_{\mathbf{k}}\right\|_{2}}^{2}}

              <>表示兩向量的內積,下面是向量X_{k}二範數的平方,簡單來說就是X_{k}的模長的平方,因爲\left \| X \right \|_{2} =\sqrt{\sum_{i=1}^{n} {X_{i}}^{2}}

    即:\bar{Y} 是 Y在 X_{k}上的投影。那麼,可以定義殘差(residual):Y_{diff} =Y-\bar{Y}。由於是投影,所以很容易知道Y_{diff}X_{k}是正交的。再以Y_{diff}爲新的因變量,去掉X_{k}後,剩下的自變量的集合X_{i}(i=1,2,3...i−1,i+1,...n)爲新的自變量集合,重複剛纔投影和殘差的操作,直到殘差爲0,或者所有的自變量都用完了,才停止算法。

                                  

當X只有2維時,例子如上圖,和Y最接近的是X_{1},首先在X_{1}上面投影,殘差如上圖(1)長虛線。此時X_{1}* \theta_{1}模擬了Y,\theta_{1}模擬了θ(僅僅模擬了一個維度)。接着發現最接近的是X_{2},此時用殘差(Y')接着在X_{2}投影,殘差如圖中短虛線。由於沒有其他自變量了,此時X_{1}* \theta_{1}+X_{2}* \theta_{2}模擬了Y,對應的模擬了兩個維度的θ即爲最終結果。

此算法對每個變量只需要執行一次操作,效率高,速度快。但也容易看出,當自變量不是正交的時候,由於每次都是在做投影,所有算法只能給出一個局部近似解。因此,這個簡單的算法太粗糙。

B.前向梯度(Forward Stagewise)算法

前向梯度算法和前向選擇算法有類似的地方,但是前向梯度算法不是粗暴的用投影,而是每次在最爲接近的自變量X_{t}的方向移動一小步,然後再看殘差Y_{diff}和哪個X_{i}(i=1,2,...n)最爲接近。此時我們也不會把X_{t}去除,因爲我們只是前進了一小步,有可能下面最接近的自變量還是X_{t}。如此進行下去,直到殘差Y_{diff}減小到足夠小,算法停止。

當X只有2維時,例子如上圖,和Y最接近的是,首先在X_{1}上面走一小段距離,此處ε爲一個較小的常量,發現此時的殘差還是和X_{1}最接近。那麼接着沿X_{1}走,一直走到發現殘差不是和X_{1}最接近,而是和X_{2}最接近(夾角小)。接着沿着X_{2}走一小步,發現殘差此時又和X_{1}最接近,那麼開始沿着X_{1}走,走完一步後發現殘差爲0,那麼算法停止。此時Y由剛纔所有的所有步相加而模擬,對應的算出的係數θ即爲最終結果。

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

    最小角迴歸法(Least Angle Regression, LARS)就是一種折中的方法,可以綜合前向梯度算法和前向選擇算法的優點,保留了前向梯度算法一定程度的精確性,同時簡化了前向梯度算法一步步迭代的過程。 

最小角迴歸過程如下:

首先,還是找到與因變量Y最接近或者相關度最高的自變量X_{k},使用類似於前向梯度算法中的殘差計算方法,得到新的目標Y_{diff},此時不用和前向梯度算法一樣小步小步的走。而是直接向前走直到出現一個X_{t},使得X_{t}Y_{diff}的相關度和X_{k}Y_{diff}的相關度是一樣的,此時殘差Y_{diff}就在X_{t}X_{k}角平分線方向上,此時我們開始沿着這個殘差角平分線走,直到出現第三個特徵X_{p}Y_{diff}的相關度足夠大的時候,即X_{p}到當前殘差Y_{diff}的相關度和\theta_{k}\theta_{t}Y_{diff}的一樣。將其也叫入到Y的逼近特徵集合中,並用Y的逼近特徵集合的共同角分線,作爲新的逼近方向。以此循環,直到Y_{diff}足夠的小,或者說所有的變量都已經取完了,算法停止。此時對應的係數θ即爲最終結果。

                                

當θ只有2維時,例子如上圖,和Y最接近的是X_{1},首先在X_{1}上面走一段距離,一直到殘差在X_{1}X_{2}的角平分線(紅色的{\theta}'與藍色的{\theta}'相等)上,此時沿着角平分線走,直到殘差最夠小時停止,此時對應的係數β即爲最終結果。

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

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

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

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

    主要的缺點是:

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

               以上是劉建平老師博客的主要內容,詳見:https://www.cnblogs.com/pinard/p/6018889.html

關於LARS與Lasso迴歸關係,

用下面的圖,從數學角度,進一步解釋LARS。

                                    

如上圖所示,如果把X_{1}單獨選出來就和Y形成一個線性迴歸問題,那它肯定有最小二乘解,最小二乘解就是過Y往X_{1}直線上做一條垂線,交於這個點,那這個點就是隻有參與了這個線性迴歸問題的最小二乘解的位置。從原點出發,向着這個局部的最小二乘解出發,在前進的時候,我們每走到的一個點和Y都會形成一個殘差向量(圖中紅色的標誌),殘差向量一邊會變化,如果最後走到最小二乘解這一點時,殘差和X_{1}垂直,所以殘差向量變成了垂線,此時他與X_{1}之間的相關係數爲零。

                                    

在前進的過程裏,把X_{i}(i=2,3...n)對應的樣本變量也跟Y_{diff}做內積,求他們之間的相關係數,當X_{1}Y_{diff}的相關係數越來越小時,總有某一個時刻,另外有一個變量(可能)X_{k}Y_{diff}的相關係數與X_{1}Y_{diff}的相關係數相同,(圖中k=3)。此時,這個變量X_{3}加進來,加進來之後,我們的前進方向就要修正(沿着角平分線的方向繼續)。

當往角平分線的方向前進時,無論是X_{1}還是X_{3},殘差與兩者的相關係數一定會同時變化,繼續往最小二乘解方向走,走到一定程度,相關係數會越來越小,即殘差向量和角平分線越來越垂直,這時可能加入第三個變量X_{2}X_{2}Y_{diff}的相關係數會在增大,追上X_{1}Y_{diff}的相關係數,此時再把X_{2}加進去,找上一次的角平分線(橙色的那個線)和X_{2}的角平分線。如此類推,每一次都是順着角平分方向前進時,一定可以把所有的變量加進去,然後前進到一個點,這個點就是殘差向量和其他所有變量所形成的樣本變量的相關係數爲零(夾角90°),即殘差向量垂直與所有的X_{i}(i=1,2,3...n)垂直與這個平面,最後求得最小二乘解。

上述過程,可以用下面公式這個公式表達,

                                                          X_{j}^{T}(y-X \theta)=\gamma \cdot s_{j}, \forall j \in \mathrm{A}

(y-X \theta)是殘差,A是樣本集,每一次都是從樣本集中選擇一個X_{j},通過求解內積來選定,一旦內積完成在遊走時,符號(正負號)一般不會變,只會改變內積的大小,\gamma爲內積,s_{j}就是符號函數(大於0等於1,小於0等於-1)。

而Lasso迴歸如下:

loss = \frac{1}{2} \sum_{i=1}^{m}\left(y_{i}-w^{\top} x_{i}\right)^{2}+\lambda \sum_{i=1}^{n}\left|w_{i}\right|

由於涉及到了絕對值問題,所以求解參數過程如下:

loss =\frac{1}{2}\left\|\left[\begin{array}{c}{y_{1}-w^{T} x_{1}} \\ {y_{2}-w^{T} x_{2}} \\ {\cdots} \\ {y_{m}-w^{T} x_{m}}\end{array}\right]\right\|^{2}+\lambda \sum_{i=1}^{n}\left|w_{i}\right|

        =\frac{1}{2}\left\|\left[\begin{array}{c}{y_{1}} \\ {y_{2}} \\ {\cdots} \\ {y_{m}}\end{array}\right]-w^{T}\left[\begin{array}{c}{x_{1}} \\ {x_{2}} \\ {\cdots} \\ {x_{m}}\end{array}\right]\right\|^{2}+\lambda \sum_{i=1}^{n}\left|w_{i}\right|

         =\frac{1}{2}\left\|y-w^{T} X\right\|^{2}+\lambda \sum_{i=1}^{n}\left|w_{i}\right|=\frac{1}{2}\left(y-w^{T} x\right)^{T}\left(y-w^{T} x\right)+\lambda \sum_{i=1}^{n}\left|w_{i}\right|

由於w_{i}正負無法確定,因此將\lambda \sum_{i=1}^{n}\left|w_{i}\right|轉換成\lambda \sum_{i=1}^{N} w_{i} \cdot \operatorname{sign}\left(w_{i}\right)再進行求導,其中\operatorname{sign}\left(w_{i}\right)爲符號函數。

對loss求導有:

      \frac{\partial J(w)}{\partial w}=\frac{1}{2} \frac{\partial}{\partial w}\left(\left(y-w^{T} x\right)^{T}\left(y-w^{T} x\right)\right)+\frac{\partial}{\partial w}\lambda \sum_{i=1}^{N} w_{i} \cdot \operatorname{sign}\left(w_{i}\right)

                  =\frac{1}{2} \frac{\partial}{\partial w}\left((y-X w)^{T}(y-X w)\right)+\lambda \operatorname{sign}\left(w_{i}\right)

                  \begin{array}{l}{=\frac{1}{2} \frac{\partial}{\partial w}\left(w^{T} X^{T} X w-2 w^{T} X y+y^{T} y\right)} +\lambda \operatorname{sign}\left(w_{i}\right)\\ {=\frac{1}{2}\left(X^{T} X w+X^{T} X w-2 X y\right)}+\lambda \operatorname{sign}\left(w_{i}\right) \\ {=X^{T} X w-X y}+\lambda \operatorname{sign}\left(w_{i}\right)\end{array}

\frac{\partial J(w)}{\partial w}=0,有X_{j}^{T}(y-X w) = \lambda \cdot \operatorname{sign}\left(w_{j}\right)          (1)

到這裏可以發現最終w滿足的方程式和LARS很像,不同的是符號函數的情況,這也是導致差異的原因 。我們知道得到公式(1)的前提是對上式的求導,但是都滿足可導嗎?請看下圖:

                                                                     

發現除了約束條件的四個頂點不可導以外,其他均可導,不可導的情況就是某一個\beta爲0,這也是是解釋了爲什麼產生跳躍的原因。

基於上述原因,將LARS做修正,就可以用在Lasso裏面,即如果有一個非零係數(\beta)變爲零,那麼直接將這個變量淘汰,LARS修正算法和lasso就一樣了。

發佈了60 篇原創文章 · 獲贊 36 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章