心电图心跳分类

赛题:

赛题以医疗数据挖掘为背景,要求选手使用提供的心跳信号传感器数据训练模型并完成不同心跳信号的分类的任务。

数据实例:
在这里插入图片描述
Lightgbm模型介绍:

基本单位是决策树,通过多个决策树进行最终结果判断。lgb采用的是生长方法是leaf-wise learning,减少了计算量,当然这样的算下下也需要控制树的深度和每个叶节点的最小的数据量,从而减少over fit。分裂点,xgb采取的是预排序的方法,而lgb采取的是histogram算法,即将特征值分为很多小桶,直接在这些桶上寻找分类,这样带来了存储代价和计算代价等方面的缩小,从而得到更好的性能。另外,数据结构的变化也使得细节处理方面效率有所不同,比如对缓存的利用,lgb更加高效。从而使得它右很好的加速性能,特别是类别特征处理,也使得lgb在特定的数据集上有非常大的提升。
————————————————
版权声明:本文为CSDN博主「Sisyphus_369」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40677836/article/details/111472972

步骤流程

  • 数据预处理
    • 特征提取出来作为每一列数据
    • 数据内存优化(目的为了减少内存,加快后期模型运行速度)
  • 模型建立
    • 建立lightgbm模型
  • 模型交叉校验
    • 交叉验证进行模型形能评估
  • 预测

此部分数据读取并进行预处理

import pandas as pd
import os
import matplotlib.pyplot as plt
from tqdm import tqdm

os.chdir(r'G:\天池\心电图挖掘')

df_train = pd.read_csv(r'train.csv', encoding='utf-8')
df_test = pd.read_csv(r'testA.csv', encoding='utf-8')

df_train.set_index('id', inplace=True)
df_test.set_index('id', inplace=True)
def reduce_mem_usage(df):
    start_mem = df.memory_usage().sum() / 1024**2 
    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
    
    for col in df.columns:
        col_type = df[col].dtype
        
        if col_type != object:
            c_min = df[col].min()
            c_max = df[col].max()
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)  
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
        else:
            df[col] = df[col].astype('category')

    end_mem = df.memory_usage().sum() / 1024**2 
    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))
    
    return df

all_columns_name = ['id']
all_columns_name = all_columns_name + ['id_%s'%i for i in range(len(df_train.iloc[0,0].split(',')))] + ['label']
all_columns_name_ = all_columns_name + ['id_%s'%i for i in range(len(df_train.iloc[0,0].split(',')))]
df_train_new = pd.DataFrame(columns=(all_columns_name))
df_test_new = pd.DataFrame(columns=(['id'] + ['id_%s'%i for i in range(len(df_train.iloc[0,0].split(',')))]))
    
for i in tqdm(range(205)):
    df_train_new['id_%s'%i] = df_train['heartbeat_signals'].apply(lambda x:float(x.split(',')[i]))
    df_test_new['id_%s'%i] = df_test['heartbeat_signals'].apply(lambda x:float(x.split(',')[i]))
    
df_train_new['id'] = df_train.index.tolist()
df_test_new['id'] = df_test.index.tolist()
df_train_new['label'] = df_train['label']

上面部份运行目的是数据处理以下效果,并将数据进行内存优化,方便后续处理
在这里插入图片描述

接下来进行模型建立

from sklearn.model_selection import train_test_split
import lightgbm as lgb
from sklearn.metrics import f1_score


X_train = df_train_new.drop(['id','label'], axis=1)
y_train = df_train_new['label']

X_train_split, X_val, y_train_split, y_val = train_test_split(X_train, y_train, test_size=0.2)
train_matrix = lgb.Dataset(X_train_split, label=y_train_split)
valid_matrix = lgb.Dataset(X_val, label=y_val)

params = { 
    "num_leaves": 128,
    "metric": None,
    "objective": "multiclass",
    "num_class": 4,
    "nthread": 10,
    "verbose": -1,
}

# F1-score
def f1_score_vali(preds, data_vali):
    labels = data_vali.get_label()
    preds = np.argmax(preds.reshape(4, -1), axis=0)
    score_vali = f1_score(y_true=labels, y_pred=preds, average='macro')
    return 'f1_score', score_vali, True


"""使用训练集数据进行模型训练"""
model = lgb.train(params, 
                  train_set=train_matrix, 
                  valid_sets=valid_matrix, 
                  num_boost_round=2000, 
                  verbose_eval=50, 
                  early_stopping_rounds=200,
                  feval=f1_score_vali)

交叉验证评估模型性能

from sklearn.model_selection import KFold

x_train = df_train_new.drop(['id', 'label'], axis=1)
y_train = df_train_new['label']

#5折交叉验证
folds = 5
seed = 2021
# shuffle 进行数据打乱
kf = KFold(n_splits=folds, shuffle=True, random_state=seed)

cv_scores= []
for i, (train_index, valid_index) in enumerate(kf.split(x_train, y_train)):
    print('************************************ {} ************************************'.format(str(i+1)))
    x_train_split, y_train_split, x_val, y_val = x_train.iloc[train_index],y_train.iloc[train_index], x_train.iloc[valid_index], y_train.iloc[valid_index]
    train_matrix = lgb.Dataset(x_train_split, label=y_train_split)
    valid_matrix = lgb.Dataset(x_val, label=y_val)
    
    params = { 
    "num_leaves": 128,
    "metric": None,
    "objective": "multiclass",
    "num_class": 4,
    "nthread": 10,
    "verbose": -1,
    }
    
    model = lgb.train(params,
                     train_set=train_matrix,
                     valid_sets=valid_matrix,
                     num_boost_round=2000,
                     verbose_eval=100,
                     early_stopping_rounds=200,
                     feval=f1_score_vali)
    
    
    val_pred = model.predict(x_val, num_iteration=model.best_iteration)
    val_pred = np.argmax(val_pred, axis=1)
    cv_scores.append(f1_score(y_true=y_val, y_pred=val_pred, average='macro'))
    
