1. 程式人生 > >【機器學習經典演算法梳理】一.線性迴歸

【機器學習經典演算法梳理】一.線性迴歸

【機器學習經典演算法梳理】是一個專門梳理幾大經典機器學習演算法的部落格。我在這個系列部落格中,爭取用最簡練的語言、較簡潔的數學公式,和清晰成體系的提綱,來盡我所能,對於演算法進行詳盡的梳理。【機器學習經典演算法梳理】系列部落格對於機器學習演算法的梳理,將從“基本思想”、“基本形式”、“過程推導”、“損失函式”、“sklearn庫的引數含義”和“總結”幾個方面去進行。下面,就讓我開始第一個演算法,線性迴歸吧!

 


一.線性迴歸的基本思想:

插一句話:我將盡量都從【“你是誰?”(本質)、“從哪來?”(問題定位及目標)和“到哪去”(解決方法)】三個方面,對一件事物進行闡述。原因無他,就是為了清晰、易記、不容易漏知識點。

1.從本質來說,線性迴歸分屬“迴歸”問題,即linear regression預測的結果是連續值;

2.從定位上說,線性迴歸是廣義線性迴歸的一員(又稱指數族分佈Exponential Family)。線性迴歸的目標,即尋找一條直線。使所有樣本點到這條直線的距離之和最小;

3.從該演算法的解決方法來說,線性迴歸對輸入(input)進來的各個特徵(features)乘上不同的權重,然後相加得到一條直線(一元線性迴歸)或超平面(多元)。我們利用“最小二乘法”,使得各個樣本點到這條直線的距離最小,最終得到這個“權重”。

4.值得一提的是,所謂“線性迴歸”並非意味著所有feature都得是1次的,它意味著,當你將每種特徵組合都分配一個維度的時候(向高維對映),所得到的迴歸結果是一條直線(超平面)。如下圖,你在二維座標系上表示一元特徵的線性迴歸,那麼得到的是直線;但對於多元線性迴歸而言(如最右邊),只有當你在5維空間去描述的時候,才可以得到一個超平面。

 

二.線性迴歸的基本形式:

$$h_{\theta}(x) = X\Theta$$

其中,\(h_{\theta}(x)\)表示對真實值y的預測。

三.推導過程與損失函式:

設真實值為\(y^{(i)}\),線性迴歸演算法值為\(h_{\theta}(x^{(i)})\),很明顯,二者之間應該存在誤差,這種誤差可能是因為未考慮進來的變數、噪聲等因素導致的,根據大數定律,這個誤差應該服從正態分佈,我們在這裡將預測與真實值之間的誤差記作\(\epsilon ^{(i)}\),則有:$$y^{(i)} = h_{\theta}(x^{(i)}) + \epsilon^{(i)}$$

且有:$$\epsilon ^{(i)} \sim N(0,\sigma ^{2}) $$

下面以圖片形式附上推導過程:

 

由上面的對數似然函式\(l(\theta)\)和最大似然估計(MLE)性質可知,兩個紅框內為定值、只有藍框內是變化的,因而若想使\(l(\theta)\)取到最大值,則需要讓藍框內的表示式取到最小。因而我們的損失目標函式即:

$$loss(\theta) = \sum_{i=1}^{m}\left [y ^{(i)} - h_{\theta}(x^{(i)})  \right ]^{2}$$

找到最佳\Theta,讓loss(\(\theta)\)取最大值,因而對損失函式loss(\theta)求導並令導數為零,得到\(\Theta\)解析解:$$(X^{T}X)^{-1}X^{T}\overrightarrow{y}$$

 

四.Ridge、Lasso與正則約束:

我們常見的正則約束主要有兩種——L1-norm,L2-norm,其實還有個L0-norm。

1.L0範數:

L0範數指的是全部非零元素的個數。可見L0範數可以達到使特徵稀疏的效果。而使得特徵變得稀疏,是非常有意義的,這種意義體現在以下兩點:

(1)一方面,這樣增強了模型的可解釋性——在你手裡有一份模型預測所得的結果,當你發現,有200個特徵影響著這個結果的時候,你會覺得無比頭大,難以解釋每個特徵對結果的影響;但當你使特徵變得稀疏,只有5個特徵非零時,你就可以很輕鬆地搞清結果如何受這5個特徵的影響;

(2)另一方面,稀疏約束可以完成對特徵的選擇——我們得到的原始資料中,有許多特徵都對結果影響甚微,甚至根本就沒有影響。這些特徵資訊的存在,導致模型可以在訓練集上學到這些“噪聲”,從而或許會對訓練集的誤差減小有幫助;然而在測試集上進行預測時,這些無用的特徵反而被考慮進去,反而干擾了結果預測。

然而,L0範數甚至只是一個定義,我們難以去直接將L0範數加入損失函式中進行求導等計算。同時我們發現L1範數同樣可以使特徵達到稀疏的效果,所以我們在“稀疏約束”的實際運用中其實被大量應用的,是L1範數。

2.L1範數與LASSO:

L1範數基本形式:$$\left \| \theta \right \|_{1} = \sum_{i}\left | \theta_{i} \right |$$

由前已知,L1範數是稀疏約束,那麼將L1範數和線性迴歸損失函式聯絡起來,就可以在利用最小二乘法找到“最優直線”的同時,將許多不重要的特徵權重置為0:$$Loss = \sum_{i=1}^{m}\left [y ^{(i)} - h_{\theta}(x^{(i)}) \right ]^{2}s.t. \sum_{i=1}^{m}\left | \theta \right | \leq C$$

