(時間)線性回歸和特徵工程

(時間)線性回歸和特徵工程

4 人贊了文章

本章將會說到對於線性回歸和時間線性回歸的問題,第二部分是關於在線性回歸中的特徵的選擇和模型的評估。

在本章中特徵(feature),也被叫做變數(variable),也可以叫做預測因子(predictor).

1》簡單線性回歸

考慮只有一個特徵的情況:

多元線性回歸的情況:

在R中線性回歸使用lm()來創建模型。

時間線性回歸,在R中tslm()來創建公式,下面公式是創建相同時間下的consumption和income之間的線性回歸方程:

fit.model = tslm(Consumption ~ Income, data=uschange)

具體公式如下:

此時k=1, x_{1,t} 代表在t時刻下的Income值。那麼如何確定係數 eta_{1} 呢?就要用到第二節講到的最小二乘法:

2》最小二乘法

最小二乘法是指最小化誤差的平方和(SSE)來確定係數,SSE如下所示:

最小二乘法是在訓練集上實現SSE的最小化來估計每一個變數的係數,所以在訓練集上的係數估計過程,也是一個擬合數據的過程。下圖中直線是線性方程的擬合曲線,樣本值由一個個點顯示。

3》擬合優度

如何評估擬合曲線對樣本點的擬合程度呢?

我們引入一個度量:擬合優度,也叫做 R^{2} 值,它的計算公式如下:

擬合優度的取值一般在0到1之間,越接近1表示擬合程度越高,也能取值到負數,那說明模型一點也沒有擬合出樣本的變化規律。但是擬合優度也有它自己的缺點,比如在訓練集上得到的擬合優度不能度量出過擬合的情況,它傾向於特徵越多越好。所以一般需要對照訓練集和測試集上的擬合優度來查看是不是存在過擬合,或者使用調整後的擬合優度(後面會說道)。

4》殘差的標準差

殘差的標準差是用於給定置信度下預測的置信範圍的,計算公式如下:

5》模型評估

對於模型評估的原則是看模型擬合訓練集後的殘差是不是滿足下面的三個假設:

1.擬合殘差的均值為0,如果均值不為0,說明預測誤差有正(負)向偏向

2.擬合殘差沒有自相關性,如果預測誤差中還有自相關性,說明還有殘留的模式沒有被挖掘

3.擬合殘差和特徵變數之間沒有相關性,這樣也保證了沒有殘留的模式

對於假設的數學表達如下:

那麼如何評估這三個假設呢?

首先我們來評估擬合殘差本身不存在自相關性,這一般看ACF圖來查看擬合殘差本身的自相關性,當log在不同值下的ACF值都在置信區間內,則可以認為殘差不存在自相關性。

Breusch-Godfrey測試也用於測試殘差之間的相關性,當p值越小的情況,殘差存在自相關性的概率越大,當p值大於0.95,我們可以認為在置信度為95%的情況下,殘差不存在自相關性。

下一步我們來看殘差和特徵值之間存不存在相關性,這需要看殘差的分布和特徵值的分布圖,如下所示:

可以看到殘差在四個特徵變數的分布圖,並沒有看出殘差和四個特徵值有什麼模式,殘差和特徵變數的關係只能從殘差散點圖來顯示。這裡有一個在線性回歸中的技巧,可以對殘差在沒有加入的特徵的散點圖進行分析,如果顯示出殘差和沒有加入的特徵有模式,那麼說明這個特徵需要加入到模型之中。

綜合前面說到的殘差的診斷,需要畫出殘差圖,殘差和特徵值的散點圖,ACF圖和殘差直方圖(用於查看殘差是否是正態分布,殘差呈現正態分布的計算置信區間會更容易也更準確),在R語言中使用checkresiduals()可以畫出下列殘差特徵圖,如下圖所示:

