改进模型的潜在途径之一是:生成更多的潜在特征,输入更多的样本。
Tsfresh是处理时间序列数据的特征工程工具,能够自动计算大量时间序列特征,如平均值、最大值、峰度等。之后,可以使用这些特征集构建机器学习模型。
本文以天池-心跳信号分类预测为例,演示tsfresh工具的用法。
使用示例
1. 合并train和test数据
合并数据集,对整体数据做统一的特征工程。(注意需要为test数据添加label列,值为-1,方便后续操作)
1 | data_test['label'] = -1 |
2. 对原特征一列拆成多列,并为每条数据添加时间特征time
1 | all_heatbeat_df = all_data['heartbeat_signals'].str.split(',', expand = True).stack() |
3. Index处理
1 | all_heatbeat_df = all_heatbeat_df.reset_inex() |
4. label列单独存储,不进入tsfresh
1 | all_data_label = all_data['label'] |
5. tsfresh特征抽取
1 | from tsfresh import extract_features |
6.特征选择
1 | #删除nan值 |
7.相关性特征提取
衍生众多特征之后,许多特征之间可能有很多相关性,需进一步筛选。
1 | from tsfresh import select_features |
8.特征重命名,重新添加label
1 | num = all_features_filtered.columns.size |
tsfresh包深入探究
1. 筛选特征的方法
上文采用了手工打标签的方式划分训练集和测试集,略显麻烦,可以通过tsfresh的内置方法来提取训练数据。
1 | kind_to_fc_parameters = tsfresh.feature_extration.settings.from_columns(directed_features) |
生成的params为训练集的特征字典,可以当作参数传入后续计算中。
2. 自定义特征衍生规则
tsfresh自带的衍生规则以字典的形式存放,可以直接调用,也可以自定义。
1 | #单个特征计算 |
后续可以在extractfeatures中设置defaultparameters = params,具体用法见操作文档。
3. 减小内存使用
tsfresh默认参数太吃内存,且耗时长,笔者i7的16G笔记本最多只能跑到60%的进度就会卡住,天池notebook和谷歌colab都是没跑出结果就断线了,硬要跑的话只能租个高配服务器,或者调整衍生特征的数量,通过chunksize设置,具体用法见操作文档。