應用拉格朗日乘子法,引入拉格朗日乘子\(\lambda\),我們可將有約束的最小化Loss問題轉化成無約束的最小化Loss問題:$$Lasso Loss = \sum_{i=1}^{m}\left [y ^{(i)} - h_{\theta}(x^{(i)}) \right ]^{2}+\lambda\sum_{i=1}^{m}\left | \theta_{i} \right |$$

在這裡,將L1範數稱作損失函式的“正則項”,稱作L1正則,就是對模型引數的一種約束,或曰——懲罰。而採取了L1正則的線性迴歸,又稱“LASSO”。式中的\(\lambda\)作為一個權衡因子,權衡著L1正則項對於損失函式的懲罰力度。至於為何L1正則可以使特徵變得稀疏,將在L2正則之後一併探討。

3.L2範數與Ridge:

L2範數基本形式:$$\left \| \theta \right \|_{2} = \sum_{i} \left (\theta_{i}^{2}  \right )^{1/2}$$

L2範數介紹:如上面的公式,L2範數就是全部模型引數(即各特徵權重)的平方和。L2範數可以通過對過大的模型引數\(\theta\)的懲罰,使得模型相對簡單、各引數(權重)取值較小,得到一個較簡單的模型,從而有效降低過擬合的情況。那麼為什麼減小各模型引數、使模型更簡單就可以減小過擬合了呢?

依我所見,由於L2範數作為線性迴歸損失函式的正則項,是全體模型引數\(\theta\)的平方之和,所以引數\(\theta\)自然是越小越好;而損失函式的第一項,即每個樣本點的誤差平方和,會隨著模型引數\(\theta\)的增大而減小,因而引數\(\theta\)自然是越大越好,但自然也會導致過擬合。那麼在加入L2正則、衰減某些特徵的權重時就涉及到“衰減哪些特徵權重”的問題。對於重要的特徵,如果被L2正則衰減了權重,則會導致損失函式第一項(每個樣本點的誤差平方和)急速增長,而該權重的衰減對損失函式最小化的貢獻就顯得微不足道了;相反,如果是不重要的特徵,其權重衰減對於損失函式第一項沒什麼影響,同時還會使損失函式第二項——L2正則項減小,則對損失函式最小化是有貢獻的。因而L2正則項的加入會衰減不重要的特徵的權重,而一旦不重要的特徵被模型習得,就會導致過擬合。從這點來說,L2對不重要特徵的權重進行衰減,自然是有助於模型避免過擬合嘍!

加了L2正則項的線性迴歸:$$Loss = \sum_{i=1}^{m}\left [y ^{(i)} - h_{\theta}(x^{(i)}) \right ]^{2} s.t.\sum_{i} \theta_{i}^{2} \leq C$$

同上,使用拉格朗日乘子法,引入“權衡因子”\(\lambda\),可得下式(引入L2正則的線性迴歸稱為Ridge迴歸):

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

L2正則會使各特徵的權重衰減,尤其是重要性較低的特徵的權重,然而卻並不會使某一權重衰減成0,最多隻會接近0,因而L2正則不是“稀疏約束”。至於原因?馬上道來——

4.L1正則可使特徵稀疏、L2正則可衰減特徵權重的原因: 

$$Lasso : \mathop{\arg\min}_{\theta} \left (\sum_{i=1}^{m}\left [y ^{(i)} - h_{\theta}(x^{(i)})   \right ]^{2}   \right )s.t.\sum_{i=1}^{m}\left | \theta \right | \leq C$$

$$Ridge : \mathop{\arg\min}_{\theta} \left (\sum_{i=1}^{m}\left [y ^{(i)} - h_{\theta}(x^{(i)})   \right ]^{2}   \right )s.t.\sum_{i} \theta_{i}^{2} \leq C$$

如圖所示,我們假設該模型中只有兩個引數,然後根據帶有約束的Lasso和Ridge的損失函式繪製出了兩張圖。彩色線為二者相同的第一項——誤差平方和的最優解等高線(由於是二次函式,所以是凸的)。 L1正則項由於是絕對值不等式約束,故取值在一個菱形內部;L2正則項由於是二次不等式約束,因而取值在一個圓內。

可見,L1-ball 與L2-ball 的最大的區別就是,L1-ball在座標軸上是一個“尖”,也就是說在座標軸處不可微;L2-ball處處圓滑。所以除非等高線位置非常趕巧,否則等高線與L1-ball的第一次相交基本都在座標軸的尖上。如上面左圖,等高線交L1-ball於w2軸,這就意味著w1=0,L1正則的稀疏效應顯現出來了。

       相比之下,L2-ball 就沒有這樣的性質。因為L2-ball處處圓滑,所以等高線交L2-ball於座標軸之上的可能性就小很多,因而L2不具備稀疏性。

 

五.sklearn庫的引數含義

Ridge迴歸引數解釋: sklearn.linear_model . Ridge
引數 解釋
alpha:float

正則項力度,即“權衡因子”\(\lambda\)。

在SVC、LogisticRegression或LinearSVC中,C就是alpha的倒數

可以傳入一個list,這個list的shape必須和特徵數目相同,以指定每個特徵的“懲罰力度”。

fit_intercept : boolean

預設為True,意思是擬合數據的偏度。若設為False,則應該提前對資料進行處理,將其“中心化”

關於資料中心化,即“標準化(Standardization)”,詳見資料的歸一化、標準化

tol : float 結束迭代時,結果的精度。
屬性 解釋
coef_ 權重向量(所有模型引數)
intercept_  結果裡面的截距項

Lasso和Ridge類似,但Lasso的屬性中多了一個sparse_coef_屬性,該屬性的輸出值為scipy.sparse matrix,即稀疏矩陣。具體使用,請參照https://www.jianshu.com/p/1177a0bcb306
 

打字辛苦,碼字不易,若轉載請註明出處,歡迎大家共同討論,謝謝!