TSFRESH - 通过对称滑动提取的特征 window

TSFRESH - features extracted by a symmetric sliding window

作为原始数据,我们对数据集中的每个对象 j 每 30 秒 (i=0, 30, 60, 90,...720,..) 进行一次测量 m_{i,j}

我希望使用TSFRESH(包)来提取时间序列特征,这样对于时间i的兴趣点,特征是基于对称滚动window.

我们希望根据 i 前 3 小时和 i 后 3 小时的上下文测量来计算时间点 i,j 的特征向量。 因此,721-dim 特征向量表示被 6 小时“上下文”包围的兴趣点,即兴趣点之前的 360 次测量和兴趣点之后的 360 次测量。 对于每个兴趣点,应根据 m_{i,j}.

的 721 次测量提取特征

我试过在roll_time_series()中使用rolling_direction参数,但唯一的选择是在“时间”中向后或向前滚动 - 我正在寻找一种方法同时包含"past"和"future"数据在特征计算中。

如果我没理解错的话,单面滚动也是可以的。让我们试一试:

您想预测时间 8:00 - 为此您需要从 5:00 到 11:00 的数据。 如果你滚动大小为 6h 和正滚动方向的数据,你最终会得到一个数据集,它也恰好包括这部分数据(5:00 到 11:00)。通常,它将用于训练 11:00(或 12:00)处的值 - 但没有什么能阻止您使用它来预测 8:00 处的值。 基本上,这只是重新索引的问题。

(负滚动方向其实同理)

一个"workaround"解决方案:

使用“roll_time_series”函数两次;一个用于“backward”滚动(设置 rolling_direction=1),第二个用于“forward”(rolling_direction=-1),以及然后将它们合二为一。

这将为原始数据集 m_{i,j}$ 中的每个时间点提供一个具有 360 个值 "from the past" 和 360 个值 "from the future" 的时间序列滚动对象(即时间点位于 window 和 max_timeshift=360)

的中心

使用以下 pandas 函数的注意事项:concat(), sort_values(), drop_duplicates() - 必须 才能使此解决方案正常工作。

import numpy as np
import pandas as pd
from tsfresh.utilities.dataframe_functions import roll_time_series
from tsfresh.feature_extraction import EfficientFCParameters, MinimalFCParameters

rolled_backward = roll_time_series(activity_data,
                                           column_id=id_column,
                                           column_sort=sort_column,
                                           column_kind=None,
                                           rolling_direction=1,
                                           max_timeshift=360)

rolled_farward = roll_time_series(activity_data,
                                           column_id=id_column,
                                           column_sort=sort_column,
                                           column_kind=None,
                                           rolling_direction=-1,
                                           max_timeshift=360)

        # merge into one dataframe, with rolled_farward and rolled_backward window for every time point (sample)
        df = pd.concat([rolled_backward, rolled_farward])

        # important! - sort and drop duplicates
        df.sort_values(by=[id_column, sort_column], inplace=True)
        df.drop_duplicates(subset=[id_column, sort_column, 'activity'], inplace=True, keep='first')