特征提取设置
在开始一个涉及时间序列的新数据科学项目时,你可能希望先提取一组全面的特征。之后,你可以确定哪些特征与手头的任务相关。在最后阶段,你可能希望微调特征的参数以微调你的模型。
你可以用 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)
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.05
和 r = 0.1
。
因此,你可以通过从此字典中添加或移除键或参数来控制提取哪些特征。就这么简单。如果你决定不计算这里的长度特征,你可以从字典中删除它
del fc_parameters["length"]
现在,只计算了另外两个特征。
为了方便起见,预定义了三个字典,可以直接使用
tsfresh.feature_extraction.settings.ComprehensiveFCParameters
: 包含所有不带参数的特征以及所有带参数的特征,每个参数都包含不同的参数组合。如果你完全不传入default_fc_parameters
,这将是tsfresh.extract_features()
的默认设置。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}
}
将提取 "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 特征中的特征和参数 (!)。