特征工程:tsfresh构造时间序列特征

本文基本上是对tsfresh官方文档的部分翻译。
kaggle上使用可以参考tsfresh-features-and-regression-blend

Feature extraction settings

对于懒人:让我计算一些特征!

要计算一组全面的特征,请调用 tsfresh.extract_features() 方法而不传递 default_fc_parameterskind_to_fc_parameters 对象。 这样,您将使用默认选项,它将使用此包中的所有功能计算器,我们认为默认情况下可以返回。

对于高级:如何为所有类型的时间序列设置参数?

在深入挖掘数据后,您可能想要计算更多某种类型的特征,而不是另一种类型。 因此,您需要为特征提取器使用自定义设置。 要使用 tsfresh 执行此操作,您必须使用自定义设置对象:

通过ComprehensiveFCParameters类和default_fc_parameters参数可以实现对不同列计算不同类型的特征。

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

如下所示:

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

也可以通过如下代码删除部分计算选项。

del fc_parameters["length"]

为方便起见,预定义了三个字典,可以立即使用:

  • tsfresh.feature_extraction.settings.ComprehensiveFCParameters:包括所有没有参数的特征和所有有参数的特征,每个特征都有不同的参数组合。 如果您根本不提交 default_fc_parameters,这是 extract_features 的默认值。
  • tsfresh.feature_extraction.settings.MinimalFCParameters:仅包含少数功能,可用于快速测试。 这里使用具有“最小”属性的特征。
  • tsfresh.feature_extraction.settings.EfficientFCParameters:与 tsfresh.feature_extraction.settings.ComprehensiveFCParameters 中的大部分功能相同,但没有标有“high_comp_cost”属性的功能。 如果运行时性能起主要作用,则可以使用此功能。

从理论上讲,您可以通过在字典中添加条目来使用 tsfresh 计算无限数量的特征。

对于ambitious的人:如何为不同类型的时间序列设置参数?

也可以单独控制要为不同种类的时间序列提取的特征。 您可以通过将另一个字典作为:

kind_to_fc_parameters = {“kind” : fc_parameters}

参数。 此 dict 必须是从种类名称(作为字符串)到 fc_parameters 对象的映射,您通常会将其作为参数传递给 default_fc_parameters 参数。

例如以下代码将分别对temperature列和pressure列分别计算mean特征和maximum&minimum特征。

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

一个方便的技巧:我真的必须手动创建字典吗?

不必要。 假设你有一个 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 特征中的特征和参数(!)。

Feature filtering

特征选择的全相关问题是识别所有强相关和弱相关属性。 对于预测性维护或生产线优化等工业应用中的时间序列分类和回归,这个问题尤其难以解决,因为每个标签或回归目标同时与多个时间序列和元信息相关联。

为了限制不相关特征的数量,tsfresh 部署了新算法(fresh 代表基于可扩展假设测试的特征提取)[1]。

该算法由 tsfresh.feature_selection.relevance.calculate_relevance_table() 调用。 它是一种高效的、可扩展的特征提取算法,它在机器学习管道的早期阶段根据其对分类或回归任务的重要性过滤可用特征,同时控制所选但不相关特征的预期百分比。

过滤过程包括三个阶段,如下图所示:
tsfresh特征过滤

过程1:特征提取

首先,该算法使用全面且完善的特征映射来表征时间序列,并考虑描述元信息的附加特征。 用于导出特征的特征计算器是 tsfresh.feature_extraction.feature_calculators 中的那些。

在上图中,这对应于从原始时间序列到聚合特征的变化。

过程2:特征意义测试

在第二步中,每个特征向量都被单独和独立地评估其对预测正在研究的目标的重要性。 这些测试位于子模块tsfresh.feature_selection.significance_tests中。这些测试的结果是一个 p 值向量,量化了每个特征对预测标签/目标的重要性。

在上图中,这对应于从聚合特征到 p 值的变化。

