心跳信号分类预测Task3 特征处理

简介: 心跳信号分类预测Task3 特征处理

一、特征处理

本节继续上面一篇,特征工程,在数据竞赛中,特征处理往往是很重要的一部分,这也非常符合二八定律的,我们敲代码,调模型这些时间往往没有我们的特征处理时间更长的。

在这里时间序列的特征处理我们要学习一下,工具 Tsfresh(TimeSeries Fresh)的使用

tsfresh是开源的提取时序数据特征的python包,能够提取出超过4000种特征,堪称提取时序特征的瑞士军刀。

  • 数据预处理
时间序列数据格式处理
  加入时间步特征time
  • 特征工程
    时间序列特征构造
    特征筛选
    使用 tsfresh 进行时间序列特征处理

导入包

# 包导入
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
data_train = pd.read_csv("train.csv")
data_test_A = pd.read_csv("testA.csv")
print(data_train.shape)
print(data_test_A.shape)
(100000, 3)
(20000, 2)
data_train.head()
id heartbeat_signals label
0 0 0.9912297987616655,0.9435330436439665,0.764677... 0.0
1 1 0.9714822034884503,0.9289687459588268,0.572932... 0.0
2 2 1.0,0.9591487564065292,0.7013782792997189,0.23... 2.0
3 3 0.9757952826275774,0.9340884687738161,0.659636... 0.0
4 4 0.0,0.055816398940721094,0.26129357194994196,0... 2.0
data_test_A.head()
id heartbeat_signals
0 100000 0.9915713654170097,1.0,0.6318163407681274,0.13...
1 100001 0.6075533139615096,0.5417083883163654,0.340694...
2 100002 0.9752726292239277,0.6710965234906665,0.686758...
3 100003 0.9956348033996116,0.9170249621481004,0.521096...
4 100004 1.0,0.8879490481178918,0.745564725322326,0.531...
数据预处理

将训练集的以,分割之后stack转换成长列

# 对心电特征进行行转列处理,同时为每个心电信号加入时间步特征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
time heartbeat_signals
0 0 0.991230
0 1 0.943533
0 2 0.764677
0 3 0.618571
0 4 0.379632
... ... ...
99999 200 0.000000
99999 201 0.000000
99999 202 0.000000
99999 203 0.000000
99999 204 0.000000

20500000 rows × 2 columns

# 将处理后的心电特征加入到训练数据中,同时将训练数据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)
data_train
id time heartbeat_signals
0 0 0 0.991230
0 0 1 0.943533
0 0 2 0.764677
0 0 3 0.618571
0 0 4 0.379632
... ... ... ...
99999 99999 200 0.000000
99999 99999 201 0.000000
99999 99999 202 0.000000
99999 99999 203 0.000000
99999 99999 204 0.000000

20500000 rows × 3 columns

data_train[data_train["id"]==1]
id time heartbeat_signals
1 1 0 0.971482
1 1 1 0.928969
1 1 2 0.572933
1 1 3 0.178457
1 1 4 0.122962
... ... ... ...
1 1 200 0.000000
1 1 201 0.000000
1 1 202 0.000000
1 1 203 0.000000
1 1 204 0.000000

205 rows × 3 columns

可以看到,每个样本的心电特征都由205个时间步的心电信号组成。

这是数据两边太大了,在使用tsfrsh提取数据将会达到七百多,所以在这里我只使用一部分数据使用

data_train.head()
id time heartbeat_signals
0 0 0 0.991230
0 0 1 0.943533
0 0 2 0.764677
0 0 3 0.618571
0 0 4 0.379632
data_train.shape
(20500000, 3)
portion_data_train=data_train.iloc[:30,:]
portion_data_train
id time heartbeat_signals
0 0 0 0.991230
0 0 1 0.943533
0 0 2 0.764677
0 0 3 0.618571
0 0 4 0.379632
0 0 5 0.190822
0 0 6 0.040237
0 0 7 0.025995
0 0 8 0.031709
0 0 9 0.065524
0 0 10 0.125531
0 0 11 0.146747
0 0 12 0.167656
0 0 13 0.193374
0 0 14 0.226135
0 0 15 0.221143
0 0 16 0.236067
0 0 17 0.221143
0 0 18 0.221143
0 0 19 0.211107
0 0 20 0.208587
0 0 21 0.193374
0 0 22 0.195920
0 0 23 0.198462
0 0 24 0.185706
0 0 25 0.195920
0 0 26 0.183142
0 0 27 0.193374
0 0 28 0.190822
0 0 29 0.208587

