1. 程式人生 > >[050]Python 機器學習系列之線性迴歸篇深度詳細

[050]Python 機器學習系列之線性迴歸篇深度詳細

本次推文介紹用線性模型處理迴歸問題。 從簡單問題開始,先處理一個響應變數和一個解釋變數的一元問題。 然後,介紹多元線性迴歸問題(multiple linear regression),線性約束由多個解釋變數構成。 緊接著,介紹多項式迴歸分析(polynomial regression 問題),一種具有非線性關係的多元線性迴歸問題。 最後,介紹如果訓練模型獲取目標函式最小化的引數值。 在研究一個大資料集問題之前,先從一個小問題開始學習建立模型和學習演算法

一元線性迴歸

假設你想計算匹薩的價格。 雖然看看選單就知道了,不過也可以用機器學習方法建一個線性迴歸模型,通過分析匹薩的直徑與價格的資料的線性關係,來預測任意直徑匹薩的價格。 先用 scikitlearn 寫出迴歸模型,然後介紹模型的用法,以及將模型應用到具體問題中。 假設我們查到了部分匹薩的直徑與價格的資料,這就構成了訓練資料,如下表所示:


【Python機器學習】系列之線性迴歸篇【深度詳細】


可以用 matplotlib 畫出圖形:


【Python機器學習】系列之線性迴歸篇【深度詳細】
【Python機器學習】系列之線性迴歸篇【深度詳細】


上圖中,'x'軸表示匹薩直徑,'y'軸表示匹薩價格。 能夠看出,匹薩價格與其直徑正相關,這與我們的日常經驗也比較吻合,自然是越大越貴。 下面就用 scikit-learn 來構建模


【Python機器學習】系列之線性迴歸篇【深度詳細】


預測一張 12 英寸匹薩價格:$13.68

一元線性迴歸假設解釋變數和響應變數之間存線上性關係、、這個線性模型所構成的空間是一個超平面(hyperplane)。 超平面是 n 維歐氏空間中餘維度、於一的線性子空間,如平面中的直線、空間中的平面、,總比包含它的空間少一維。 在一元線性迴歸中,一個維度是響應變數,另一個維度是解釋變數,總共兩維。 因此,其超平面只有一維,就是一條線

上述程式碼中 sklearn.linear_model.LinearRegression 類是一個估計器(estimator)。 估計 器依據觀測值來預測結果。 在 scikit-learn 裡面,所有的估計器都帶有 fit() 和 predict() 方法。 fit() 用來分析模型引數,predict() 是通過 fit() 算出的模型引數構成的模型,對解釋變數進行預測獲得的值。 因為所有的估計器都有這兩種方法,所有 scikit-learn 很容易實驗不同的模型。 LinearRegression 類的 fit() 方法學習下面的一元線性迴歸模型:


【Python機器學習】系列之線性迴歸篇【深度詳細】


y 表示響應變數的預測值,本例指匹薩價格預測值, 是解釋變數,本例指匹薩直徑。 截距和相關係數 是線性迴歸模型最關心的事情. 下圖中的直線就是匹薩直徑與價格的線性關係。 用這個模型,可以計算不同直徑的價格,8 英寸 $7.33,20 英寸 $18.75


【Python機器學習】系列之線性迴歸篇【深度詳細】
【Python機器學習】系列之線性迴歸篇【深度詳細】


一元線性迴歸擬合模型的引數估計常用方法是普通最小二乘法(ordinary least squares )或線性最小二乘法(linear least squares)。 首先,我們定義出擬合成本函式,然後對引數進行數理統計

帶成本函式的模型擬合評估

** 下圖是由若干引數生成的迴歸直線。 如何判斷哪一條直線才是最佳擬合呢?


【Python機器學習】系列之線性迴歸篇【深度詳細】
【Python機器學習】系列之線性迴歸篇【深度詳細】