可以看到殘差呈現一定的異方差性,並且在lag=7的時候ACF值相對較大,並且殘差基本呈現正態分布,但是有偏向左邊的形式。首先來分析異方差性,以為有異方差性,所以對置信區間也就是預測間隔的計算有可能會計算錯誤,會有一定影響,如果對置信區間的精度要求更高就需要對殘差進行box-cox轉換後再計算預測間隔。再來分析在lag=7的情況下ACF值超出了置信範圍為95%下的置信區間,但是它也並未太大,並不會對預測間隔和預測值產生比較明顯的影響,如果大部分落在95%置信區間下,其他的落在90%置信區間下的自相關係數圖也是可以接受的。最後來看殘差的直方圖,可以看出有左邊的偏向,那麼它會影響預測間隔的精度。

5》時間線性回歸的特徵工程

下面給出在時間序列的線性回歸中一些比較有用的特徵:趨勢、虛變數、季節性虛變數、長期影響特徵(滯後作用特徵)、工作日、干涉變數。

先說趨勢特徵,在R語言中有tslm()來使得趨勢特徵作為預測自變數,並且使用上一個時間段的seasonal變數相加得到最近的預測,特別適合有趨勢和季節性模式的時間序列,預測公式如下:

再來說虛變數,虛變數又稱為dummy variable,在python中有dummies()函數來生成虛變數特徵,為什麼叫虛變數呢?我想它是把一個類別特徵分成幾個特徵,不是傳統意義的特徵或者說變數,所以叫做虛變數。季節性虛變數是虛變數的一種,比如特徵星期幾,就可以有星期1到星期天共七個類別,可以生成6個虛變數,注意是生成6個,不是7個,如下圖所示:

那麼為什麼這裡是生成6個,而不是周一到周日都生成一個共七個呢?因為這裡生成了6個或者說7個特徵,是要通過最小二乘法去估計每一個特徵的係數的,如果生成7個,在線性回歸中就需要估計7個係數,連線性回歸方程中的截距都需要估計了,這就會導致『虛變數陷阱』,最終導致回歸方差不能收斂。所以在線性回歸中,虛變數要比類別數少一個。

在R語言中使用tslm()你指定了變數為seasonal時,方法會自動將季節性特徵轉化為虛變數,當然比實際的季節性類別少一個,當你是一年四季為一個季節性,那麼就產生3個虛變數,當你是兩個半年為一個季節性就產生一個虛變數。

fit.model <- tslm(time_series_data ~ trend + season)

使用summry(fit.model),顯示如下:

#> Coefficients:#> Estimate Std. Error t value Pr(>|t|) #> (Intercept) 441.8004 3.7335 118.33 < 2e-16 ***#> trend -0.3403 0.0666 -5.11 2.7e-06 ***#> season2 -34.6597 3.9683 -8.73 9.1e-13 ***#> season3 -17.8216 4.0225 -4.43 3.4e-05 ***#> season4 72.7964 4.0230 18.09 < 2e-16 ***

可以看到生成的虛變數是season2,season3和season4.

第三類特徵是長期影響類特徵,即滯後影響特徵,比如一個公司對廣告的投入大小對銷售額的影響不是那麼立竿見影的,廣告的投入影響是存在一定滯後性的,這時可以提取一些特徵如:去年的廣告投入額、前年的廣告投入額、大前年廣告投入額。。。。。

第四類特徵是工作日特徵,在時間序列中要注意實際有效的工作日和預測變數的影響,如果你的銷售活動只在周一,那麼這個月有幾個周一就是影響最大的特徵。類似的在做預測的時候需要探索預測變數和實際有效的具體日期的關係,從而提取出這一類工作日特徵。

第五類干涉變數,包括對手的廣告投入、行業活動(類似罷工等活動)。

6》預測類別

