心跳信号分类预测TASK03
TASK03 特征工程
一、理论基础
1.学习目标
- 学习时间序列数据的特征预处理方法
- 学习时间序列特征处理工具 Tsfresh(TimeSeries Fresh)的使用
2.学习内容
- 数据预处理
– 时间序列数据格式处理
– 加入时间步特征time - 特征工程
– 时间序列特征构造
– 特征筛选
– 使用 tsfresh 进行时间序列特征处理
3.主要函数介绍
3.1Tsfresh 介绍
- tsfresh是一个Python的时序数据特征挖掘的模块(官网https://tsfresh.readthedocs.io/en/latest/index.html),提取的特征可以用来描述或聚类基于提取特征的时间序列。此外,它们还可以用于构建在时间序列上执行分类/回归任务的模型。(链接:https://www.jianshu.com/p/de2f7d333b9f https://zhuanlan.zhihu.com/p/102186988)
- 安装
pip install tsfresh
豆瓣源:pip install tsfresh -i http://pypi.douban.com/simple
(这里我在安装的时候,在python3.8.2的版本下,虽然安装成功,但是在import tsfresh as tsf 的时候报错:找不到指定模块:DLL load failed while importing cympx.但是我在python3.5.3和python3.7.6版本下使用都是正常的,不知道是不是tsfresh0.18.0不支持python3.8.2.) - 特点
TsFresh能自动地计算出大量的时间序列特征,即所谓的特征,这些特征描述了时间序列的基本特征,如峰数、平均值或最大值或更复杂的特征,如时间反转对称统计。同时通过假设检验来将特征消减到最能解释趋势的特征,称为去相关性。然后,可以使用这些特征集在时间序列上构造统计或机器学习模型,例如在回归或分类任务中使用。
3.2 tsfresh子模块介绍
官网https://tsfresh.readthedocs.io/en/latest/api/tsfresh.html
3.2.1.tsfresh.convenience package
Submodules
- tsfresh.convenience.bindings module
在给定列名和提取设置的情况下,在分组的dask dataframe上提取特征。 - tsfresh.convenience.relevant_extraction module
从时间序列容器中提取时间序列特征的高级便利函数。
然后返回特征矩阵X,该特征矩阵X可能根据目标向量y的相关特征扩展。
3.2.2tsfresh.examples package
Submodules
- tsfresh.examples.driftbif_simulation module
对dissipative soliton的m维速度模拟了n个时间序列。 - tsfresh.examples.har_dataset module
下载并加载人类活动识别数据集。 - tsfresh.examples.robot_execution_failures module
下载机器人执行单元故障数据集。
3.2.3tsfresh.feature_extraction package
Submodules
- tsfresh.feature_extraction.data module
对数据应用包装特征提取函数“f”。在此之前,将数据转换为可用于特征提取的时间序列实例的正确形式。在调用之后,将其转换回dataframe以进行进一步处理。 - tsfresh.feature_extraction.extraction module
与tsfresh交互:提取特征 - tsfresh.feature_extraction.feature_calculators module
- tsfresh.feature_extraction.settings module
3.2.4 tsfresh.feature_selection package
Submodules
- tsfresh.feature_selection.relevance module
- tsfresh.feature_selection.selection module
- tsfresh.feature_selection.significance_tests module
3.2.5 tsfresh.scripts package
Submodules
- tsfresh.scripts.measure_execution_time module
- tsfresh.scripts.run_tsfresh module
- tsfresh.scripts.test_timing module
3.2.6 tsfresh.transformers package
Submodules
- tsfresh.transformers.feature_augmenter module
- tsfresh.transformers.feature_selector module
- tsfresh.transformers.per_column_imputer module
- tsfresh.transformers.relevant_feature_augmenter module
3.2.7 tsfresh.utilities package
Submodules
- tsfresh.utilities.dataframe_functions module
- tsfresh.utilities.distribution module
- tsfresh.utilities.profiling module
- tsfresh.utilities.string_manipulation module
4.时间序列预测方法介绍
借鉴来自:
https://zhuanlan.zhihu.com/p/67832773
序号 | 方法 |
---|---|
1 | 时间序列基本规则法-周期因子法 |
2 | 线性回归-利用时间特征做线性回归 |
3 | 传统时序建模方法,ARMA/ARIMA等线性模型 |
4 | 时间序列分解,使用加法模型或乘法模型将原始序列拆分为4部分:长期趋势变动T、季节变动S(显式周期,固定幅度、长度的周期波动)、循环变动C(隐式周期,周期长不具严格规则的波动)和不规则变动I |
5 | 特征工程着手,时间滑窗改变数据的组织方式,使用xgboost/LSTM模型/时间卷积网络等 |
6 | 转化为监督学习数据集,使用xgboot/LSTM模型/时间卷积网络/seq2seq(attention_based_model) |
7 | Facebook-prophet,类似于STL分解思路 |
8 | 深度学习网络,结合CNN+RNN+Attention,作用各不相同互相配合 |
9 | 将时间序列转化为图像,再应用基于卷积神经网络的模型做分析 |
二、代码实现
#导入包
import pandas as pd
import numpy as np
import tsfresh as tsf
from tsfresh import extract_features, select_features
from tsfresh.utilities.dataframe_functions import impute
#读取数据
train = pd.read_csv(r'D:\wy\data mining\for study\202103datawhale\train.csv')
test = pd.read_csv(r'D:\wy\data mining\for study\202103datawhale\testA.csv')
print(train.shape)
print(test.shape)
数据展示:
把心跳信号以逗号分隔拆开:
设置行的index
把level_0设置为index
把level_0的名字去掉
把之前的列名‘level_1’改为time,0改为heartbeat_signals
把心跳信号那列数据类型改为float
把训练集中的标签数据拿出来。
把训练集的label列去掉
把训练集的心跳信号去掉,留下id
把id和以逗号分隔后的训练集心跳信号时序数据合并
查看每个样本有多少个心跳信号
可以看到,每个样本的心电特征都由205个时间步的心电信号组成。
使用 tsfresh 进行时间序列特征处理
这部分我的电脑(内存8GB,CPU I5)没跑出来,内存不够。
下面贴一下别人跑出来的情况:
train_features数据展示如下:
特征选择 train_features中包含了heartbeat_signals的787种常见的时间序列特征。下面,这其中有的特征可能为NaN值(产生原因为当前数据不支持此类特征的计算),使用以下方式去除NaN值:
from tsfresh.utilities.dataframe_functions import impute
impute(train_features)
接下来,按照特征和响应变量之间的相关性进行特征选择,这一过程包含两步:首先单独计算每个特征和响应变量之间的相关性,然后利用Benjamini-Yekutieli procedure 进行特征选择,决定哪些特征可以被保留。
from tsfresh import select_features
train_features_filtered = select_features(train_features, data_train_label)
train_features_filtered