成本函式(cost function)也叫損失函式(loss function),用來定義模型與觀測值的誤差。 模型預測的價格與訓練集資料的差異稱為殘差(residuals)或訓練誤差(training errors)。 後面會用模型計算測試集,那時模型預測的價格與測試集資料的差異稱為預測誤差(prediction errors)或訓練誤差(test errors)

模型的殘差是訓練樣本點與線性迴歸模型的縱向距離,如下圖所示:


【Python機器學習】系列之線性迴歸篇【深度詳細】
【Python機器學習】系列之線性迴歸篇【深度詳細】


我們可以通過殘差之和最小化實現最佳擬合,也就是說模型預測的值與訓練集的資料最接近就是最佳擬合。 對模型的擬合度進行評估的函式稱為殘差平方和(residual sum of squares)成本函式。 就是讓所有訓練資料與模型的殘差的平方之和最小化,如下所示:


【Python機器學習】系列之線性迴歸篇【深度詳細】


其中, 是觀測值, 是預測值。 殘差平方和計算如下:


【Python機器學習】系列之線性迴歸篇【深度詳細】

解一元線性迴歸的最小二乘法

通過成本函式最小化獲得引數,先求相關係數貝塔。 按照頻率論的觀點,首先需要計算 x 的方差和 x 與 y 的協方差

方差是用來衡量樣本分散程度的。 如果樣本全部相、、,那麼方差為 0。 方差越小,表示樣本越集中,反正則樣本越分散。 方差計算公式如下:


【Python機器學習】系列之線性迴歸篇【深度詳細】
【Python機器學習】系列之線性迴歸篇【深度詳細】


