3-22心电图多分类预测task03
前言
这部分主要为了了解时间序列特征工程以及分析方法,学习时间序列数据的特征预处理方法以及时间序列特征处理工具Tsfresh的使用
一、研究内容
数据预处理:
时间序列数据格式处理
加入时间步特征time
特征工程:
时间序列特征构造
特征筛选
使用 tsfresh 进行时间序列特征处理
二、代码示例
1.导入包并读取数据
代码如下:
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
path = './data/'
train_data = pd.read_csv(path+'train.csv')
test_data = pd.read_csv(path+'testA.csv')
print('train data shape:',train_data.shape)
print('test data shape:',test_data.shape)
train_data.head()
test_data.head()
2.数据预处理
代码如下(示例):
# 对心电特征进行行转列处理,同时为每个心电信号加入时间步特征time
train_heartbeat_df = train_data["heartbeat_signals"].str.split(",", expand=True).stack()
train_heartbeat_df = train_heartbeat_df.reset_index()
train_heartbeat_df = train_heartbeat_df.set_index("level_0")
train_heartbeat_df.index.name = None
train_heartbeat_df.rename(columns={"level_1":"time", 0:"heartbeat_signals"}, inplace=True)
train_heartbeat_df["heartbeat_signals"] = train_heartbeat_df["heartbeat_signals"].astype(float)
train_heartbeat_df
# 将处理后的心电特征加入到训练数据中,同时将训练数据label列单独存储
train_data_label = train_data["label"]
train_data = train_data.drop("label", axis=1)
train_data = train_data.drop("heartbeat_signals", axis=1)
train_data = train_data.join(train_heartbeat_df)
train_data
train_data[train_data["id"]==1]
3.使用tsfresh进行时间序列特征处理
1. 特征抽取
**Tsfresh(TimeSeries Fresh)**是一个Python第三方工具包。 它可以自动计算大量的时间序列数据的特征。此外,该包还包含了特征重要性评估、特征选择的方法,因此,不管是基于时序数据的分类问题还是回归问题,tsfresh都会是特征提取一个不错的选择。官方文档:Introduction — tsfresh 0.17.1.dev24+g860c4e1 documentation
train_features = extract_features(train_data, column_id='id', column_sort='time')
train_features
2. 特征选择
train_features中包含了heartbeat_signals的787种常见的时间序列特征(所有这些特征的解释可以去看官方文档),这其中有的特征可能为NaN值(产生原因为当前数据不支持此类特征的计算),使用以下方式去除NaN值:
from tsfresh.utilities.dataframe_functions import impute
impute(train_features)
可以将提取的features保存为pkl的格式,在需要时导入已经跑好的特征(以pkl格式存储),直接读取用,不用每次都要重新生成这么耗时
import pickle
with open("train_features.pkl", "wb") as f:
pickle.dump(train_features, f)
feature_file = open("train_features.pkl", "rb")
train_features_from_file = pickle.load(feature_file)
train_features_from_file
接下来,按照特征和响应变量之间的相关性进行特征选择,这一过程包含两步:首先单独计算每个特征和响应变量之间的相关性,然后利用Benjamini-Yekutieli procedure [1] 进行特征选择,决定哪些特征可以被保留。
from tsfresh import select_features
train_features_filtered = select_features(train_features, train_data_label)
train_features_filtered