print('lgb_scotrainre_list:{}'.format(cv_scores))
print('lgb_score_mean:{}'.format(np.mean(cv_scores)))
print("lgb_score_std:{}".format(np.std(cv_scores)))

经过5折交叉验证,得出f1—score为0.96,效果还可以,那么就进行预测
在这里插入图片描述

预测

X_test = df_test_new.drop(['id'], axis=1)
test_pred_lgb = model.predict(X_test, num_iteration=model.best_iteration)
df_1 = pd.DataFrame(test_pred_lgb)
df_1.index=df_test_new['id']
df_1.rename(columns={0: 'label_0', 1:'label_1', 2:'label_2', 3:'label_3'}, inplace=True)
df_1.to_csv('final_result.csv')

最终将数据提交到天池:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MATLAB 处理心电图数据的原理是基于数字信号处理和算法设计。心电图是记录心脏电活动的信号,MATLAB 可以读取心电图数据文件并对其进行预处理、滤波、特征提取和分类等操作。 具体来说,MATLAB 可以使用数字滤波器对心电图数据进行滤波,以去除高频噪声和基线漂移等干扰。然后,可以使用多种算法进行特征提取,例如基于小波变换的 QRS 检测算法、心率变异性分析算法等。 最后,根据提取的特征进行分类,例如根据心跳间期的长度判断心律失常类型,或者使用机器学习算法进行自动分类诊断。总的来说,MATLAB 处理心电图数据的原理是将数字信号处理和算法设计相结合,以实现对心电信号的分析和诊断。 ### 回答2: MATLAB是一种强大的科学计算软件,可以用于处理和分析心电图(ECG)数据。处理心电图数据的原理主要包括数据读取、预处理、特征提取和数据分析等步骤。 首先,MATLAB可以通过调用相应的数据读取函数(如`readtable`或`importdata`)来读取心电图数据文件,或者使用串口进行实时数据采集。读取后的数据将以矩阵或者表格的形式保存在MATLAB的工作空间中。 然后,进行数据预处理步骤,包括滤波、去基线、降噪等。滤波常用于去除心电图中的高频噪声或者低频漂移。MATLAB提供了多种滤波函数(如`designfilt`、`filter`等),可以根据需要选择适当的滤波器类型和参数。去基线操作可消除心电图的直流偏移,其中`detrend`函数可以用于去除线性或非线性趋势。降噪方法如小波变换、Kalman滤波等也可应用于心电图数据预处理。 接下来,通过特征提取方法将心电图信号转化为有意义的特征。常用的特征包括QRS波群、ST段、P波等。MATLAB提供了丰富的信号处理工具箱,如波形峰值检测、心跳周期计算等,可以用于提取这些特征。 最后,进行数据分析。使用MATLAB的统计分析工具箱,可以进行心电图数据的统计描述、频谱分析、时域参数计算以及心电图图像绘制等。统计描述可计算平均值、标准差、峰值等基本参数。频谱分析可通过快速傅里叶变换(FFT)来研究心电图信号的频率特征。时域参数计算可根据QRS维度进行心率、R-R间期等参数的计算。绘制心电图图像可使用MATLAB的绘图函数(如`plot`、`subplot`),将各个心电图特征可视化展示。 综上所述,MATLAB通过数据读取、预处理、特征提取和数据分析等步骤对心电图数据进行处理。它提供了丰富的信号处理和统计工具箱,以及强大的绘图功能,使得心电图数据的分析和研究变得更加简便和高效。 ### 回答3: Matlab处理心电图数据的原理主要涉及信号处理和数据分析的技术。 首先,Matlab可以通过导入心电图数据文件(如PDF、CSV等格式)或直接接收实时心电图信号。然后,使用Matlab的信号处理工具箱,可以对心电图信号进行预处理。预处理步骤包括滤波、去噪和基线漂移校正等。滤波可以选择合适的滤波器(如低通、高通或带通滤波器)来去除干扰信号和噪声,并突出心电信号的特征。 接下来,Matlab可以通过心电图中的波形特征,如R波(心脏收缩的峰值)来进行心率分析。通过计算R-R间期(相邻两个R波之间的时间间隔),可以得到心率的时间序列。此外,Matlab还可以进行心率变异性(HRV)分析,通过计算R-R间期的差异和特征统计参数,来评估心脏自主神经系统的功能状况。 另外,Matlab还可以进行心电图的特征提取和分类。特征提取可以从心电信号中提取出时间域、频谱域和时频域等特征,如心电图的QRS波形形状、频谱分布和心电波形的能量等。这些特征可以用于心律失常、心脏疾病和心绞痛等心血管病的自动诊断。分类算法可以根据所提取的特征,通过机器学习技术,将心电图数据分为正常和异常的类别,并进行疾病风险评估。 总之,Matlab处理心电图数据的原理包括预处理、特征提取、心率和HRV分析以及心电图分类。它提供丰富的信号处理和数据分析工具,使得研究人员和医生可以更准确和全面地分析和诊断心脏相关的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值