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

總結

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容