R語言自學日記(9) — 迴歸模型介紹

Edward Tung
R 語言自學系列
10 min readJul 27, 2018

前言

迴歸模型大家一定不陌生,我們在高中時期就有學過相關的概念,然而,放在資料科學裡有哪些應用,以及我們應該怎麼樣建置並評估這些模型,今天的文章就要針對此來做一番敘述,這邊我們使用的資料集是mtcars資料集,整筆資料為32*11的觀測資料,是1974年美國的Motor Trends雜誌中針對當時流行的不同車款參數所做的比較:

簡單線性迴歸(Simple Linear Regression)

第七篇資料預處理中,我們已經實現過建立模型的步驟,因此,這裡我就僅針對模型部分多做著墨,迴歸模型的概念很簡單,一個變數(應變數)會受到自變數的某種程度影響,我們可以寫成:

假設我們認為,車子的排氣量(disp)與車子的馬力(hp)存在一定程度的線性關係,我們可以這樣來建置迴歸模型並做視覺化:

我們可以看到估計式的結果,其中的係數是根據最小平方法估計(OLS)所求得,係數與變數的關聯是非常明確的,我們舉一個極端的例子,倘若Y與X完全正相關,那麼估計式的Y應該是X再加上截距項,然而我們這邊僅出現了0.4686的係數,這讓我們不禁懷疑模型的參考價值,因此,我們會想要知道這個模型的具體表現如何,我們可以使用一個概念叫做決定係數R^2,也就是我們熟知的相關R值平方,計算公式如下:

直觀上的意義來說,這代表誤差總和去除以總變異量,這個值越接近1.0越好,我們可以用summary(regressor)來檢驗看看模型的R平方值:

可以看到的R平方為0.636,這個數字具體好不好非常難說,必須跟其他模型或根據情況而定,一般來說社會科學的R平方大概只會有0.4~0.5,而對於一些自然客觀數據,比方說機台的良率與運轉時間等,可能就常有0.8~0.9,因此,我們必須經過比較才能知道,接下來我們就引入第二個模型,也就是多變量迴歸:

多變量線性迴歸(Multiple Linear Regression)

這個模型概念與簡單線性迴歸幾乎一模一樣,只是用以估計的變數數目變多了而已,如果寫成方程式會長得像這樣:

在這邊要特別提到一個概念叫做虛擬變數(Dummy Variable),平常我們衡量的是數值變數對於我們要預測對象的迴歸模型,然而我們也會想知道,類別變數能不能作為預測方式之一,舉例來說,Mazda的品牌對於馬力是不是平均優於Toyota(意思是Mazda作為參數的係數會不會比較高,權重比較大),比方用到第七章學過的方式來創建虛擬變數:

表格欄位太多我們就不一一列舉了,但一個好消息是,R語言的lm()實際上會自動創建虛擬變數,因此我們並不需要多此一舉。在這邊我們要展開我們的預測,同樣我們想知道如何去猜測車子的馬力,但把所有變數丟進去很明顯是不智之舉,一來當資料集不大的時候這非常容易產生過擬和現象(尤其以此處的例子來說,32個欄位就有22種車款,幾乎看車款就可以猜測馬力),二是我們通常希望模型能夠簡潔,因為這代表者當我們要執行到前端如行銷作業時,比較容易有統一的方針來進行。

* Note : 一般來說,非連續的特徵(離散特徵)是不可以放入回歸模型的,而虛擬變數是針對那些具有數量意義,但不能直接以數量來衡量的變數,比如血型是 A, B, O, AB,設定為 0, 1, 2, 3 鐵定不合理,因此需要做虛擬變數,將A型改成 (1, 0, 0, 0),也就是,是A型,但不是B, O, AB型。

在這裡,我們只選用五個變數來猜測馬力(hp),分別是:cyl(汽缸數量)、disp(排氣量)、wt(噸位)、vs(引擎種類,0=自動、1=手動)、am(變數箱,0=自動、1=手動),代碼與輸出結果如下:

我們可以看到,多了四個預測變數以後整體的R-squared從0.63提升到0.77,提升了0.14,這個結果顯然是比剛才好上不少,然而,資料科學家總是在追求更高的準確率(當然不能過擬合,這個後面說),我們的下一個問題是,這麼多變數之中,我該選擇哪五個或哪X個,會有最好的效果?

變數篩選 (Variable Selection)

一個很重要的想法是,如果我們一次扔進去所有變數,得到的R平方會非常非常高,這很正常畢竟我們知道的資訊越多,預測得越準確,電腦當然也是一樣,下面是當我們放入所有變數時的結果:

