寫文章的目的在於之前面試的時候,提到某一個時間序列專案的特徵工程處理。我說的大多數都是一些資料清洗、資料去除異常點、針對資料特性做出的特別的特徵工程的操作,然後面試官給我的建議是下一次面試多說一下常規的特徵工程處理,因為這樣面試官才會跟你有共鳴,能更好的理解你說的特徵工程是什麼。
本文主要講述一些比較有意思的特徵工程。但是這個有意思就是不那麼普通,但是也不那麼特殊,讓人看了耳目一新的那種感覺。
有趣的特徵工程
【節假日消耗的能源更多?】
不管是什麼任務中,預測家庭能源消耗、預測消費情況等等,節假日都是一個需要注意的特徵,因為放假了就會消耗更多的能源,產生更多的消費購物。
不過需要注意的是:歐美國家的一些節假日和中國不一樣,所以需要看一下歐美的法定節假日日期以及週末的放假日期。
【分離時間戳產生更多特徵?】
一般時間戳timestamp可能是這樣的格式:13:21 20/3/1997,這樣的話,可以把這個timestamp分離成5個特徵:hour,minute,day,month,year。
進一步的,可以對小時資料進行資料探索分析,看看是否存在白天黑夜的不同導致的對預測結果的影響?對day和month進行分析,看看是否存在節假日對預測結果的影響。
【日期資料的迴圈性】
通常對於上面的hour特徵是[0,23]的,但是其實0點和23點並不像數字本身看起來差別那麼巨大,所以可以使用cos或者sin來將時間變成一個迴圈。相似的是星期一與星期日的差別。
【其他的tricks】
- 人造節日是否考慮進去?中國的6.18,5.20,11.11,12.12等
- 季節導致的偏移是否存在?可能同樣的情況春天發生和秋天發生並不相同?
常規的特徵工程
滑動視窗法。尋找100個時間相鄰的樣本的某一個特徵的某一個統計特性,比如:
- 均值mean()
- 中位數median()
- 最大值max()
- 最小值min()
- 標準差std()
- 四分位點quantile(q=0.25)/quantile(q=0.75)
- 資料的偏度df.skew()
- 資料的峰度df.kurt()
- 資料的絕對離差df.max(),資料與其均值的差的絕對值的平均值
- 絕對值的最大值
- 絕對值的最小值
- 梯度的絕對值
- 最大值與最小值的差值
- 最大值與最小值的倍數
- 使用時間序列的shift偏移
週期性的特徵工程
部分時間特徵是具有周期性的。可能是一個月是一個週期,也可能一個季度,一年等等。為了尋找這個週期性,可以使用自相關係數來尋找。簡單的說,就是通過平移特徵工程,然後繪製自相關係數隨著平移距離的函式影像。
有了這個週期性之後,就可以構建更多的特徵。比方說同比(去年同月)或者環比(相鄰月份)。環比和同比一般都是比率,我們可以再構建這個環比的梯度,類似二階差分。
卡爾曼濾波器
在百度搜尋“時間序列 濾波”等關鍵詞的時候,會發現有下面的內容:
使用kalman濾波器好像可以作為時間序列的一種特徵工程。
其實是這樣的,在處理一些微觀資料的時候,有的時候觀測儀器會存在測量誤差,這個時候我們可以使用卡爾曼濾波器來進行一定的矯正。
對於每一個時間點的資料,獲取的方法有兩個:
- 第一個就是觀測,但是測量的結果不一定準確,可能受限於測量儀器的精度?
- 第二個就是用這個時間點之前的所有資料,預測這個時間點的資料,當然,這個預測值也是不準的。
- 可否利用這兩種方法,相互促進,預測的值更準,或者說讓觀測到的值更接近本質?Kalman Filter卡爾曼濾波器就這樣做的。
這裡不加贅述了,更多內容可以看這篇文章,通俗講解了卡爾曼濾波器以及python實現方法,方便下次直接拿輪子來用:
kalman filter-卡爾曼濾波器與python實現