時間序列數據的特徵提取

CDA數據分析師 出品

時間序列數據的特徵提取

當你想對時間序列數據做分類時,有兩種選擇,一個是用時間序列特定的方法,比如說說LSTM模型。另外一種方法就是來從時間序列中提取特徵從而將這些特徵用在有監督的模型上。在這篇文章中,我們來看下如何使用tsfresh包自動的提取時間序列數據。

這份數據的來源是 。這個網站中提供對很多數據集有高精度的模型,如何有興趣的,可以去詳細瞭解一下。時間序列比一般標準的目標要難一些,這是因為在時間序列裡的數據本身每個樣本就不是獨立的,兩個時間上月接近的樣本,就越有相關性。比如說溫度,如果今天的溫度問20度,那明天更加有可能是15或者25度,而不是5或者35度。

這表明這我們不能用常見的分類器來擬合數據,因為對於普通的分類器來說,數據的假設前提都是需要是樣本和樣本是獨立的。並且更重要的是,有的和時間相關的數據集有更加複雜的結構,一個樣本包含了多個特徵,比如說溫度,溼度,分速等等。

雖然說時間序列的數據很特別,但是我們可以使用特徵提起的方法將一個序列降低到一個點。比如說,如果我們現在是在對一個月內的天氣相關的數據做處理,我們可以使用以下多個特徵:

  • 最小最大溫度
  • 溫度平均值
  • 溫度方差
  • 最小最大溼度

這裡只是給出了幾個例子而已,當然了這裡可以有很多種特徵,將他們全部列舉出來會特別麻煩,幸運的是,有一個tsfresh包,可以自動的提取出很多特徵。

tsfresh包在提取出的眾多的特徵中,需要選取其中最為相關的,最具有預測能力的特徵。並且為了防止過擬合,需要首先對數據集做切分,並且只對訓練集做特徵選擇,否則會造成過擬合的問題。tsfresh包使用的是成對檢驗法來做特徵選擇的。

我們先來從 數據列表列提取3個時間序列數據集,FordA, FordB, 和Wafre.並且這些數據集中提取特徵。首先我們需要將這些1維的數據給上下拼接起來。

時間序列數據的特徵提取

In [9]: d.head()Out[9]: 0 1 2 30 1.01430 1.0143 1.01430 1.014301 -0.88485 -1.0375 -0.97771 -1.016902 0.58040 0.5804 0.59777 0.597773 -0.88390 -1.0371 -0.97998 -1.012104 1.10500 1.2856 1.19630 1.25610

需要使用stack做一次拼接

d = d.stack()d.index.rename([ 'id', 'time' ], inplace = True )d = d.reset_index()

得出以下的結果

In [11]: d.head()Out[11]: id time 00 0 0 1.01431 0 1 1.01432 0 2 1.01433 0 3 1.01434 0 4 1.0143

特徵提取的工作量是非常大的,所以tsfresh使用分佈計算的方法來高效的做特徵提取。另外一種方式就可以直接設置n_jobs為1。具體代碼為以下

f = extract_features( d, column_id = "id", column_sort = "time" )# Feature Extraction: 20it [22:33, 67.67s/it]

這個時候f中有一些特徵是空值,可以使用tsfresh提供的impute函數過濾掉這些特徵

impute( f )assert f.isnull().sum().sum() == 0

當做特徵選擇的時候,有一個fdr_level超參數,這指的是所有不相關特徵佔總體的理論期望閾值,默認值為5%,也就是從生產的特徵中,刪除掉最不相關的特徵,且這部分特徵佔總比的5%。有的時候我們還是需要加大這個值到0.5,甚至0.9,從而可以選取最重要的特徵,並且防止緯度災難。

In [2]: run select_features.pyloading data/wafer/features.csvselecting features...selected 247 features.saving data/wafer/train.csvsaving data/wafer/test.csv

當數據訓練好之後,則就可以開始使用邏輯迴歸等分類器來對模型做擬合了。

時間序列數據的特徵提取


分享到:


相關文章: