特征提取设置
在开始一个新的涉及时间序列的数据科学项目时,您可能希望首先提取一组全面的功能。之后,您可以确定哪些功能与当前任务相关。在最后阶段,您可能希望微调功能的参数以微调您的模型。
你可以用 tsfresh 做所有这些事情。因此,你需要知道如何控制 tsfresh 计算哪些特征,以及如何调整参数。在本节中,我们将对此进行说明。
对于懒人:只需让我计算一些特征!
要计算一组综合特征,调用 tsfresh.extract_features() 方法,不传递 default_fc_parameters 或 kind_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)
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.05 和 r = 0.1。
因此,您可以通过在这个字典中添加或删除键或参数来控制将提取哪些特征。就这么简单。如果您决定不在这里计算长度特征,您可以从字典中删除它:
del fc_parameters["length"]
现在,只计算另外两个特性。
为了方便,预定义了三个字典,可以直接使用:
tsfresh.feature_extraction.settings.ComprehensiveFCParameters: 包含所有无参数的特征和所有有参数的特征,每个特征都有不同的参数组合。如果你没有在tsfresh.extract_features()中传入default_fc_parameters,这是默认设置。tsfresh.feature_extraction.settings.MinimalFCParameters: 仅包含少量特征,可用于快速测试。这里使用了具有“minimal”属性的特征。tsfresh.feature_extraction.settings.EfficientFCParameters: 与tsfresh.feature_extraction.settings.ComprehensiveFCParameters中的特征大部分相同,但不包括标记为“high_comp_cost”属性的特征。如果运行时性能起主要作用,可以使用此设置。
理论上,你可以通过向字典中不断添加条目,使用 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}
}
将提取 "温度" 时间序列的 "平均值" 特征以及 "压力" 时间序列的 "最小值" 和 "最大值"。
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 特征及其参数。