用于python的TSFRESH库花费太长时间来处理

时间:2016-12-14 16:56:56

标签: python-2.7 time time-series feature-extraction

我遇到了TSfresh库,作为一种特色化时间序列数据的方法。文档很棒,似乎非常适合我正在进行的项目。

我想实现以下代码,这些代码在TFresh文档的快速入门部分中共享。这似乎很简单。

from tsfresh import extract_relevant_features
feature_filtered_direct=extract_relevant_features(result,y,column_id=0,column_sort=1)

我的数据包括40万行传感器数据,每个传感器有6个传感器,用于15个不同的ID。我开始运行代码,17个小时后它还没有完成。我认为这可能是一个太大的数据集,无法通过相关的功能提取器运行,所以我将其削减到3000,然后进一步降低到300.这些操作都没有使代码在一小时内运行,我刚刚结束一小时左右的等待后关闭它。我也试过了标准特征提取器

extracted_features = extract_features(timeseries, column_id="id", column_sort="time")

尝试TSfresh在其快速入门部分提供的示例数据集。其中包括一个与我的原始数据非常相似的数据集,与我减少的数据点大致相同。

有没有人对此代码有任何经验?你会如何让它更快地运作?我使用Anaconda for python 2.7。

更新 它似乎与多处理有关。因为我在Windows上,所以使用多进程代码需要受

保护
if __name__ == "__main__":
    main()

我添加

if __name__ == "__main__":

    extracted_features = extract_features(timeseries, column_id="id", column_sort="time")

对于我的代码,示例数据有效。我在运行extract_relevant_features函数和在我自己的数据集上运行提取功能模块时仍遇到一些问题。似乎它继续缓慢运行。我有一种感觉它也与多进程冻结有关,但没有任何错误突然出现它无法分辨。它花了我大约30分钟的时间来提取不到1%的数据集中的功能。

3 个答案:

答案 0 :(得分:5)

您使用的是哪个版本的tsfresh?哪个OS?

我们意识到某些特征计算器的高计算成本。我们可以做的事情少得多。在未来,我们将实施一些技巧,如缓存,以进一步提高tsfresh的效率。

您是否尝试使用MinimalFeatureExtractionSettings仅计算基本功能?它只包含Max,Min,Median等基本功能,但应该运行得更快。

 from tsfresh.feature_extraction import MinimalFeatureExtractionSettings
 extracted_features = extract_features(timeseries, column_id="id", column_sort="time", feature_extraction_settings = MinimalFeatureExtractionSettings())

也可以通过pip install git+https://github.com/blue-yonder/tsfresh从回购安装最新版本。我们正在积极开发它,主人应该包含最新和最新的版本;)。

答案 1 :(得分:2)

语法略有变化(请参见docs),当前方法是:

from tsfresh.feature_extraction import EfficientFCParameters, MinimalFCParameters
extract_features(timeseries, column_id="id", column_sort="time", default_fc_parameters=MinimalFCParameters())

extract_features(timeseries, column_id="id", column_sort="time", default_fc_parameters=EfficientFCParameters())

答案 2 :(得分:0)

从0.15.0版开始,我们改进了Apache Sparkdask的绑定。 现在可以在通常的tsfreshdask计算图中直接使用Spark特征提取。

您可以在tsfresh.convenience.bindings的文档here中找到绑定。以dask为例,它看起来像这样(假设dfdask.DataFrame,例如我们示例中的机器人故障数据框)

df = df.melt(id_vars=["id", "time"],
             value_vars=["F_x", "F_y", "F_z", "T_x", "T_y", "T_z"],
             var_name="kind", value_name="value")
df_grouped = df.groupby(["id", "kind"])
features = dask_feature_extraction_on_chunk(df_grouped, column_id="id", column_kind="kind",
                                            column_sort="time", column_value="value",
                                            default_fc_parameters=EfficientFCParameters())
                                            # or any other parameter set

使用daskSpark(或类似方法)可能会帮助您处理非常大的数据-既有内存又有速度(因为您可以将工作分配到多台计算机上)。当然,我们仍然像以前一样支持常规的发行商(docu)。

除此之外,还可以将tsfresh与任务编排系统(例如luigi)一起运行。您可以创建一个任务来 *仅读取一个idkind的数据 *提取功能 *将结果写到磁盘 然后让luigi处理所有其余的工作。您可能会找到此here on my blog的可能实现。