用【指數加權平均】構造時間序列問題的特徵

以往用機器學習(不考慮NN的話)求解時間序列時,經常需要提取不同時間窗口下的平均值來作為一種基本特徵,但如果你所預測的樣本指標變化具有「距離目標預測窗口越近,則數據的價值越高,對未來影響越大」的特性的話,將指數加權移動平均作為一個特徵指標將會是一個很好的選擇,因為,它真的,很優秀(??????) ?

【用途】許多時間序列數據都具有這種「距離目標預測窗口越近,則數據的價值越高,對未來影響越大」的特性,比如股票,天氣,銷量,以及實時監測的各類工業生產科研數據

【含義】

簡單平均:

最簡單常用的一種平均,待預測窗口前1,3,5,7,9點點點天內的均值

加權平均:

我們假設越近的詩句對未來數據波動的影響越大,那麼在計算平均價格的時候就給較近的數據乘上一個較大的數,較遠的價格乘上一個較小的數。所乘的這個數就叫做權值,權值較大,說明這個數的權利越大,或者說在求平均數時所佔的比重越大。

而這個「權值伴隨時間的前推而衰減」該以何種規律衰減呢?

衰減可以是線性衰減的:

(C1×1+C2×2+……+Cn×n)/(1+2+...+n),這裡的n是特徵窗口的編號,越早的日期編號越小

同樣也可以是指數衰減的:

這裡引用Andrew在深度學習視頻課上面的講解截圖,數據為倫敦每日溫度

這裡的移動平均的移動的意思是為了獲取連續的均值線所以每步移動一天

注意*

移動平均值的含義與上面提到的簡單平均不同,移動平均值的計算是一個遞歸計算過程:

由【每一天的數值】*0.1+0.9*【前一天的移動平均值】

這個【前一天的移動平均值】會一直追溯到時間序列的初始值

那麼這裡就有一個不可避免的問題:

在時間序列的初期,移動平均值偏差很大,這裡有修正方法

然後關於這個0.9的確定,它其實不必一定是0.9,這是一個你可以自己控制的超參,但是呢,Andrew講,經過試驗,0.5的時候基本只平均了2天的,0.98的時候是綠線,延遲過大,這個超參設置為0.9在大多數時候灰常好用,所以算是默認超參

然後,展開這個遞歸的公式我們可以發現,這個衰減是指數衰減

Andrew講這個是為了解釋後面的優化演算法--動量梯度下降法:

它用梯度的指數加權平均數更新梯度,比標準梯度下降的效率更高

【其他加權平均】

其實,就時間序列模型構造加權平均特徵這一點而言,除了指數加權平均,還有遵循冪函數的衰減等等,可以自己發掘構造。

【Kaggle】Favorita Grocery Sales Forecasting 1st 從源碼到方案解讀--lightGBM

這個銷量預測問題中1st大佬用的應該是冪函數的衰減,冪取了0.9,相當溫和的衰減

* np.power(0.9, np.arange(i)[::-1])).sum(axis=1).values

def get_timespan(df, dt, minus, periods, freq=D): return df[pd.date_range(dt - timedelta(days=minus), periods=periods, freq=freq)]for i in [3, 7, 14, 30, 60, 140]: tmp1 = get_timespan(df, t2017, i, i) tmp2 = (get_timespan(promo_df, t2017, i, i) > 0) * 1 X[mean_%s_decay % i] = (tmp1 * tmp2.replace(0, np.nan) * np.power(0.9, np.arange(i)[::-1])).sum(axis=1).values

冪函數複習一發


推薦閱讀:

技術宅如何進化為女裝大佬
機器學習篇:XGB為啥這麼萬能
製作假新聞?AI送你去喝茶!
條件隨機場CRF

TAG:機器學習 | 數據挖掘 |