过程3:多重测试程序

p 值向量根据 Benjamini-Yekutieli 程序 [2] 进行评估,以决定保留哪些特征。 这个多重测试过程取自 statsmodel 包。

在上图中,这对应于从 p 值到选定特征的变化。

Large Input Data

如果对于大量的时间序列数据,可能面临以下两个重要问题:

  1. 特征提取时间非常漫长
  2. 巨大的内存消耗,甚至超出机器负荷

为了解决第一个问题,可以通过Parallelization进行并行计算。请注意,默认情况下,本地计算机上的并行化已打开。

但是,对于较大的数据集,您需要同时处理这两个问题。 您有多种选择,我们将在以下段落中讨论。

Dask - 最简单的方式

tsfresh的extract_features可以接受dask dataframe作为pandas dataframe的替换。Dask dataframe允许您将计算扩展到本地内存之外(通过在内部对数据进行分区),甚至扩展到大型机器集群。 它的数据框 API 与 pandas 数据框非常相似,甚至可能是一个替代品。

数据格式中讨论的所有参数也适用于 dask dataframe。 输入数据将使用 dask 方法转换为 tsfresh 的正确格式,特征提取将作为附加计算添加到计算图中。 然后,您可以向结果添加额外的计算,或者像往常一样使用 .compute() 触发计算。

提示:特征提取的最后一步是将所有特征转换为表格格式。 特别是对于非常大的数据样本,这种计算可能是一个很大的性能瓶颈。 因此,我们建议您关闭数据透视,如果您真的不需要它并尽可能使用未透视的数据。

例如,从 parquet 中读取数据并进行特征提取:

import dask.dataframe as dd
from tsfresh import extract_features

df = dd.read_parquet(...)

X = extract_features(df,
                     column_id="id",
                     column_sort="time",
                     pivot=False)

result = X.compute()

Dask - 更多控制

特征提取方法需要执行一些数据转换才能调用实际的特征计算器。 如果您想优化您的数据流,您可能希望更好地控制特征计算如何准确地添加到您的 dask 计算图中。

因此,也可以直接加上特征提取:

from tsfresh.convenience.bindings import dask_feature_extraction_on_chunk
features = dask_feature_extraction_on_chunk(df_grouped,
                                            column_id="id",
                                            column_kind="kind",
                                            column_sort="time",
                                            column_value="value")

然而在这个案例中,df_grouped必须已经在正确的格式中。查看 tsfresh.convenience.bindings.dask_feature_extraction_on_chunk()文档以获取更多信息。 在这种情况下不会执行旋转。

PySpark

与 dask 类似,也可以将特征提取传递到 Spark 计算图中。 您可以在 tsfresh.convenience.bindings.spark_feature_extraction_on_chunk() 的文档中找到更多信息。

Parallelization

特征提取、特征选择以及滚动操作提供了并行计算的可能性。默认情况下,这些任务都有tsfresh并行化。这里讨论控制并行化的不同设置以便取得最佳结果。

Parallelization of Feature Selection

我们使用 multiprocessing.Pool 来并行计算每个特征的 p -value。 在实例化时,我们将 Pool 的工作进程数设置为 n_jobs。 此字段默认为当前系统上的处理器数。 我们建议将其设置为可用(否则为空闲)处理器的最大数量。

Pool 的 map 函数的 chunksize 是另一个需要考虑的重要参数。 它可以通过 chunksize 字段来设置。 默认情况下,它取决于 multiprocessing.Pool 是并行化参数。 一个数据块被定义为一个 id 和一种类型的奇异时间序列。 chunksize 是作为一项任务提交给一个工作进程的块数。 如果将 chunksize 设置为 10,则意味着一个工作任务对应于计算 10 个 id/kind 时间序列组合的所有特征。 如果设置为 None,则根据分发者,使用启发式方法来找到最佳块大小。 块大小可以对最佳集群性能产生至关重要的影响,并且应该在基准测试中针对手头的问题进行优化。

