1.導(dǎo)入包并讀取數(shù)據(jù)
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
2.數(shù)據(jù)讀取
data_train = pd.read_csv("data/train.csv")
data_test_A = pd.read_csv("data/testA.csv")
print(data_train.shape)
print(data_test_A.shape)
data_train.head()
data_test_A.head()
3.數(shù)據(jù)預(yù)處理
# 對(duì)心電特征進(jìn)行行轉(zhuǎn)列處理,同時(shí)為每個(gè)心電信號(hào)加入時(shí)間步特征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)
train_heartbeat_df
# 將處理后的心電特征加入到訓(xùn)練數(shù)據(jù)中和簸,同時(shí)將訓(xùn)練數(shù)據(jù)label列單獨(dú)存儲(chǔ)
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)
data_train
data_train[data_train["id"]==1]
每個(gè)樣本的心電特征都由205個(gè)時(shí)間步的心電信號(hào)組成栋齿。
4.使用 tsfresh 進(jìn)行時(shí)間序列特征處理
4.1 特征抽取
Tsfresh(TimeSeries Fresh)是一個(gè)Python第三方工具包。 它可以自動(dòng)計(jì)算大量的時(shí)間序列數(shù)據(jù)的特征。此外,該包還包含了特征重要性評(píng)估兄春、特征選擇的方法澎剥,因此锡溯,不管是基于時(shí)序數(shù)據(jù)的分類問(wèn)題還是回歸問(wèn)題赶舆,tsfresh都會(huì)是特征提取一個(gè)不錯(cuò)的選擇。官方文檔:Introduction — tsfresh 0.17.1.dev24+g860c4e1 documentation
from tsfresh import extract_features
# 特征提取
train_features = extract_features(data_train, column_id='id', column_sort='time')
train_features
4.2 特征選擇
train_features中包含了heartbeat_signals的779種常見(jiàn)的時(shí)間序列特征(所有這些特征的解釋可以去看官方文檔)祭饭,這其中有的特征可能為NaN值(產(chǎn)生原因?yàn)楫?dāng)前數(shù)據(jù)不支持此類特征的計(jì)算)芜茵,使用以下方式去除NaN值:
from tsfresh.utilities.dataframe_functions import impute
# 去除抽取特征中的NaN值
impute(train_features)
接下來(lái),按照特征和響應(yīng)變量之間的相關(guān)性進(jìn)行特征選擇倡蝙,這一過(guò)程包含兩步:首先單獨(dú)計(jì)算每個(gè)特征和響應(yīng)變量之間的相關(guān)性九串,然后利用Benjamini-Yekutieli procedure [1] 進(jìn)行特征選擇,決定哪些特征可以被保留寺鸥。
from tsfresh import select_features
# 按照特征和數(shù)據(jù)label之間的相關(guān)性進(jìn)行特征選擇
train_features_filtered = select_features(train_features, data_train_label)
train_features_filtered
可以看到經(jīng)過(guò)特征選擇猪钮,留下了700個(gè)特征。