天池热身赛——心跳信号特征工程

Baseline来源于DataWhale开源社区。

库的准备

对于心跳信号的特征工程,主要按照时间序列的处理方式进行处理,期中这里运用到的第三方库为tsfresh。
这个库的安装有点曲折,首先在cmd中用pip的方式安装一直出现报错,报错的语句为ERROR:Cannot uninstall ‘llvmlite’, It is a distutils…
随后参考这篇blog的方法,找到对应文件将其删除后就完美安装了。
但接着在导入过程中再次报错,报错大致内容是关于 cannot import name 'factorial’什么的,然后参考这篇blog的做法,把scipy和statsmodels模块分别卸了再安装后就终于成功导入了。
随后导入所需模块,代码如下

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("D:/data/train.csv")
data_test_A = pd.read_csv("D:/data/testA.csv")
#查看数据维度
print(data_train.shape)
print(data_test_A.shape)

数据预处理

特征选择部分的预处理

在特征抽取后,会进行特征筛选,其中一个筛选的步骤需要用到label,因此在预处理中需要构建出label。
我们先创建一个新的数据框data_train_label应以存放标签。

data_train_label = data_train["label"]

特征抽取部分的预处理

将数据读进来后,首先用str函数将数据转换为字符串,再用函数split,依照逗号作为分隔符,对其进行分割,最后用stack函数将行转为列。

train_heartbeat_df = data_train["heartbeat_signals"].str.split(",", expand=True).stack()

接着用reset_index()函数重置索引,再将level列作为索引的列,然后将索引的列的名称设置为None,紧接着再将其他两列的名称进行更改。

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)

再把heartbeat_signals列的数据类型转为tsfresh所需的float类型。

train_heartbeat_df["heartbeat_signals"] = train_heartbeat_df["heartbeat_signals"].astype(float)

最后,将原始数据的id列与处理过的train_heartbeat_df合并,即完成了数据预处理。

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)

特征抽取

在处理完数据后,即可对时间序列数据的特征进行抽取,本着好好学习的想法,想详细了解下tsfresh的基本原理,但无奈在csdn和bilibili中没有找到更多的资源,只有关于tsfresh的官方文档
实现特征抽取的代码如下:

from tsfresh import extract_features
train_features = extract_features(data_train, column_id='id', column_sort='time')

特征选择

训练后的特征中包含了heartbeat_signals的779种常见的时间序列特征,这其中有的特征可能为NaN值,因此可以使用以下方式去除NaN值。

impute(train_features)

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

train_features_filtered = select_features(train_features, data_train_label)

至此,即可完成对训练集的特征工程。

关于测试集的训练

第一次跑完这些程序后产生了一个疑问,测试集怎么办?测试集再经过特征抽取后的向量维度会跟训练集一样吗?
之后在群里看到了一种方法,是将测试集的标签标记为-1,然后用attend将训练集与测试集合并后再进行特征抽取与筛选即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值