Parallelization of Feature Extraction

对于特征提取,tsfresh 公开了参数 n_jobs 和 chunksize。 两者的行为都类似于特征选择的参数。

要进行性能研究和分析,有时关闭并行化很有用。 这可以通过将参数 n_jobs 设置为 0 来完成。

Parallelization beyond a single machine

大量时间序列数据可能需要大规模分析。 因此,时间序列需要在一组计算单元而不是单个机器上处理。

因此,可能有必要将时间序列特征的提取分布到集群中。 可以使用 tsfresh 以分布式方式提取特征。 在以下段落中,我们将讨论如何设置分布式 tsfresh。

略。

Rolling/Time series forecasting

使用 tsfresh 提取的特征可用于许多不同的任务,例如时间序列分类、压缩或预测。 本节说明我们如何使用这些功能进行时间序列预测。

假设您有 100 个时间步长的某只股票(例如 Apple)的价格。 现在,您想要构建一个基于特征的模型来预测 Apple 股票的未来价格。 您可以删除(今天的)最后一个价格值,并从直到今天的时间序列中提取特征来预测今天的价格。 但这只会给你一个训练的例子。 相反,您可以重复此过程:对于股票价格时间序列中的每一天,删除当前值,提取该值之前的时间特征并训练以预测当天的值(您已删除)。 您可以将其视为在已排序的时间序列数据上移动一个剪切窗口:在每个移位步骤中,您提取通过剪切窗口看到的数据以构建一个新的、较小的时间序列并仅在该时间序列上提取特征 . 然后你继续换档。 在 tsfresh 中,在数据上移动剪切窗口以创建更小的时间序列剪切的过程称为滚动(rolling)。

滚动是一种将单个时间序列转换为多个时间序列的方法,每个时间序列的结束时间都比前一个时间步晚一个(或 n 个)。 tsfresh 中实现的滚动实用程序可帮助您将数据重新整形(和滚动)为可以应用通常的 tsfresh.extract_features() 方法的格式。 这意味着提取时间序列窗口和特征提取的步骤是分开的。

请注意,这里的“时间”不一定指时钟时间。 支持的数据格式中 DataFrame 的“排序”列为各个测量提供了顺序状态。 在时间序列的情况下,这可以是时间维度,而在其他情况下,这可以是位置、频率。 等等。
如下:
在这里插入图片描述

另一个例子可以在流数据中找到,例如在工业 4.0 应用程序中。 在这里,您通常一次获取一个新数据行,并使用它来预测机器故障等。 要训练您的模型,您可以像流式传输数据一样,通过在一个时间步后为分类器提供数据,在前两个时间步后提供数据等。

在 tsfresh 中,滚动是通过辅助函数 tsfresh.utilities.dataframe_functions.roll_time_series() 实现的。 此外,我们提供 tsfresh.utilities.dataframe_functions.make_forecasting_frame() 方法作为方便的包装器,以快速构造给定序列的容器和目标向量。


如果你想训练一个模型进行预测,tsfresh 还提供了函数 tsfresh.utilities.dataframe_functions.make_forecasting_frame(),它可以帮助你正确匹配目标向量。 这个过程在下图中可视化。 它显示了如何将紫色的滚动子时间序列用作构造特征矩阵 X 的基础(如果 f 是 extract_features 函数)。 绿色数据点需要由模型预测,并用作目标向量 y 中的行。 请注意,这仅适用于单个 id 和 kind 的一维时间序列。

在这里插入图片描述

选择非默认的 max_timeshift 或 min_timeshift 将使提取的子时间序列更小,甚至完全删除它们(例如,在 min_timeshift = 1 的情况下,正滚动情况的 (1,1)(即 id=1,timeshift=1) 会消失)。 使用具有更大绝对值(例如 -2 或 2)的 rolling_direction 将跳过一些窗口(在这种情况下,每秒)。

参考链接

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值