Numpy 裡面有 var 方法可以直接計算方差,ddof 引數是貝塞爾 (無偏估計) 校正係數(Bessel'scorrection),設定為 1,可得樣本方差無偏估計量


【Python機器學習】系列之線性迴歸篇【深度詳細】

協方差表示兩個變數的總體的變化趨勢。 如果兩個變數的變化趨勢一致,也就是說如果其中一個大於自身的期望值,另外一個也大於自身的期望值,那麼兩個變數之間的協方差就是正值。 如果兩個變數的變化趨勢相反,即其中一個大於自身的期望值,另外一個卻小於自身的期望值,那麼兩個變數之間的協方差就是負值。 如果兩個變數不相關,則協方差為 0,變數線性無關不表示一定沒有其他相關
性。 協方差公式如下:


【Python機器學習】系列之線性迴歸篇【深度詳細】
【Python機器學習】系列之線性迴歸篇【深度詳細】

現在有了方差和協方差,就可以計算相關係統貝塔了


【Python機器學習】系列之線性迴歸篇【深度詳細】


算出貝塔後,就可以計算阿爾法了:


【Python機器學習】系列之線性迴歸篇【深度詳細】


將前面的資料帶入公式就可以求出阿爾法了:
α = 12.9 − 0.9762931034482758 × 11.2 = 1.9655172413793114
這樣就通過最小化成本函式求出模型引數了。 把匹薩直徑帶入方程就可以求出對應的價格了,如 11 英寸直徑價格 $12.70,18 英寸直徑價格 $19.54

模型評估

前面用學習演算法對訓練集進行估計,得出了模型的引數。 如何評價模型在現實中的表現呢?現在假設有另一組資料,作為測試集進行評估


【Python機器學習】系列之線性迴歸篇【深度詳細】


有些度量方法可以用來評估預測效果,我們用 R 方(r-squared)評估匹薩價格預測的效果。 R 方也叫確定係數(coefficient of determination),表示模型對現實資料擬合的程度。 計算 R 方的方法有幾種。 一元線性迴歸中 R 方、、於皮爾遜積矩相關係數(Pearson product moment correlation coefficient 或 Pearson's r)的平方
這種方法計算的 R 方一定介於 0~1 之間的正數。 其他計算方法,包括 scikit-learn 中的方法,不是用皮爾遜積矩相關係數的平方計算的,因此當模型擬合效果很差的時候 R 方會是負值。 下面用 scikitlearn 方法來計算 R 方


【Python機器學習】系列之線性迴歸篇【深度詳細】


=56.8
然後,計算殘差平方和,和前面的一樣:


【Python機器學習】系列之線性迴歸篇【深度詳細】


最後用下面的公式計算 R 方:


【Python機器學習】系列之線性迴歸篇【深度詳細】

R 方是 0.6620 說明測試集裡面過半數的價格都可以通過模型解釋。 現在,用 scikit-learn 來驗證一下。 LinearRegression 的 score 方法可以計算 R 方:


【Python機器學習】系列之線性迴歸篇【深度詳細】

多元線性迴歸

可以看出匹薩價格預測的模型 R 方值並不顯著。 如何改進呢?
匹薩的價格其實還會受到其他因素的影響。 比如,匹薩的價格還與上面的輔料有關。 讓我們再為模型增加一個解釋變數。 用一元線性迴歸已經無法解決了,我們可以用更具一般性的模型來表示,即多元線性迴歸


【Python機器學習】系列之線性迴歸篇【深度詳細】


寫成矩陣形式如下:


【Python機器學習】系列之線性迴歸篇【深度詳細】


一元線性迴歸可以寫成如下形式:


【Python機器學習】系列之線性迴歸篇【深度詳細】


其中,Y 是訓練集的響應變數列向量,貝塔是模型引數列向量。 X 稱為設計矩陣,是 m*n 維訓練集的解釋變數矩陣。 m 是訓練集樣本數量,n 是解釋變數個數。 增加輔料的匹薩價格預測模型訓練集如下表所示:


【Python機器學習】系列之線性迴歸篇【深度詳細】


同時要升級測試集資料:


【Python機器學習】系列之線性迴歸篇【深度詳細】


學習演算法評估三個引數的值:兩個相關因子和一個截距。 的求解方法可以通過矩陣運算來實現


【Python機器學習】系列之線性迴歸篇【深度詳細】


矩陣沒有除法運算,所以用矩陣的轉置運算和逆運算來實現:


【Python機器學習】系列之線性迴歸篇【深度詳細】


通過 Numpy 的矩陣操作就可以完成:


【Python機器學習】系列之線性迴歸篇【深度詳細】


[[1.1875][1.01041667][0.39583333]]

有了引數,就來更新價格預測模型:


【Python機器學習】系列之線性迴歸篇【深度詳細】


Predicted: [10.06250019], Target: [11]Predicted: [10.28125019], Target: [8.5]Predicted: [13.09375019], Target: [15]Predicted: [18.14583353], Target: [18]Predicted: [13.31250019], Target: [11]R-squared: 0.77

增加解釋變數讓模型擬合效果更好了。 為什麼只用一個測試集評估一個模型的效果是不準確的,如何通過將測試集資料分塊的方法來測試,讓模型的測試效果更可靠。 不過現在至少可以認為,匹薩價格預測問題,多元迴歸確實比一元迴歸效果更好。 假如解釋變數和響應變數的關係不是線性的呢?下面來研究一個特別的多元線性迴歸的情況,可以用來構建非線性關係模型

多項式迴歸**

下面用多項式迴歸,一種特殊的多元線性迴歸方法,增加了指數項( 的次數大於 1)。 現實世界中的曲線關係全都是通過增加多項式實現的,其實現方式和多元線性迴歸類似。 本例還用一個解釋變數,匹薩直徑。 用下面的資料對兩種模型做個比較:


【Python機器學習】系列之線性迴歸篇【深度詳細】


二次迴歸(Quadratic Regression),即迴歸方程有個二次項,公式如下:


【Python機器學習】系列之線性迴歸篇【深度詳細】


只用一個解釋變數,但是模型有三項,通過第三項(二次項)來實現曲線關係。 PolynomialFeatures 轉換器可以用來解決這個問題。 程式碼如下:


【Python機器學習】系列之線性迴歸篇【深度詳細】
【Python機器學習】系列之線性迴歸篇【深度詳細】


[[6], [8], [10], [14], [18]][[1 6 36][1 8 64][1 10 100][1 14 196][1 18 324]][[6], [8], [11], [16]][[1 6 36][1 8 64][1 11 121][1 16 256]]一元線性迴歸 r-squared 0.809726832467
二次迴歸 r-squared 0.867544458591

效果如上圖所示,直線為一元線性迴歸(R 方 0.81),曲線為二次迴歸(R 方 0.87),其擬合效果更佳。 還有三次迴歸,就是再增加一個立方項(β3x3 )。 同樣方法擬合,效果如下圖所示:


【Python機器學習】系列之線性迴歸篇【深度詳細】
【Python機器學習】系列之線性迴歸篇【深度詳細】


[[1 6 36 216][1 8 64 512][1 10 100 1000][1 14 196 2744][1 18 324 5832]][[1 6 36 216][1 8 64 512][1 11 121 1331][1 16 256 4096]]二次迴歸 r-squared 0.867544458591三次迴歸 r-squared 0.835692454062

七次迴歸,效果如下圖所示:


【Python機器學習】系列之線性迴歸篇【深度詳細】
【Python機器學習】系列之線性迴歸篇【深度詳細】

二次迴歸 r-squared 0.867544458591
七次迴歸 r-squared 0.487942421984

可以看出,七次擬合的 R 方值更低,雖然其圖形基本經過了所有的點。 可以認為這是擬合過度(overfitting)的情況。 這種模型並沒有從輸入和輸出中推匯出一般的規律,而是記憶訓練集的結果,這樣在測試集的測試效果就不好了

正則化

正則化(Regularization)是用來防止擬合過度的一堆方法。 正則化向模型中增加資訊,經常是一種對抗複雜性的手段。 與奧卡姆剃刀原理(Occam's razor)所說的具有最少假設的論點是最好的觀點類似。 正則化就是用最簡單的模型解釋資料

scikit-learn 提供了一些方法來使線性迴歸模型正則化。 其中之一是嶺迴歸 (Ridge Regression,RR,也叫 Tikhonov regularization),通過放棄最小二乘法的無偏性,以損失部分資訊、降低精度為代價獲得迴歸係數更為符合實際、更可靠的迴歸方法。 嶺迴歸增加 L2 範數項(相關係數向量平方和的平方根)來調整成本函式(殘差平方和):


【Python機器學習】系列之線性迴歸篇【深度詳細】


scikit-learn 也提供了最小收縮和選擇運算元 (Least absolute shrinkage and selection operator,LASSO),增加 L1 範數項(相關係數向量平方和的平方根)來調整成本函式(殘差平方和):


【Python機器學習】系列之線性迴歸篇【深度詳細】


LASSO 方法會產生稀疏引數,大多數相關係數會變成 0,模型只會保留一小部分特徵。 而嶺迴歸還是會保留大多數儘可能小的相關係數。 當兩個變數相關時,LASSO 方法會讓其中一個變數的相關係數會變成 0,而嶺迴歸是將兩個係數同時縮小
scikit-learn 還提供了彈性網(elastic net)正則化方法,通過線性組合 L1 和 L2 兼具 LASSO 和嶺迴歸的內容。 可以認為這兩種方法是彈性網正則化的特例

梯度下降法擬合模型

前面的內容全都是通過最小化成本函式來計算引數的:


【Python機器學習】系列之線性迴歸篇【深度詳細】


這裡 X 是解釋變數矩陣,當變數很多(上萬個)的時候, 右邊第一項計算量會非常大。 另外,如果右邊第一項行列式為 0,即奇異矩陣,那麼就無法求逆矩陣了。 這裡我們介紹另一種引數估計的方法,梯度下降法(gradient descent)。 擬合的目標並沒有變,我們還是用成本函式最小化來進行引數估計

梯度下降法被比喻成一種方法,一個人蒙著眼睛去找從山坡到溪谷最深處的路。 他看不到地形圖,所以只能沿著最陡峭的方向一步一步往前走。 每一步的大小與地勢陡峭的程度成正比。 如果地勢很陡 峭,他就走一大步,因為他相信他仍在高出,還沒有錯過溪谷的最低點。 如果地勢比較平坦,他就走一小步。 這時如果再走大步,可能會與最低點失之交臂。 如果真那樣,他就需要改變方向,重新朝著溪谷的最低點前進。 他就這樣一步一步的走啊走,直到有一個點走不動了,因為路是平的了,於是他卸下眼罩,已經到了谷底深處,小龍女在、、他

通常,梯度下降演算法是用來評估函式的區域性最小值的。 我們前面用的成本函式如下:


【Python機器學習】系列之線性迴歸篇【深度詳細】


可以用梯度下降法來找出成本函式最小的模型引數值。 梯度下降法會在每一步走完後,計算對應位置的導數,然後沿著梯度(變化最快的方向)相反的方向前進。 總是垂直於、、高線

需要注意的是,梯度下降法來找出成本函式的區域性最小值。 一個三維凸(convex)函式所有點構成的圖行像一個碗。 碗底就是唯一區域性最小值。 非凸函式可能有若干個區域性最小值,也就是說整個圖形看著像是有多個波峰和波谷。 梯度下降法只能保證找到的是區域性最小值,並非全域性最小值。 殘差平方和構成的成本函式是凸函式,所以梯度下降法可以找到全域性最小值

梯度下降法的一個重要超引數是步長(learning rate),用來控制矇眼人步子的大小,就是下降幅度。 如果步長足夠小,那麼成本函式每次迭代都會縮小,直到梯度下降法找到了最優引數為止。 但是,步長縮小的過程中,計算的時間就會不斷增加。 如果步長太大,這個人可能會重複越過谷底,也就是梯度下降法可能在最優值附近搖擺不定

如果按照每次迭代後用於更新模型引數的訓練樣本數量劃分,有兩種梯度下降法。 批量梯度下降(Batch gradient descent)每次迭代都用所有訓練樣本。 隨機梯度下降(Stochastic gradientdescent,SGD)每次迭代都用一個訓練樣本,這個訓練樣本是隨機選擇的。 當訓練樣本較多的時候,隨機梯度下降法比批量梯度下降法更快找到最優引數。 批量梯度下降法一個訓練集只能產生一個結果。 而 SGD 每次執行都會產生不同的結果。 SGD 也可能找不到最小值,因為升級權重的時候只用一個訓練樣本。 它的近似值通常足夠接近最小值,尤其是處理殘差平方和這類凸函式的時候

下面用 scikit-learn 的 SGDRegressor 類來計算模型引數。 它可以通過優化不同的成本函式來擬合線性模型,預設成本函式為殘差平方和。 本例中,我們用波士頓住房資料的 13 個解釋變數來預測房屋價格:


【Python機器學習】系列之線性迴歸篇【深度詳細】


交叉驗證 R 方值: [0.64102297 0.65659839 0.80237287 0.67294193 0.57322387]交叉驗證 R 方均值: 0.669232006274測試集 R 方值: 0.787333341357

總結

本次推文介紹了三類線性迴歸模型。 首先,通過匹薩價格預測的例子介紹了一元線性迴歸,一個解釋變數和一個響應變數的線性擬合。 然後,討論了多元線性迴歸,具有更一般形式的若干解釋變數和一個響應變數的問題。 最後,討論了多項式迴歸,一種特殊的多元線性模型,體系瞭解釋變數和響應變數的非線性特徵