使用 tsfresh 进行时间序列特征处理

该包还包含了特征重要性评估、特征选择的方法,因此,不管是基于时序数据的分类问题还是回归问题,tsfresh都会是特征提取一个不错的选择。

from tsfresh import extract_features
# 特征提取
train_features = extract_features(portion_data_train, column_id='id', column_sort='time')
train_features
Feature Extraction: 100%|████████████████████████████████████████████████████████████████| 1/1 [00:09<00:00,  9.45s/it]
heartbeat_signals__variance_larger_than_standard_deviation heartbeat_signals__has_duplicate_max heartbeat_signals__has_duplicate_min heartbeat_signals__has_duplicate heartbeat_signals__sum_values heartbeat_signals__abs_energy heartbeat_signals__mean_abs_change heartbeat_signals__mean_change heartbeat_signals__mean_second_derivative_central heartbeat_signals__median ... heartbeat_signals__permutation_entropy__dimension_5__tau_1 heartbeat_signals__permutation_entropy__dimension_6__tau_1 heartbeat_signals__permutation_entropy__dimension_7__tau_1 heartbeat_signals__query_similarity_count__query_None__threshold_0.0 heartbeat_signals__matrix_profile__feature_"min"__threshold_0.98 heartbeat_signals__matrix_profile__feature_"max"__threshold_0.98 heartbeat_signals__matrix_profile__feature_"mean"__threshold_0.98 heartbeat_signals__matrix_profile__feature_"median"__threshold_0.98 heartbeat_signals__matrix_profile__feature_"25"__threshold_0.98 heartbeat_signals__matrix_profile__feature_"75"__threshold_0.98
0 0.0 0.0 0.0 1.0 7.975869 3.811619 0.044806 -0.026988 0.001169 0.19592 ... 2.778225 2.955209 3.062529 NaN NaN NaN NaN NaN NaN NaN

1 rows × 787 columns

特征选择 train_features中包含了heartbeat_signals的779种常见的时间序列特征(所有这些特征的解释可以去看官方文档),这其中有的特征可能为NaN值(产生原因为当前数据不支持此类特征的计算),使用以下方式去除NaN值:

from tsfresh.utilities.dataframe_functions import impute
import warnings
warnings.filterwarnings("ignore")
# 去除抽取特征中的NaN值
train_features=impute(train_features)

可以的看到后面一排全部被填为了空值

接下来,按照特征和响应变量之间的相关性进行特征选择,这一过程包含两步:首先单独计算每个特征和响应变量之间的相关性,然后利用Benjamini-Yekutieli procedure进行特征选择,决定哪些特征可以被保留。
## from tsfresh import select_features
# 按照特征和数据label之间的相关性进行特征选择
train_features_filtered = select_features(train_features, data_train_label[:2])
train_features_filtered
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-48-f2da600384d2> in <module>
      2 
      3 # 按照特征和数据label之间的相关性进行特征选择
----> 4 train_features_filtered = select_features(train_features, data_train_label[:2])
      5 
      6 train_features_filtered
E:\My_ruan_jian\anaconda3\lib\site-packages\tsfresh\feature_selection\selection.py in select_features(X, y, test_for_binary_target_binary_feature, test_for_binary_target_real_feature, test_for_real_target_binary_feature, test_for_real_target_real_feature, fdr_level, hypotheses_independent, n_jobs, show_warnings, chunksize, ml_task, multiclass, n_significant)
    151     )
    152     assert len(y) > 1, "y must contain at least two samples."
