使用tsfresh在sklearn Pipeline中实现时间序列特征选择

使用tsfresh在sklearn Pipeline中实现时间序列特征选择

tsfresh Automatic extraction of relevant features from time series: tsfresh 项目地址: https://gitcode.com/gh_mirrors/ts/tsfresh

概述

在时间序列分析领域,特征提取和选择是构建高效机器学习模型的关键步骤。本文将介绍如何利用tsfresh库与scikit-learn的Pipeline机制相结合,构建一个完整的时间序列分类工作流。我们将通过一个机器人执行失败的预测案例,详细讲解整个实现过程。

环境准备

首先需要确保已安装必要的Python库:

import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

from tsfresh.examples import load_robot_execution_failures
from tsfresh.transformers import RelevantFeatureAugmenter

数据加载与理解

我们使用tsfresh提供的机器人执行失败数据集作为示例。这个数据集记录了机器人执行任务时的各种传感器读数,以及每次执行是否失败的标签。

from tsfresh.examples.robot_execution_failures import download_robot_execution_failures
download_robot_execution_failures() 
df_ts, y = load_robot_execution_failures()

数据集包含两部分:

  • df_ts: 时间序列数据,包含不同时间点的传感器测量值
  • y: 标签数据,指示每次机器人执行是否失败

数据预处理

为了适应Pipeline的工作方式,我们需要准备一个以机器人执行ID为索引的空DataFrame:

X = pd.DataFrame(index=y.index)
X_train, X_test, y_train, y_test = train_test_split(X, y)

构建Pipeline

Pipeline的核心优势在于将多个处理步骤封装为一个整体对象。我们的Pipeline包含两个主要步骤:

  1. 特征增强器(RelevantFeatureAugmenter): 从时间序列中提取并选择相关特征
  2. 分类器(RandomForestClassifier): 使用选择的特征进行分类
ppl = Pipeline([
    ('augmenter', RelevantFeatureAugmenter(column_id='id', column_sort='time')),
    ('classifier', RandomForestClassifier())
])

关键点解析

RelevantFeatureAugmenter需要特别注意时间序列数据的传递方式。虽然Pipeline的输入是空DataFrame,但我们需要额外提供时间序列数据:

ppl.set_params(augmenter__timeseries_container=df_ts)

这种设计允许我们在保持Pipeline接口简洁的同时,灵活处理复杂的时间序列数据。

模型训练与评估

训练Pipeline与常规scikit-learn模型一致:

ppl.fit(X_train, y_train)

训练过程中,RelevantFeatureAugmenter会:

  1. 从时间序列中提取大量候选特征
  2. 基于与目标变量的相关性选择最有价值的特征
  3. 将选择的特征添加到输入DataFrame中

评估模型性能:

y_pred = ppl.predict(X_test)
print(classification_report(y_test, y_pred))

高级应用技巧

查看选择的特征

了解哪些特征被选中对于模型解释非常重要:

selected_features = ppl.named_steps["augmenter"].feature_selector.relevant_features

结合其他特征

Pipeline设计允许我们轻松整合其他特征来源。例如,可以在X_train中加入基于元数据的特征,这些特征将与时间序列特征一起用于分类。

独立训练和预测数据集

在实际应用中,我们可能需要完全分离训练和预测阶段的时间序列数据:

# 分离训练数据
df_ts_train = df_ts[df_ts["id"].isin(y_train.index)]
ppl.set_params(augmenter__timeseries_container=df_ts_train)
ppl.fit(X_train, y_train)

# 保存模型
import pickle
with open("pipeline.pkl", "wb") as f:
    pickle.dump(ppl, f)

# 加载模型进行预测
with open("pipeline.pkl", "rb") as f:
    ppk = pickle.load(f)
    
# 使用测试数据预测
df_ts_test = df_ts[df_ts["id"].isin(y_test.index)]
ppl.set_params(augmenter__timeseries_container=df_ts_test)
y_pred = ppl.predict(X_test)

总结

通过tsfresh与scikit-learn Pipeline的结合,我们构建了一个强大的时间序列分类系统。这种方法的优势在于:

  1. 自动化特征工程: 自动从原始时间序列中提取和选择有价值的特征
  2. 流程封装: 将特征处理和模型训练封装为单一对象,简化部署
  3. 灵活性: 可以轻松整合其他特征来源或预处理步骤

这种模式特别适合工业应用中需要对大量时间序列数据进行自动分析和预测的场景。通过合理配置,可以显著提高时间序列分类任务的效率和准确性。

tsfresh Automatic extraction of relevant features from time series: tsfresh 项目地址: https://gitcode.com/gh_mirrors/ts/tsfresh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庞燃金Alma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值