Task3 特征工程
3.1 学习目标
•学习时间序列数据的特征预处理方法
•学习时间序列特征处理工具 Tsfresh(TimeSeries Fresh)的使用
3.2 内容介绍
•数据预处理
- 时间序列数据格式处理
- 加入时间步特征time
•特征工程
- 时间序列特征构造
- 特征筛选
- 使用 tsfresh 进行时间序列特征处理
导入包和数据库
首先安装tsfresh包
pip install tsfresh --user
导入需要的库
import numpy as np
import pandas as pd
import tsfresh as tsf
from tsfresh import extract_features,select_features
from tsfresh.utilities.dataframe_functions import impute
读取训练数据和测试数据
#数据读取
data_train = pd.read_csv("train.csv")
data_test_A = pd.read_csv("testA.csv")
print(data_train.shape)
print(data_test_A.shape)
data_train.head()
data_test_A.head()
数据预处理
对心电数据进行行转列处理,同时为每个心电信号加入时间步特征time
#数据预处理
train_heartbeat_df=data_train["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)
print(train_heartbeat_df)
将处理后的心电特征加入到训练数据中,同时将训练数据label列单独存储
data_train_label = data_train["label"]
data_train = data_train.drop('label',axis=1)
data_train = data_train.drop('heartbeat_signals',axis=1)
data_train=data_train.join(train_heartbeat_df)
print(data_train)
data_train[data_train["id"]==1]
通过上图可知,每一个样本的心电特征都是由205个时间步的心电信号组成。
使用tsfresh进行时间序列特征处理
Tsfrseh(TimeSeries Fresh):是一个Python第三方库。它可以自动计算大量的时间序列数据的特征。此外,该包还包含了特征重要性评估、特征选择的方法,因此,不管是基于时序数据的分类问题还是回归问题,tsfresh都会是特征提取一个不错的选择。
特征提取
from tsfresh import extract_features
train_features=extract_features(data_train,column_id='id',column_sort='time')
调用extract_features()方法之后,返回的仍是一个dataframe.
特征处理
train_features中包含了heartbeat_signals的779中创建时间序列特征,其中有的特征可能为 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)