本次推文介紹用線性模型處理回歸問題。 從簡單問題開始,先處理一個響應變量和一個解釋變量的一元問題。 然后,介紹多元線性回歸問題(multiple linear regression),線性約束由多個解釋變量構成。 緊接著,介紹多項式回歸分析(polynomial regression 問題),一種具有非線性關系的多元線性回歸問題。 最后,介紹如果訓練模型獲取目標函數最小化的參數值。 在研究一個大數據集問題之前,先從一個小問題開始學習建立模型和學習算法
一元線性回歸
假設你想計算匹薩的價格。 雖然看看菜單就知道了,不過也可以用機器學習方法建一個線性回歸模型,通過分析匹薩的直徑與價格的數據的線性關系,來預測任意直徑匹薩的價格。 先用 scikitlearn 寫出回歸模型,然后介紹模型的用法,以及將模型應用到具體問題中。 假設我們查到了部分匹薩的直徑與價格的數據,這就構成了訓練數據,如下表所示:
可以用 matplotlib 畫出圖形:
上圖中,'x'軸表示匹薩直徑,'y'軸表示匹薩價格。 能夠看出,匹薩價格與其直徑正相關,這與我們的日常經驗也比較吻合,自然是越大越貴。 下面就用 scikit-learn 來構建模
預測一張 12 英寸匹薩價格:$13.68
一元線性回歸假設解釋變量和響應變量之間存在線性關系、、這個線性模型所構成的空間是一個超平面(hyperplane)。 超平面是 n 維歐氏空間中余維度、于一的線性子空間,如平面中的直線、空間中的平面、,總比包含它的空間少一維。 在一元線性回歸中,一個維度是響應變量,另一個維度是解釋變量,總共兩維。 因此,其超平面只有一維,就是一條線
上述代碼中 sklearn.linear_model.LinearRegression 類是一個估計器(estimator)。 估計 器依據觀測值來預測結果。 在 scikit-learn 里面,所有的估計器都帶有 fit() 和 predict() 方法。 fit() 用來分析模型參數,predict() 是通過 fit() 算出的模型參數構成的模型,對解釋變量進行預測獲得的值。 因為所有的估計器都有這兩種方法,所有 scikit-learn 很容易實驗不同的模型。 LinearRegression 類的 fit() 方法學習下面的一元線性回歸模型:
y 表示響應變量的預測值,本例指匹薩價格預測值, 是解釋變量,本例指匹薩直徑。 截距和相關系數 是線性回歸模型最關心的事情. 下圖中的直線就是匹薩直徑與價格的線性關系。 用這個模型,可以計算不同直徑的價格,8 英寸 $7.33,20 英寸 $18.75
一元線性回歸擬合模型的參數估計常用方法是普通最小二乘法(ordinary least squares )或線性最小二乘法(linear least squares)。 首先,我們定義出擬合成本函數,然后對參數進行數理統計
帶成本函數的模型擬合評估
**** 下圖是由若干參數生成的回歸直線。 如何判斷哪一條直線才是最佳擬合呢?
成本函數(cost function)也叫損失函數(loss function),用來定義模型與觀測值的誤差。 模型預測的價格與訓練集數據的差異稱為殘差(residuals)或訓練誤差(training errors)。 后面會用模型計算測試集,那時模型預測的價格與測試集數據的差異稱為預測誤差(prediction errors)或訓練誤差(test errors)
模型的殘差是訓練樣本點與線性回歸模型的縱向距離,如下圖所示:
我們可以通過殘差之和最小化實現最佳擬合,也就是說模型預測的值與訓練集的數據最接近就是最佳擬合。 對模型的擬合度進行評估的函數稱為殘差平方和(residual sum of squares)成本函數。 就是讓所有訓練數據與模型的殘差的平方之和最小化,如下所示:
其中, 是觀測值, 是預測值。 殘差平方和計算如下:
解一元線性回歸的最小二乘法
通過成本函數最小化獲得參數,先求相關系數貝塔。 按照頻率論的觀點,首先需要計算 x 的方差和 x 與 y 的協方差
方差是用來衡量樣本分散程度的。 如果樣本全部相、、,那么方差為 0。 方差越小,表示樣本越集中,反正則樣本越分散。 方差計算公式如下:
Numpy 里面有 var 方法可以直接計算方差,ddof 參數是貝塞爾 (無偏估計) 校正系數(Bessel'scorrection),設置為 1,可得樣本方差無偏估計量
協方差表示兩個變量的總體的變化趨勢。 如果兩個變量的變化趨勢一致,也就是說如果其中一個大于自身的期望值,另外一個也大于自身的期望值,那么兩個變量之間的協方差就是正值。 如果兩個變量的變化趨勢相反,即其中一個大于自身的期望值,另外一個卻小于自身的期望值,那么兩個變量之間的協方差就是負值。 如果兩個變量不相關,則協方差為 0,變量線性無關不表示一定沒有其他相關
性。 協方差公式如下:
現在有了方差和協方差,就可以計算相關系統貝塔了
算出貝塔后,就可以計算阿爾法了:
將前面的數據帶入公式就可以求出阿爾法了:
α = 12.9 ? 0.9762931034482758 × 11.2 = 1.9655172413793114
這樣就通過最小化成本函數求出模型參數了。 把匹薩直徑帶入方程就可以求出對應的價格了,如 11 英寸直徑價格 $12.70,18 英寸直徑價格 $19.54
模型評估
前面用學習算法對訓練集進行估計,得出了模型的參數。 如何評價模型在現實中的表現呢?現在假設有另一組數據,作為測試集進行評估
有些度量方法可以用來評估預測效果,我們用 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 方
=56.8
然后,計算殘差平方和,和前面的一樣:
最后用下面的公式計算 R 方:
R 方是 0.6620 說明測試集里面過半數的價格都可以通過模型解釋。 現在,用 scikit-learn 來驗證一下。 LinearRegression 的 score 方法可以計算 R 方:
多元線性回歸
可以看出匹薩價格預測的模型 R 方值并不顯著。 如何改進呢?
匹薩的價格其實還會受到其他因素的影響。 比如,匹薩的價格還與上面的輔料有關。 讓我們再為模型增加一個解釋變量。 用一元線性回歸已經無法解決了,我們可以用更具一般性的模型來表示,即多元線性回歸
寫成矩陣形式如下:
一元線性回歸可以寫成如下形式:
其中,Y 是訓練集的響應變量列向量,貝塔是模型參數列向量。 X 稱為設計矩陣,是 m*n 維訓練集的解釋變量矩陣。 m 是訓練集樣本數量,n 是解釋變量個數。 增加輔料的匹薩價格預測模型訓練集如下表所示:
同時要升級測試集數據:
學習算法評估三個參數的值:兩個相關因子和一個截距。 的求解方法可以通過矩陣運算來實現
矩陣沒有除法運算,所以用矩陣的轉置運算和逆運算來實現:
通過 Numpy 的矩陣操作就可以完成:
[[1.1875][1.01041667][0.39583333]]
有了參數,就來更新價格預測模型:
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)。 現實世界中的曲線關系全都是通過增加多項式實現的,其實現方式和多元線性回歸類似。 本例還用一個解釋變量,匹薩直徑。 用下面的數據對兩種模型做個比較:
二次回歸(Quadratic Regression),即回歸方程有個二次項,公式如下:
只用一個解釋變量,但是模型有三項,通過第三項(二次項)來實現曲線關系。 PolynomialFeatures 轉換器可以用來解決這個問題。 代碼如下:
[[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 )。 同樣方法擬合,效果如下圖所示:
[[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
七次回歸,效果如下圖所示:
二次回歸 r-squared 0.867544458591
七次回歸 r-squared 0.487942421984
可以看出,七次擬合的 R 方值更低,雖然其圖形基本經過了所有的點。 可以認為這是擬合過度(overfitting)的情況。 這種模型并沒有從輸入和輸出中推導出一般的規律,而是記憶訓練集的結果,這樣在測試集的測試效果就不好了
正則化
正則化(Regularization)是用來防止擬合過度的一堆方法。 正則化向模型中增加信息,經常是一種對抗復雜性的手段。 與奧卡姆剃刀原理(Occam's razor)所說的具有最少假設的論點是最好的觀點類似。 正則化就是用最簡單的模型解釋數據
scikit-learn 提供了一些方法來使線性回歸模型正則化。 其中之一是嶺回歸 (Ridge Regression,RR,也叫 Tikhonov regularization),通過放棄最小二乘法的無偏性,以損失部分信息、降低精度為代價獲得回歸系數更為符合實際、更可靠的回歸方法。 嶺回歸增加 L2 范數項(相關系數向量平方和的平方根)來調整成本函數(殘差平方和):
scikit-learn 也提供了最小收縮和選擇算子 (Least absolute shrinkage and selection operator,LASSO),增加 L1 范數項(相關系數向量平方和的平方根)來調整成本函數(殘差平方和):
LASSO 方法會產生稀疏參數,大多數相關系數會變成 0,模型只會保留一小部分特征。 而嶺回歸還是會保留大多數盡可能小的相關系數。 當兩個變量相關時,LASSO 方法會讓其中一個變量的相關系數會變成 0,而嶺回歸是將兩個系數同時縮小
scikit-learn 還提供了彈性網(elastic net)正則化方法,通過線性組合 L1 和 L2 兼具 LASSO 和嶺回歸的內容。 可以認為這兩種方法是彈性網正則化的特例
梯度下降法擬合模型
前面的內容全都是通過最小化成本函數來計算參數的:
這里 X 是解釋變量矩陣,當變量很多(上萬個)的時候, 右邊第一項計算量會非常大。 另外,如果右邊第一項行列式為 0,即奇異矩陣,那么就無法求逆矩陣了。 這里我們介紹另一種參數估計的方法,梯度下降法(gradient descent)。 擬合的目標并沒有變,我們還是用成本函數最小化來進行參數估計
梯度下降法被比喻成一種方法,一個人蒙著眼睛去找從山坡到溪谷最深處的路。 他看不到地形圖,所以只能沿著最陡峭的方向一步一步往前走。 每一步的大小與地勢陡峭的程度成正比。 如果地勢很陡 峭,他就走一大步,因為他相信他仍在高出,還沒有錯過溪谷的最低點。 如果地勢比較平坦,他就走一小步。 這時如果再走大步,可能會與最低點失之交臂。 如果真那樣,他就需要改變方向,重新朝著溪谷的最低點前進。 他就這樣一步一步的走啊走,直到有一個點走不動了,因為路是平的了,于是他卸下眼罩,已經到了谷底深處,小龍女在、、他
通常,梯度下降算法是用來評估函數的局部最小值的。 我們前面用的成本函數如下:
可以用梯度下降法來找出成本函數最小的模型參數值。 梯度下降法會在每一步走完后,計算對應位置的導數,然后沿著梯度(變化最快的方向)相反的方向前進。 總是垂直于、、高線
需要注意的是,梯度下降法來找出成本函數的局部最小值。 一個三維凸(convex)函數所有點構成的圖行像一個碗。 碗底就是唯一局部最小值。 非凸函數可能有若干個局部最小值,也就是說整個圖形看著像是有多個波峰和波谷。 梯度下降法只能保證找到的是局部最小值,并非全局最小值。 殘差平方和構成的成本函數是凸函數,所以梯度下降法可以找到全局最小值
梯度下降法的一個重要超參數是步長(learning rate),用來控制蒙眼人步子的大小,就是下降幅度。 如果步長足夠小,那么成本函數每次迭代都會縮小,直到梯度下降法找到了最優參數為止。 但是,步長縮小的過程中,計算的時間就會不斷增加。 如果步長太大,這個人可能會重復越過谷底,也就是梯度下降法可能在最優值附近搖擺不定
如果按照每次迭代后用于更新模型參數的訓練樣本數量劃分,有兩種梯度下降法。 批量梯度下降(Batch gradient descent)每次迭代都用所有訓練樣本。 隨機梯度下降(Stochastic gradientdescent,SGD)每次迭代都用一個訓練樣本,這個訓練樣本是隨機選擇的。 當訓練樣本較多的時候,隨機梯度下降法比批量梯度下降法更快找到最優參數。 批量梯度下降法一個訓練集只能產生一個結果。 而 SGD 每次運行都會產生不同的結果。 SGD 也可能找不到最小值,因為升級權重的時候只用一個訓練樣本。 它的近似值通常足夠接近最小值,尤其是處理殘差平方和這類凸函數的時候
下面用 scikit-learn 的 SGDRegressor 類來計算模型參數。 它可以通過優化不同的成本函數來擬合線性模型,默認成本函數為殘差平方和。 本例中,我們用波士頓住房數據的 13 個解釋變量來預測房屋價格:
交叉驗證 R 方值: [0.64102297 0.65659839 0.80237287 0.67294193 0.57322387]交叉驗證 R 方均值: 0.669232006274測試集 R 方值: 0.787333341357
總結
本次推文介紹了三類線性回歸模型。 首先,通過匹薩價格預測的例子介紹了一元線性回歸,一個解釋變量和一個響應變量的線性擬合。 然后,討論了多元線性回歸,具有更一般形式的若干解釋變量和一個響應變量的問題。 最后,討論了多項式回歸,一種特殊的多元線性模型,體系了解釋變量和響應變量的非線性特征