特征提取设置

在开始一个涉及时间序列的新数据科学项目时,你可能希望先提取一组全面的特征。之后,你可以确定哪些特征与手头的任务相关。在最后阶段,你可能希望微调特征的参数以微调你的模型。

你可以用 tsfresh 完成所有这些事情。因此,你需要了解如何控制 tsfresh 计算哪些特征以及如何调整参数。在本节中,我们将对此进行说明。

对于懒人:直接给我计算一些特征!

要计算一组全面的特征,调用 tsfresh.extract_features() 方法时不要传入 default_fc_parameterskind_to_fc_parameters 对象。这样你将使用默认选项,这将使用本包中我们认为默认可以返回的所有特征计算器。

对于进阶用户:如何为所有类型的时间序列设置参数?

深入研究数据后,你可能希望计算更多某种类型的特征,而减少另一种类型的特征。因此,你需要为特征提取器使用自定义设置。要使用 tsfresh 执行此操作,你必须使用自定义设置对象

>>> from tsfresh.feature_extraction import ComprehensiveFCParameters
>>> settings = ComprehensiveFCParameters()
>>> # Set here the options of the settings object as shown in the paragraphs below
>>> # ...
>>> from tsfresh.feature_extraction import extract_features
>>> extract_features(df, default_fc_parameters=settings)

The default_fc_parameters 预期是一个字典,它将特征计算器名称(你在 tsfresh.feature_extraction.feature_calculators 文件中可以找到的函数名称)映射到一个字典列表,这些字典是调用该函数时使用的参数(作为键值对)。此字典中的每个函数-参数组合将在提取过程中被调用,并生成一个特征。如果函数不接受任何参数,则该值应设置为 None

例如

fc_parameters = {
    "length": None,
    "large_standard_deviation": [{"r": 0.05}, {"r": 0.1}]
}

将生成三个特征:一个是通过调用 tsfresh.feature_extraction.feature_calculators.length() 函数且不带任何参数,另外两个是通过调用 tsfresh.feature_extraction.feature_calculators.large_standard_deviation() 并分别使用参数 r = 0.05r = 0.1

因此,你可以通过从此字典中添加或移除键或参数来控制提取哪些特征。就这么简单。如果你决定不计算这里的长度特征,你可以从字典中删除它

del fc_parameters["length"]

现在,只计算了另外两个特征。

为了方便起见,预定义了三个字典,可以直接使用

理论上,通过向字典中逐条添加条目,你可以使用 tsfresh 计算无限数量的特征。

对于有追求者:如何为不同类型的时间序列设置参数?

还可以单独控制为不同类型的时间序列提取哪些特征。你可以通过向 tsfresh.extract_features() 函数传递一个 kind_to_fc_parameters 参数来实现。它应该是一个字典,将类别名称(字符串形式)映射到 fc_parameters 对象,你通常会将其作为参数传递给 default_fc_parameters 参数。

例如,以下代码片段

kind_to_fc_parameters = {
    "temperature": {"mean": None},
    "pressure": {"maximum": None, "minimum": None}
}

将提取 "temperature" 时间序列的 "mean" 特征以及 "pressure" 时间序列的 "minimum""maximum" 特征。

The kind_to_fc_parameters 参数将部分覆盖 default_fc_parameters。因此,如果你在 kind_to_fc_parameters 参数中包含一个类别名称,则其值将用于该类别。其他类别仍将使用 default_fc_parameters

一个实用技巧:我真的需要手动创建字典吗?

不一定。假设你有一个包含 tsfresh 特征的 DataFrame。通过使用特征选择算法,你会发现只有一部分特征是相关的。

然后,我们提供 tsfresh.feature_extraction.settings.from_columns() 方法,该方法根据此过滤后的特征矩阵的列名构建 kind_to_fc_parameters 字典,以确保仅提取相关特征。

这可以节省大量时间,因为你避免了计算不必要的特征。让我们用一个例子来说明这一点

# X_tsfresh contains the extracted tsfresh features
X_tsfresh = extract_features(...)

# which are now filtered to only contain relevant features
X_tsfresh_filtered = some_feature_selection(X_tsfresh, y, ....)

# we can easily construct the corresponding settings object
kind_to_fc_parameters = tsfresh.feature_extraction.settings.from_columns(X_tsfresh_filtered)

上面的代码将为你构建一个 kind_to_fc_parameters 字典,该字典对应于通过 some_feature_selection 特征选择算法过滤后的 tsfresh 特征中的特征和参数 (!)。