• <menu id="gyiem"><menu id="gyiem"></menu></menu>
  • <menu id="gyiem"><code id="gyiem"></code></menu>

    機器學習(一) 從一個R語言案例學線性回歸

    原創文章,轉載請務必將下面這段話置于文章開頭處(保留超鏈接)。
    本文轉發自技術世界原文鏈接 http://www.luozeyang.com/2015/03/27/ml1_linear_regression

    寫在前面的話   按照正常的順序,本文應該先講一些線性回歸的基本概念,比如什么叫線性回歸,線性回規的常用解法等。但既然本文名為《從一個R語言案例學會線性回歸》,那就更重視如何使用R語言去解決線性回歸問題,因此本文會先講案例。

    線性回歸簡介

      如下圖所示,如果把自變量(也叫independent variable)和因變量(也叫dependent variable)畫在二維坐標上,則每條記錄對應一個點。線性回規最常見的應用場景則是用一條直線去擬和已知的點,并對給定的x值預測其y值。而我們要做的就是找出一條合適的曲線,也就是找出合適的斜率及縱截矩。
    一維線性回規

    SSE & RMSE

      上圖中的SSE指sum of squared error,也即預測值與實際值之差的平方和,可由此判斷該模型的誤差。但使用SSE表征模型的誤差有些弊端,比如它依賴于點的個數,且不好定其單位。所以我們有另外一個值去稱量模型的誤差。RMSE(Root-Mean-Square Error)。$$RMSE=\sqrt{\frac{SSE}{N}}$$
      由N將其標準化,并且其單位與變量單位相同。   

    $R^2$

      在選擇用于預測的直線時,我們可以使用已知記錄的y值的平均值作為直線,如上圖紅線所示,這條線我們稱之為baseline model。SST(total sum of squares)指是的baseline的SSE。用SSE表征模型好壞也有不便之處,比如給定$SSE=10$,我們并不知道這個模型是好還是好,因此我們引入另一個變量,$R^2$,定義如下:$$R^2 = 1 - \frac{SSE}{SST}$$
      $R^2$用來表明我們所選的模型在baseline model的基礎之上提升了多少(對于任意給定數據集,我們都可以用baseline作為模型,而事實上,我們總希望我們最后選出的模型在baseline基礎之上有所提升),并且這個值的范圍是[0,1]。$R^2=0$意味著它并未在baseline model的基礎之上有所提升,而$R^2=1$(此時$SSE=0$)意味著一個一個非常完美的模型。   

    Adjusted $R^2$

      在多元回歸模型中,選用的Feature越多,我們所能得到的$R^2$越大。所以$R^2$不能用于幫助我們在Feature特別多時,選擇合適的Feature用于建模。因此又有了Adjusted $R^2$,它會補償由Feature增多/減少而引起的$R^2$的增加/減少,從而可通過它選擇出真正適合用于建模的Feature。

    案例

      許多研究表明,全球平均氣溫在過去幾十年中有所升高,以此引起的海平面上升和極端天氣頻現將會影響無數人。本文所講案例就試圖研究全球平均氣溫與一些其它因素的關系。
      讀者可由此下載本文所使用的數據climate_change.csv
      https://courses.edx.org/c4x/MITx/15.071x_2/asset/climate_change.csv
      此數據集包含了從1983年5月到2008年12月的數據。
      本例我們以1983年5月到2006年12月的數據作為訓練數據集,以之后的數據作為測試數據集。

    數據

      首先加載數據

    temp <- read.csv("climate_change.csv")
    

      數據解釋

    • Year 年份 M
    • Month 月份 T
    • emp 當前周期內的全球平均氣溫與一個參考值之差
    • $CO_2$,$N_2O$,$CH_4$,$CFC.11$,$CFC.12$:這幾個氣體的大氣濃度 Aerosols

    模型選擇

      線性回歸模型保留兩部分。

    • 選擇目標Feature。我們數據中,有多個Feature,但并非所有的Feature都對預測有幫助,或者并非所有的Feature都需要一起工作來做預測,因此我們需要篩選出最小的最能預測出接近事實的Feature組合。
    • 確定Feature系數(coefficient)。Feature選出來后,我們要確定每個Feature對預測結果所占的權重,這個權重即為coefficient

    前向選擇

    1. 以每個Feature為模型,分別算出其Adjusted $R^2$,最后取使得Adjusted $R^2$最大的Feature作為第一輪的Feature,并記下這個最大Adjusted $R^2$
    2. 在其它未被使用的Feature中選一個出來,與上輪作組合,并分別算出使其Adjusted $R^2$。若所有組合的Adjusted $R^2$都比上一輪小,則結束,以上一輪Feature組合作為最組的model。否則選出使得Adjusted $R^2$最大的Feature與上一輪的Feature結合,作為本輪Feature,并記下這個最大Adjusted $R^2$。
    3. 循環步驟2直到結束

    后向選擇

    1. 首先把所有Feature作為第一個模型,并算出其Adjusted $R^2$。
    2. 在上一輪的Feature組合中,分別去掉每個Feature,并算出其Adjusted $R^2$,如果去掉任意一個Feature都不能使得Adjusted $R^2$比上一輪大,則結束,取上一輪的Feature組合為最終的model。否則取使得Adjusted $R^2$最大的組合作為本輪的結果,并記下對應的Adjusted $R^2$。
    3. 循環步驟2直到結束

    結合實例選擇模型

    初始選擇所有Feature
      選擇所有Feature作為第一個model1,并使用summary函數算出其Adjusted $R^2$為0.7371。
    $$model1 <- lm(Temp ~ MEI + CO_2 + CH_4 + N_2O + CFC.11 + CFC.12 + TSI + Aerosols, temp)$$

    summary(model1)
    adjusted r

    逐一去掉Feature
      在model1中去掉任一個Feature,并記下相應的Adjusted $R^2$如下

    Feature Adjusted $R^2$
    CO2 + CH4 + N2O + CFC.11 + CFC.12 + TSI + Aerosols 0.6373
    MEI + CH4 + N2O + CFC.11 + CFC.12 + TSI + Aerosols 0.7331
    MEI + CO2 + N2O + CFC.11 + CFC.12 + TSI + Aerosols 0.738
    MEI + CO2 + CH4 + CFC.11 + CFC.12 + TSI + Aerosols 0.7339
    MEI + CO2 + CH4 + N2O + CFC.12 + TSI + Aerosols 0.7163
    MEI + CO2 + CH4 + N2O + CFC.11 + TSI + Aerosols 0.7172
    MEI + CO2 + CH4 + N2O + CFC.11 + CFC.12 + Aerosols 0.697
    MEI + CO2 + CH4 + N2O + CFC.11 + CFC.12 + TSI 0.6883

      本輪得到
    $$Temp \sim MEI + CO_2 + N_2O + CFC.11 + CFC.12 + TSI + Aerosols$$

      從model2中任意去掉1個Feature,并記下相應的Adjusted $R^2$如下

    Feature Adjusted $R^2$
    CO2 + N2O + CFC.11 + CFC.12 + TSI + Aerosols 0.6377
    MEI + N2O + CFC.11 + CFC.12 + TSI + Aerosols 0.7339
    MEI + CO2 + CFC.11 + CFC.12 + TSI + Aerosols 0.7346
    MEI + CO2 + N2O + CFC.12 + TSI + Aerosols 0.7171
    MEI + CO2 + N2O + CFC.11 + TSI + Aerosols 0.7166
    MEI + CO2 + N2O + CFC.11 + CFC.12 + Aerosols 0.698
    MEI + CO2 + N2O + CFC.11 + CFC.12 + TSI 0.6891

    任一組合的Adjusted $R^2$都比上一輪小,因此選擇上一輪的Feature組合作為最終的模型,也即
    $$Temp \sim MEI + CO_2 + N_2O + CFC.11 + CFC.12 + TSI + Aerosols$$

    summary(model2)可算出每個Feature的coefficient如下 。
    Feature coefficient

    線性回歸介紹

      
      在線性回歸中,數據使用線性預測函數來建模,并且未知的模型參數也是通過數據來估計。這些模型被叫做線性模型。最常用的線性回歸建模是給定X值的y的條件均值是X的仿射函數。
      線性回歸是回歸分析中第一種經過嚴格研究并在實際應用中廣泛使用的類型。這是因為線性依賴于其未知參數的模型比非線性依賴于其位置參數的模型更容易擬合,而且產生的估計的統計特性也更容易確定。
      上面這段定義來自于維基百科
      
      線性回歸假設特征和結果滿足線性關系。我們用$X_1,X_2..X_n$ 去描述Feature里面的分量,比如$x_1$=房間的面積,$x_2$=房間的朝向,等等,我們可以做出一個估計函數: $$h(x)=h_θ(x)=θ_0+θ_1x_1+θ_2x_2$$

      θ在這兒稱為參數(coefficient),在這的意思是調整Feature中每個分量的影響力,就是到底是房屋的面積更重要還是房屋的地段更重要。如果我們令$x_0 = 1$,就可以用向量的方式來表示了:  $$h_θ(x)=θ^TX$$
      
      我們的程序也需要一個機制去評估我們θ是否比較好,所以說需要對我們做出的h函數進行評估,一般這個函數稱為損失函數(loss function)或者錯誤函數(error function),也有叫代價函數(cost function)的。在本文中,我們稱這個函數為J函數。
      在這里,我們可以認為J函數如下:  $$J(0)=\frac{1}{2m}\sum_{i=1}^m(h_0x^{(i)}-y^{(i)})^2$$
      
      這個錯誤估計函數是去對$x(i)$的估計值與真實值$y(i)$差的平方和作為錯誤估計函數,前面乘上的$1/2m$是為了在求導的時候,這個系數就不見了。至于為何選擇平方和作為錯誤估計函數,就得從概率分布的角度來解釋了。
      如何調整$θ$以使得$J(θ)$取得最小值有很多方法,本文會重點介紹梯度下降法和正規方程法。   

    梯度下降

      在選定線性回歸模型后,只需要確定參數$θ$,就可以將模型用來預測。然而$θ$需要使得$J(θ)$最小。因此問題歸結為求極小值問題。
      梯度下降法流程如下:

      1. 首先對$θ$賦值,這個值可以是隨機的,也可以讓$θ$為一個全零向量。
      2. 改變$θ$的值,使得$J(θ)$按梯度下降的方向進行調整。

      梯度方向由$J(θ)$對$θ$的偏導數確定,由于求的是極小值,因此梯度方向是偏導數的反方向。更新公式為為: $$0_j = 0_j - α\frac{1}{m}\sum^m_{i=1}(h_θ(x^{(i)})-y^{(i)})x_j^{i}$$
      
      這種方法需要對全部的訓練數據求得誤差后再對$θ$進行更新。($α$為學習速度)   

    正規方程(Normal Equation)

      $Xθ=y$
    =>
      $X^TXθ=X^Ty$
    =>
      $θ = (X^TX)^{-1}X^Ty$
      利用以上公式可直接算出$θ$
      
      看到這里,讀者可能注意到了,正規方程法,不需要像梯度下降那樣迭代多次,更關鍵的是從編程的角度更直接,那為什么不直接用正規,還要保留梯度下降呢?想必學過線性代數的朋友一眼能看出來,正規方程需要求$(X^TX)$的逆,這就要求$(X^TX)$是可逆的。同時,如果Feature數比較多,比如共有100個Feature,那么$(X^TX)$的維度會非常高,求其逆會非常耗時。

    《機器學習》系列文章

    郭俊 Jason wechat
    歡迎關注作者微信公眾號【大數據架構】
    您的贊賞將支持作者繼續原創分享
    速赢彩app 巢湖 | 洛阳 | 石狮 | 黔南 | 潮州 | 肇庆 | 怀化 | 吉林 | 永新 | 通化 | 景德镇 | 保定 | 海北 | 黔西南 | 伊犁 | 招远 | 昆山 | 德阳 | 靖江 | 石狮 | 莒县 | 海丰 | 简阳 | 大连 | 兴化 | 保定 | 长垣 | 台北 | 仙桃 | 大同 | 抚顺 | 兴化 | 三亚 | 东台 | 丹阳 | 益阳 | 济南 | 肥城 | 固原 | 景德镇 | 海宁 | 潜江 | 泉州 | 东台 | 东阳 | 鄂州 | 黄山 | 张北 | 陕西西安 | 醴陵 | 马鞍山 | 西双版纳 | 广州 | 乌兰察布 | 佛山 | 鸡西 | 甘南 | 镇江 | 杞县 | 安顺 | 池州 | 厦门 | 和田 | 通化 | 延安 | 攀枝花 | 泰兴 | 郴州 | 涿州 | 铜陵 | 济宁 | 沭阳 | 保山 | 厦门 | 桓台 | 宁国 | 吉林长春 | 濮阳 | 泰州 | 乳山 | 朔州 | 宁国 | 泰兴 | 通化 | 漯河 | 营口 | 安顺 | 郴州 | 池州 | 芜湖 | 安吉 | 广饶 | 建湖 | 简阳 | 泉州 | 龙岩 | 清徐 | 保山 | 芜湖 | 铜仁 | 泰州 | 云浮 | 鄢陵 | 来宾 | 博尔塔拉 | 三沙 | 莱芜 | 神木 | 青海西宁 | 滕州 | 五家渠 | 涿州 | 昌吉 |