在時間序列的預測上,預測類別分為前向預測和後向預測。前向預測是當預測t時刻的y的時候,使用的特徵都是在t時刻之前的,不使用t時刻的。後向預測則相反,那麼我們會想了,t時刻是預測的,也就是未來的,我們怎麼能知道t時刻的特徵值呢?能啊!當個比方,t時刻是周幾這個特徵,我們不用到t時刻也能知道把。你可能又會想了,幹嘛特意分出什麼前向預測和後向預測,這樣分多一個概念的意義在哪裡?區分前向預測和後向預測,能讓我們更好地分析模型,比如我們只使用前向預測不使用後向預測,模型得出的結果不好,使用了後向預測的特徵模型效果改善,那麼我們就明白預測結果的不確定性來自於特徵。如果使用了後向預測的特徵,反而不如前向預測的結果,那麼我們就明白可能這個模型本身的特點不能對這樣的數據進行很好的預測,在線性回歸中,有高價的線性回歸,設計2次方、三次方的特徵值,我們是需要對模型進行選擇的。而如果使用XGBOOST這樣的利器,那麼我們就不需要對模型進行選擇,那麼我們也可以,區分出前向預測特徵和後向預測特徵,對我們找特徵有啟發。

7》預測間隔的計算

預測不僅需要預測未來的一個值,還需要給出未來這個值的波動範圍,在統計學裡面是給定置信度下的預測結果的置信區間。而預測結果的置信區間取決於兩個因素:一個因素是模型在訓練集下的誤差的標準差,另一個因素是測試集上的變數值和訓練集的關聯程度。前一個因素是因為如果預測的誤差的標準差越大,那麼預測間隔就應該越大;後一個因素是因為如果訓練集的某一個特徵值一直在0-1這個區間上,而測試集這個變數值為100,那麼用0-1範圍訓練出來的模型的可信度就要降低,反映到置信區間上就是置信區間變大,也就是預測間隔變大。置信度95%下預測間隔的計算公式如下:

8》區分相關、因果

相關不一定是因果,比如游泳淹死的人數和冰淇淋賣出的數目是正相關的,但它們不存在相關性,可以用冰淇淋賣出的數目來預測淹死人數,但不是說它們具有因果關係。用x來預測y,可以是x導致了y,也可以是y導致了x,還可以是x和y都受另一樣事情所影響。在找特徵的時候,更好的特徵是因果的,但是相關的特徵也是可以的。

9》區分虛假回歸

什麼是虛假回歸?虛假回歸就是指x於y沒有關係,但是剛好用x和y能擬合出一個好的模型,但是如果用這個模型來預測,就會出現根本不準確的問題,也就是在訓練集上表現良好,但是在測試集上泛化能力不夠。

泛化能力不夠是什麼意思?

比如在訓練集上x的範圍是(a,b),而在測試集上來一個c,它不在a和b之間,而且離這個範圍很遠,那麼預測的結果也很離譜,那麼就是模型的泛化能力不夠。如果預測的結果可以接受,那麼就是說預測泛化能力可以接受。

如下圖所示:

飛機乘客和大米的產量之間沒有關係,但是在圖像上都是呈現一個上升趨勢,你能擬合出一個很好的模型,但是用它來預測未來,那一定不會有什麼準確率的。

這在時間序列分析中有一個等同的問題是,時間序列分析建立模型時都需要要求時間序列是穩定的,穩定是什麼意思?時間序列的值的均值是不隨時間改變的,並且方差也不隨時間改變,那麼我們就可以用時間序列過去的模式來預測未來。

如果這是一個偽回歸,那麼這個回歸就是現在是這樣,但是在將來這個自變數和因變數的關係在將來會改變的,而時間序列分析需要時間序列是平穩的,平穩就是說這個時間序列在未來的時間裡它的行為不會隨著時間而改變。偽回歸是本來不具有線性關係的自變數和因變數之間建立了回歸模型,你在訓練樣本上擬合的很好,但是在後面的測試集中是不能泛化的,也就是行為改變了,它就是不穩定的。

所以在時間序列分析的時候需要把不平穩的時間序列通過差分轉化為平穩的,在線性回歸中要區分是不是存在偽回歸的現象,那麼如何是否存在偽回歸的現象呢?

如果出現偽回歸的線性,那麼模型一般有比較高的擬合優度,但是它的殘差卻表現出比較大的自相關性。如下圖所示:

原文鏈接:

Forecasting: Principles and Practice

推薦閱讀:

TAG:時間序列分析 | 機器學習 |