我們可以看到,R-squared已經上升到0.9144,這個結果可說是非常的好,然而因為真實情況的考量,我們往往不會需要所有變數,針對這樣的情況,我們可以看一個簡單的變數叫做個別參數的p-value。

P-value我們在高中統計課時就學過類似的概念,在一個虛無假設下,越小的p值代表這組樣本落在拒絕域的傾向越強,簡單來說我們難以再透過抽樣去取得更傾向拒絕假設的樣本,亦即我們越傾向於拒絕虛無假設。這邊我就不再贅述P值,有興趣的朋友我推薦看看這篇文章,對於重新釐清以往的p值概念有非常大的幫助:

而在變數選擇上,我們傾向於選擇具有低p值的變數來架構模型,這是因為我們的虛無檢定是該變數的係數(beta)是否等於0,係數等於0我們可以說該變數對於模型幾乎沒有解釋能力,計算的公式如下:

我們如果回到上表,會發現summary()中完美地幫我們呈現了p值的資訊,可以發現到只有disp(排氣量)與carb(化油器)兩者對模型的解釋力比較高,我們趕快用這兩個變數來看一下結果:

我們可以看到,只選擇這兩個變數就可以達到驚人的0.8657的R-squared,比起剛才即使全部變數扔進去也只有0.91的R-squared,顯然cp值要高得多,因此,我們可以同時兼顧模型解釋能力與後期實際執行能力。

*化油器現在比較少見了,但在70年代是重要的供油裝置,可以將發動機產生的真空壓將油氣混和並送到燃燒室。

多項式迴歸(Polynomial Regression)

自變數與應變數的關係也可以是多項式的:

跟上面兩個式子都很像,這次我們一樣使用disp來做多項式預測以做為跟簡單線性迴歸的比較,代碼如下:

感謝讀者Vivi指正,我們應該要在Split Data以前先把平方項建立好,由於是截圖的關係請容我直接補充在這裡

R平方也有很明顯的上升,而多項式回歸最為不同的地方在於圖形,我們可以比較一下其與簡單線性迴歸的差異:

值得注意的是,雖然線性迴歸在同樣的單一變數下就可以多增加許多解釋能力,但必須特別注意過擬合(Overfitting)現象,因為這條曲線已經被這個變數給"量身打造"了,因此每加入一個新的變數都會造成這條曲線有劇烈變動,這意味著同一條曲線拿去預測新的資料集,效力會越來越差,因此在多項式項目與過擬合風險的取捨上就需要特別小心,可以參考下圖:

Model Selection and the Triple Tradeoff,Source: Bishop, “Pattern Recognition and Machine Learning”

調整R平方(Adjusted R-squared)

在這邊補充一個調整R平方的概念,在我們summary()產生的報表中,調整R平方就在R平方的旁邊而已,我們先上數學公式:

一個很明顯的直覺是,當變數的數目p越多,調整R平方的值會越小,以及當抽樣的樣本數越多,調整R平方的值會越大,這給了我們一個很重要的訊息,調整R平方會偏好你取得更多的樣本,並對於放入太多變數做參數估計給予懲罰,我們以上面的多變數迴歸例子來說,當我們放入所有變數時,調整R平方相對R平方是0.85/0.91,而只放入兩個變數的時候,相對值變成0.85/0.86,可以說在調整R平方的評分底下,兩個變數的解釋力與放入所有變數的模型幾乎是一致的。這可以幫助我們避免一些常見的偏誤,比方說馬後炮(當我們知道所有的資訊,自然可以預測的比較準,但現實世界是不可能的)、過度自信(用太少的樣本就輕易下結論)等等。

總結

我們下一章會介紹其他幾種時間序列資料的預測方法,最後帶到自迴歸AR模型。實際上,簡單線性迴歸雖然強大,但早在19世紀初期就被Legendre、Gauss等人提出,而經過了兩百多年,我們其實發明出了更多更強而有力的模型,包括後其提出加入懲罰項的Ridge Regression、Lasso Regression,近年甚至將機器學習應用到迴歸上開發出樹回歸與支持向量迴歸等。當然這邊我們不會一一介紹,但對於認知時間序列後續分析的幾種迴歸方法,在後幾章會逐一談到,如果你喜歡我的文章,還請不吝拍手喔!最後,再推薦幾個關於迴歸模型相關的文章,有興趣的朋友可以自己看下去:

--

--

Edward Tung
R 語言自學系列

Columbia Student || 2 yrs of data scientist and 1 yr of business consultant experience