天池比赛数据挖掘心电图特征工程

黎明之道 等级 424 0 0

Task3 特征工程

3.1 学习目标

  • 学习时间序列数据的特征预处理方法
  • 学习时间序列特征处理工具 Tsfresh(TimeSeries Fresh)的使用

3.2 内容介绍

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

3.3 代码示例

3.3.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
# 数据读取
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…

3.3.2 数据预处理

# 对心电特征进行行转列处理,同时为每个心电信号加入时间步特征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.0
99999    99999    201        0.0
99999    99999    202        0.0
99999    99999    203        0.0
99999    99999    204        0.0

20500000 rows × 4 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.0
1            1            201        0.0
1            1            202        0.0
1            1            203        0.0
1            1            204        0.0

205 rows × 4 columns

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

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

  1. 特征抽取

Tsfresh(TimeSeries Fresh)是一个Python第三方工具包。 它可以自动计算大量的时间序列数据的特征。此外,该包还包含了特征重要性评估、特征选择的方法,因此,不管是基于时序数据的分类问题还是回归问题,tsfresh都会是特征提取一个不错的选择。官方文档: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
id        sum_values        abs_energy        mean_abs_change        mean_change     ...
0            38.927945            18.216197            0.019894                    -0.004859            ...
1            19.445634            7.705092            0.019952                    -0.004762            ...
2            21.192974            9.140423            0.009863                    -0.004902            ...
...        ...                        ...                        ...                                ...                        ...
99997    40.897057            16.412857            0.019470                    -0.004538            ...
99998    42.333303            14.281281            0.017032                    -0.004902            ...
99999    53.290117            21.637471            0.021870                    -0.004539            ...

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

去除抽取特征中的NaN值

impute(train_features)


