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')
作为原始数据,我们对数据集中的每个对象 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}
.
我试过在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')