有啥tricks

  • 5

    获得赞
  • 0

    发布的文章
  • 2

    答辩的项目

心率不齐检测赛

Batch大小为32,循环次数为10次,通过在线上环境完成训练,模型最优精度评分为95.50。

最后更新 2021/04/07 14:51 阅读 137

心率不齐病症检测赛

最后更新 2021/04/07 14:51

阅读 137

LSTM CNN

本次比赛从两个部分进行分析:

1. 问题分析

2. 模型选择

一. 问题分析:

1. 比赛简介:    正常人的心脏跳动是由一个称为“窦房结”的高级司令部指挥。窦房结发出信号刺激心脏跳动,这种来自窦房结信号引起的心脏跳动,就称为正常的“窦性心律”,频率每分钟约为60—100次。每分钟心跳的次数,即心率就是由此而来。心律不齐的后果可能完全无害,也可能危及生命。某些威胁生命的心律不齐的症状并不明显,通常需要采用某些诊断方法以确定心律失常的确切性质及发生原因。心电图检查(ECG)是发现心律失常并确定其病因的主要诊断方法。它提供每个心跳时电流的图形表现。从实际应用场景来看,心率不齐检测技术确实可大幅缩短医生的工作量,并高效的展示出检测结果,但在医学研究领域也同样需要高准确率的算法模型实现以达到应用场景落地。本次比赛要求参赛者根据提供的(ECG)数据,建立精准的检测模型。

2 数据分析:

   比赛数据集类别分别为:N: Nonectopic_beat (normal beat), S:Supraventricular_ectopic_beat, V: Ventricular_ectopic_beat, F: Fusion_beat, Q:Unknown_beat,共5类。 测试数据为1000条,训练数据约10万条。

image.png

image.png从上图可以看出, 数据的类别严重不平衡, 不平衡率将近有150(最多的类别数/最少的类别数),  而对于这种情况, 一般处理方法如下: 

1. 对较多的那个类别进行欠采样(under-sampling),舍弃一部分数据,使其与较少类别的数据相当

 2. 对较少的类别进行过采样(over-sampling),重复使用一部分数据,使其与较多类别的数据相当

 本次比赛我选择的是, 先对类别多的欠采样, 然后对采样后的数据进行重采样.(具体见下一节)

二. 模型选择

1.问题定性:

首先, 需要确定此次本赛属于哪种问题, 然后根据问题选择合适的模型.  根据前一小节的分析, 应该属于时序分类问题. 处理时序问题一般可以采用:1. 直接当成分类问题:  SVM, 逻辑回归  2. 采用深度学习中的LSTM+CNN

image.png2. 数据预处理:1.对于’N’类只取10%的数据加入训练2.进行类别平衡采样(具体见代码ClassBalancedDataset)3.对输入数据采取mean-std归一化, , 通过统计数据, mean = 0.17393841452985018   std = 0.1928727074339359

3. 超参数的设置

超参数的选取:batchsize: 512epoch: 50优化器: SGD, 初始学习率0.01训练集划分: 9:1

 学习率调整策略:

def one_cycle(y1=0.0, y2=1.0, steps=100):
      return lambda x: ((1 - math.cos(x * math.pi / steps)) / 2) * (y2 - y1) + y1
lf = one_cycle(1, 0.2, EPOCHS)  # cosine 1->hyp['lrf']
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf)

4. 数据增强

通过前面这些步骤, 改来改去, 也没有达到95, 太难了....最后, 通过百度, 找到个数据增强的方法,  

WS:移动窗口法:设定窗口大小(将切片大小设为原始片段长度的90%),从时间序列中提取窗口大小的切片,并赋予与原始时间序列相同的标签

class WS(object):
    def __init__(self, win_size, total_size, p=0.5):
        """ window slicing
        """
        self.ws = win_size
        self.total_size = total_size
        self.p = p

    def __call__(self, input):
        if random.random() < self.p:
            start = random.randint(0, self.total_size - self.ws)
            output = [0] * self.total_size
            output[start:] = input[start:]
            return output
        return input

最后`, 终于达到了95.5,  OK, 完成任务.

5. 其它尝试

其它一些尝试, 但不work1. 加入SE注意力模块2. 加入SPP模块3. k折交叉验证

总结: 多尝试, 多谷歌

本文为作者在FlyAI平台发布的原创内容,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://flyai.com/n/164821
立即参加 心率不齐病症检测赛
代码展示

LSTM CNN

选择查看文件
$vue{codeKeys}
  • $vue{ix}
赞赏贡献者还可以查看和下载优质代码内容哦!
赞赏 ¥17.50元
©以上内容仅用于在FlyAI平台交流学习,禁止转载、商用;违者将依法追究法律责任。
讨论
500字
表情
每日优质讨论奖励 20FAI
发送
每日优质讨论奖励 20FAI
删除确认
是否删除该条评论?
取消 删除
感谢您的关注
该篇内容公开后我们将会给你推送公开通知
好的
发布成功!
您的公开申请已发送至后台审核,
通过后将公开展示本详情页!
知道了
向贡献者赞赏
¥17.50
微信支付
支付宝

请先绑定您的微信账号 点击立即绑定

立即支付
温馨提示:
支付成功后不支持申请退款,请理性消费;
支付成功将自动解锁当前页面代码内容,付款前请确认账号信息。
微信扫码支付
请前往Web网页进行支付

敬请谅解,如有疑问请联系FlyAI客服

知道了
举报
请选择举报理由
确定
提示
确定要删除?
取消删除

今日签到成功

获得 $vue{sianData.sign_fai} FAI的GPU算力积分

知道了