```python
id        sum_values        abs_energy        mean_abs_change        mean_change     ...
0            38.927945            18.216197            0.019894                    -0.004859            ...
1            19.445634            7.705092            0.019952                    -0.004762            ...
2            21.192974            9.140423            0.009863                    -0.004902            ...
...        ...                        ...                        ...                                ...                        ...
99997    40.897057            16.412857            0.019470                    -0.004538            ...
99998    42.333303            14.281281            0.017032                    -0.004902            ...
99999    53.290117            21.637471            0.021870                    -0.004539            ...

100000 rows × 779 columns

接下来,按照特征和响应变量之间的相关性进行特征选择,这一过程包含两步:首先单独计算每个特征和响应变量之间的相关性,然后利用Benjamini-Yekutieli procedure [1] 进行特征选择,决定哪些特征可以被保留。

from tsfresh import select_features

# 按照特征和数据label之间的相关性进行特征选择
train_features_filtered = select_features(train_features, data_train_label)

train_features_filtered
id        sum_values        fft_coefficient__attr_"abs"__coeff_35        fft_coefficient__attr_"abs"__coeff_34        ...
0            38.927945            1.168685                                                                0.982133                                                                ...
1            19.445634            1.460752                                                                1.924501                                                                ...
2            21.192974            1.787166                                                                2.1469872                                                                ...
...        ...                        ...                                                                            ...                                                                            ...
99997    40.897057            1.190514                                                                0.674603                                                                ...
99998    42.333303            1.237608                                                                1.325212                                                                ...
99999    53.290117            0.154759                                                                2.921164                                                                ...

100000 rows × 700 columns

可以看到经过特征选择,留下了700个特征。

收藏
评论区

相关推荐

同学,你这简历上没项目啊!
大家好,我是小五 同学,刚毕业或者转行去求职数据分析师的时候,你遭遇过这样的尴尬怪圈吗? (https://imghelloworld.osscnbei
天猫双11数据过于完美?我们用python来看看
↑关注置顶 有趣的不像个技术号 是否真的完美? 双11结束了,大家已经无手可剁 。 天猫官方公布了今年的双11成交额为2684亿元,成
和月薪5万的鹅厂数据分析师聊天后,我想辞职了……
这是我入行数据分析的第735天: 今天的工作依旧是整理需求、取数、做表; 下午的会上依旧和各业务部门进行撕X大战; 熬夜加班做出来的报告成为老板的压箱底; 更
天池比赛数据挖掘心电图赛题理解
Datawhale 零基础入门数据挖掘Task1 赛题理解 Task1赛题理解比赛地址:https://tianchi.aliyun.com/competition/entrance/531883/introduction 1.1学习目标 理解赛题数据和目标,清楚评分体系。 完成相应报名,下载数据和结果提交打卡(可提交示例结果),熟悉比赛
Python数据分析实战(1)数据分析概述
一、入门数据分析 1.大数据时代的基本面大数据产业发展现状:现在数据已经呈现出了爆炸式的增长,每一分钟可能就会有: 13000个iPhone应用下载 Twitter上发布98000新微博 发出1.68亿条Email 淘宝双十一10680个新订单 12306出票1840张在大数据时代,出现了三大变革: 从随机样本到全量数据
数据分析 常见异常及解决办法(一)
1.Jupyter读取数据警告ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators在使用Jupyter Notebook读取数据进行分析时,如下:python<ipythoninput
Python数据分析实战(2)使用Pandas进行数据分析
一、Pandas的使用 1.Pandas介绍Pandas的主要应用包括: 数据读取 数据集成 透视表 数据聚合与分组运算 分段统计 数据可视化Pandas的使用很灵活,最重要的两个数据类型是DataFrame和Series。对DataFrame最直观的理解是把它当成一个Excel表格文件,如下:索引是从0开始的,也
商业数据分析从入门到入职(9)Python网络数据获取
@toc 前言本文主要讲Python最常见的应用之一——网络数据获取,即爬虫:先介绍了网页和网络的基础知识,为从网页中获取数据打好基础;接下来以两个案例介绍从网络中获取数据和处理数据的不同方式,以进一步认识Python爬虫和数据处理。 一、网络和网页基础知识 1.数据来源数据源有很多,可以从数据库中获取,可以从文件中获取,也可以从
python刷题-最大最小公倍数
问题描述已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。 输入格式输入一个正整数N。 输出格式输出一个整数,表示你找到的最小公倍数。 样例输入9 样例输出504 数据规模与约定1 < N < 106。 N int(input())Min 1if N<2: print(N)elif N%2
天猫双11数据过于完美?我们用python来看看
↑关注+置顶 有趣的不像个技术号 是否真的完美? 双11结束了,大家已经无手可剁 。 天猫官方公布了今年的双11成交额为2684亿元,成功刷新了自己创下的商业纪录。按理说大家已经习惯了逐年增长,没想到 由于过于完美,引发网友提出质疑。 滑动图片浏览 or 点击查看大图▼ 该微博在天猫公布2019年销售额后,引发大量讨论,成功登上热搜。 一
一篇长文带你在python里玩转Json数据
↑一个宝藏公众号,长的好看的人都关注了 Json简介 Json(JavaScript Object Notation) 很多网站都会用到Json格式来进行数据的传输和交换,就像上篇我提到的,它们返回的数据都是Json格式的。这因为Json是一种轻量级的数据交换格式,具有数据格式简单,读写方便易懂等很多优点。用它来进行前后端的数据传输,大
什么,3行Python代码就能获取海量数据?
本文转载自公众号【法纳斯特】,详情可以点击上方卡片,关注该公众号,获取更多好文推荐。 一谈起数据分析,首先想到的就是数据,没有数据,谈何分析。 毕竟好的菜肴,没有好的原材料,是很难做的~ 所以本期小F就给大家分享一个获取数据的方法,只需三行代码就能搞定。 「GoPUP」,大佬造的轮子,大概有100+的免费数据接口。 GitHub:htt
盘点一款Python二级考试模拟软件,带你轻松过关二级Python考试
大家好,我是Python进阶者。今天给大家讲的这个软件,主要是想让大家通过这个软件能将自己的Python基础进一步提高。一、前言相信有些小伙伴学习Python有一段时日,但是又不知道自己的Python基础学的如何,这个时候就需要一款神器来检测一下自己的Python基础了。要想检测自己的Python功力最直观的方法当然是做题了,至于做什么题了我们就不得而知了,
Python分析5000+抖音大V,发现大家都喜欢这类视频!
最近,小F在知乎上看到一个关于抖音的问题。 里面提到了,目前我国人均每天刷短视频110分钟。 看这数据,看来小F又被平均了。 不过老实说,只要一打开抖音,小F确实是有一种停不下来的感觉~ 所以还是少刷抖音,多看书。要不然时间全流逝了。 本期就给大家用数据分析一下在抖音,什么类型的视频最受欢迎。 / 01 / 数据获取 数据来自于第三方监
干货|利用Python自动根据数据生成降雨量统计分析报告
作者:小小明 简介:Pandas数据处理专家,10余年编码经验,至今已帮助过成千上万名数据从业者解决工作实际遇到的问题,其中数据处理和办公自动化问题涉及的行业包括会计、HR、气象、金融等等,现为菜J学Python核心技术团队成员之一。 点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤今夜偏