--> 153     assert len(X) == len(y), "X and y must contain the same number of samples."
    154     assert (
    155         len(set(y)) > 1
AssertionError: X and y must contain the same number of samples.

这里报了一错误,两者不匹配,那是因为我把训练集减少了,为了代码能爬出来,不然的话,太浪费时间了,而且内存也比较大,修改的部分在上面加粗了。

另外本文如有错误,请联系作者,及时改正。

路漫漫其修远,我将上下而求索。

相关文章
|
数据处理 Python
Pandas数据处理 | apply() 函数用法指南!
本文介绍一下关于 Pandas 中 apply() 函数的几个常见用法,apply() 函数的自由度较高,可以直接对 Series 或者 DataFrame 中元素进行逐元素遍历操作,方便且高效,具有类似于 Numpy 的特性。
|
5月前
|
传感器 机器学习/深度学习 数据采集
【航空发动机寿命预测】基于SE-ResNet网络的发动机寿命预测,C-MAPSS航空发动机寿命预测研究(Matlab代码实现)
【航空发动机寿命预测】基于SE-ResNet网络的发动机寿命预测,C-MAPSS航空发动机寿命预测研究(Matlab代码实现)
378 0
|
数据采集 机器学习/深度学习 数据挖掘
R语言数据清洗:高效处理缺失值与重复数据的策略
【8月更文挑战第29天】处理缺失值和重复数据是数据清洗中的基础而重要的步骤。在R语言中,我们拥有多种工具和方法来有效地应对这些问题。通过识别、删除或插补缺失值,以及删除重复数据,我们可以提高数据集的质量和可靠性,为后续的数据分析和建模工作打下坚实的基础。 需要注意的是,处理缺失值和重复数据时,我们应根据实际情况和数据特性选择合适的方法,并在处理过程中保持谨慎,以避免引入新的偏差或错误。
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
缓存 运维 负载均衡
分布式系统架构设计与挑战
【6月更文挑战第29天】分布式系统架构设计涉及组件化、通信、数据一致性、负载均衡和容错处理,旨在实现高可用性和可扩展性。然而,数据一致性、性能、可伸缩性和容错是主要挑战。解决方案包括使用一致性算法、性能优化、设计可伸缩架构和实施容错机制。随着技术进步,这类系统将继续在云、大数据和物联网中扮演关键角色。
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
Android开发 iOS开发 UED
探索iOS与安卓的用户体验设计差异
本篇文章深入探讨了iOS和安卓两大移动操作系统在用户体验设计上的核心差异。通过对比分析,揭示两个系统的设计哲学、交互模式以及视觉语言如何影响用户的感知和使用习惯。文章不仅聚焦于设计理念和技术实现,还关注用户反馈和市场趋势,以期为设计师提供跨平台设计的洞见。
|
监控 中间件 数据库
开源数据库中间件对比
Proxy式架构和客户端式架构的优劣     Proxy式架构 客户端式架构 优点 1, 集中式管理监控和升级维护方便 2, 解决连接数问题 1.
5277 97
|
编解码 计算机视觉 C++
【OpenCV】—形态学滤波(1):腐蚀与膨胀
【OpenCV】—形态学滤波(1):腐蚀与膨胀
301 2
|
SQL 分布式计算 安全
ClickHouse(22)ClickHouse集成HDFS表引擎详细解析
ClickHouse的HDFS引擎允许直接在Hadoop生态系统内管理数据。使用`ENGINE=HDFS(URI, format)`,其中URI指定HDFS路径,format定义文件格式(如TSV、CSV或ORC)。表可读写,但不支持`ALTER`、`SELECT...SAMPLE`、索引和复制操作。通配符可用于文件路径,如`*`、`?`和范围`{N..M}`。Kerberos认证可配置。虚拟列包括文件路径 `_path` 和文件名 `_file`。有关更多信息,参见相关文章系列。
571 0