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

黎明之道 等级 976 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个特征。

收藏
评论区

相关推荐

零基础应该如何开始学习python
随着人工智能时代的到来,Python也在不断发展壮大,越来越多的人选择学Python,只要因为它容易学习,功能又强大还可以跨平台。其实Python作为一门脚本语言,难度上相较于其他语言略微简单点,但是对于没有计算机基础的人来说,也是非常难得,可能安装这一步就会难倒大家!1、Python学习确定方向对于刚入门的人来说,要先把Python基础和进阶学透,再继续往
全网最全python学习路线图,让学习不迷路
学习Python有一段时间了,最近也是在不断的整理Python相关的基础知识和学习一些新的知识,想来分享给大家。我刚开始接触Python时,和大多数初学者一样不知道从那里开始学习python,我也在网上找了许多python相关的资料来学习,但是资料多也不见得就好,因为不知道从哪里开始下手,走了许多弯路。后面我就整理了一套对初学者来说学习python能很快上手
玩转python爬虫
     近几年来,python的热度一直特别火!大学期间,也进行了一番深入学习,毕业后也曾试图把python作为自己的职业方向,虽然没有如愿成为一名python工程师,但掌握了python,也让我现如今的工作开展和职业发展更加得心应手。这篇文章主要与大家分享一下自己在python爬虫方面的收获与见解。   
浅析常用的Python Web的几大框架
在各种语言平台中,python涌现的web框架恐怕是最多的,是一个百花齐放的世界,各种microframework、framework不可胜数;猜想原因应该是在python中构造框架十分简单,使得轮子不断被发明。所 以在Python社区总有关于Python框架孰优孰劣的话题。下面就给大家介绍一下python的几大框架: Django Django 应该是最出
盘点一款Python二级考试模拟软件,带你轻松过关二级Python考试
大家好,我是Python进阶者。今天给大家讲的这个软件,主要是想让大家通过这个软件能将自己的Python基础进一步提高。一、前言相信有些小伙伴学习Python有一段时日,但是又不知道自己的Python基础学的如何,这个时候就需要一款神器来检测一下自己的Python基础了。要想检测自己的Python功力最直观的方法当然是做题了,至于做什么题了我们就不得而知了,
(二十九) 初遇python OOP面向对象编程
**各位读者大大们大家好,今天学习python的面向对象编程-属性装饰器,并记录学习过程欢迎大家一起交流分享。** ![](https://oscimg.oschina.net/oscnet/2bffb0067c4967eca2188c825154f2e4a5d.jpg) **新建一个python文件命名为py3\_oop6.py,在这个文件中进行操作代
055 Python第三方库安装
\[TOC\] 一、概述 ==== * 看见更大的Python世界 * 第三方库的pip安装方法 * 第三方库的集成安装方法 * 第三方库的文件安装方法 二、看见更大的Python世界 =============== 2.1 Python社区 ------------ \>13万个第三方库:<a target='\_blank' h
055 Python第三方库安装
\[TOC\] 一、概述 ==== * 看见更大的Python世界 * 第三方库的pip安装方法 * 第三方库的集成安装方法 * 第三方库的文件安装方法 二、看见更大的Python世界 =============== 2.1 Python社区 ------------ \>13万个第三方库:<a target='\_blank' h
Python 3 教程
Python 3 教程 =========== ![python3](https://www.runoob.com/wp-content/uploads/2014/05/python3.png) Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,
Python向来以慢著称,为啥Instagram却唯独钟爱它?
PyCon 是全世界最大的以 Python 编程语言 为主题的技术大会,大会由 Python 社区组织,每年举办一次。在 Python 2017 上,Instagram 的工程师们带来了一个有关 Python 在 Instagram 的主题演讲,同时还分享了 Instagram 如何将整个项目运行环境升级到 Python 3 的故事。本文为该次演讲的内容摘要
Python很慢?Python之父一句话亮了
### Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲ 译者丨诗书塞外 原文丨http://dwz.date/duAA Python的运行速度确实没有C或者Java快,但是有一些项目正在努力让Python变得更快。
Python环境搭建—安利Python小白的Python和Pycharm安装详细教程
人生苦短,我用Python。众所周知,Python目前越来越火,学习Python的小伙伴也越来越多。最近看到群里的小伙伴经常碰到不会安装Python或者不知道去哪下载Python安装包等系列问题,为了方便大家学习Python,小编整理了一套Python和Pycharm安装详细教程,只要大家按照这个步骤来,就可以轻松的搞定Python和Pycharm的安装了。
Python真是什么都能干!今天实现一下自动打开和运行电脑软件!
最近做项目,要用到软件自动化的操作,正好更大家分享一下! ![](https://img2018.cnblogs.com/blog/1627425/201909/1627425-20190911205328415-1196306902.png) 先看看Python操作: ============ ![都说了Python很牛逼!教大家用Pytho
Python解释器和IPython
简介 == 今天给大家介绍一下Python的一个功能非常强大的解释器IPython。虽然Python本身自带解释器,但是相对而言IPython的功能更加的强大。 Python解释器 ========= Python是自带解释器的,我们在命令行输入python即可进入python的解释器环境: $> pythonPython 2.7.15 (d
Python运算符大全
  一、 Python的算术运算   Python的算术运算符与C语言类似,略有不同。包括加(+)、减(-)、乘(\*)、除(/)、取余(%)、按位或(|)、按位与(&)、按位求补(~)、左移位(<<)、右移位(>>)、单目求反(-)、幂运算(\*\*)、整除运算(//)、增强运算、增强矩阵乘法(@)。   增强运算是将算术运算符或逻辑运算符放到等号的左