使用tsfresh在sklearn Pipeline中实现时间序列特征选择
概述
在时间序列分析领域,特征提取和选择是构建高效机器学习模型的关键步骤。本文将介绍如何利用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包含两个主要步骤:
- 特征增强器(RelevantFeatureAugmenter): 从时间序列中提取并选择相关特征
- 分类器(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
会:
- 从时间序列中提取大量候选特征
- 基于与目标变量的相关性选择最有价值的特征
- 将选择的特征添加到输入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的结合,我们构建了一个强大的时间序列分类系统。这种方法的优势在于:
- 自动化特征工程: 自动从原始时间序列中提取和选择有价值的特征
- 流程封装: 将特征处理和模型训练封装为单一对象,简化部署
- 灵活性: 可以轻松整合其他特征来源或预处理步骤
这种模式特别适合工业应用中需要对大量时间序列数据进行自动分析和预测的场景。通过合理配置,可以显著提高时间序列分类任务的效率和准确性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考