2021数据挖掘赛题方案来了!

Datawhale Datawhale     2023-02-01     568

关键词:

 Datawhale干货 

作者:阿水,北京航空航天大学,Datawhale成员

本文以世界人工智能创新大赛(AIWIN)心电图智能诊断竞赛为实践背景,给出了数据挖掘实践的常见思路和流程。本项目使用TextCNN模型进行实践,全文代码及思路如下。后台回复 211114 可获取完整代码。

代码地址

https://aistudio.baidu.com/aistudio/projectdetail/2653802

赛题背景及任务

心电图是临床最基础的一个检查项目,因为安全、便捷成为心脏病诊断的利器。由于心电图数据与诊断的标准化程度较高,相对较易于运用人工智能技术进行智能诊断算法的开发。本实践针对心电图数据输出二元(正常 v.s 异常)分类标签。

比赛地址:http://ailab.aiwin.org.cn/competitions/64

赛题数据

数据将会分为可见标签的训练集,及不可见标签的测试集两大部分。其中训练数据提供 1600 条 MAT 格式心电数据及其对应诊断分类标签(“正常”或“异常”,csv 格式);测试数据提供 400 条 MAT格式心电数据。

  • 数据目录

DATA |- trainreference.csv TRAIN目录下数据的LABEL
        |- TRAIN            训练用的数据
        |- VAL              测试数据
  • 数据格式

    • 12导联的数据,保存matlab格式文件中。数据格式是(12, 5000)。

    • 采样500HZ,10S长度有效数据。具体读取方式参考下面代码。

    • 0..12是I, II, III, aVR, aVL, aVF, V1, V2, V3, V4, V5和V6数据。单位是mV。

import scipy.io as sio
    ecgdata = sio.loadmat("TEST0001.MAT")['ecgdata']
  • trainreference.csv格式:每行一个文件。格式:文件名,LABEL (0正常心电图,1异常心电图)

实践思路

TextCNN 模型是由 Harvard NLP 组的 Yoon Kim 在2014年发表的 《Convolutional Neural Networks for Sentence Classification 》一文中提出的模型,由于 CNN 在计算机视觉中,常被用于提取图像的局部特征图,且起到了很好的效果,所以该作者将其引入到 NLP 中,应用于文本分类任务,试图使用 CNN 捕捉文本中单词之间的关系。

本实践使用TextCNN模型对心电数据进行分类。

改进思路

  1. 使用多折交叉验证,训练多个模型,对测试集预测多次。

  2. 在读取数据时,加入噪音,或者加入mixup数据扩增。

  3. 使用更加强大的模型,textcnn这里还是过于简单。

实践代码

数据读取

!\\rm -rf val train trainreference.csv 数据说明.txt !
unzip 2021A_T2_Task1_数据集含训练集和测试集.zip > out.log

import codecs, glob, os
import numpy as np
import pandas as pd

import paddle
import paddle.nn as nn
from paddle.io import DataLoader, Dataset
import paddle.optimizer as optim
from paddlenlp.data import Pad

import scipy.io as sio
train_mat = glob.glob('./train/*.mat')
train_mat.sort()
train_mat = [sio.loadmat(x)['ecgdata'].reshape(1, 12, 5000) for x in train_mat]

test_mat = glob.glob('./val/*.mat')
test_mat.sort()
test_mat = [sio.loadmat(x)['ecgdata'].reshape(1, 12, 5000) for x in test_mat]

train_df = pd.read_csv('trainreference.csv')
train_df['tag'] = train_df['tag'].astype(np.float32)
class MyDataset(Dataset):
    def __init__(self, mat, label, mat_dim=3000):
        super(MyDataset, self).__init__()
        self.mat = mat
        self.label = label
        self.mat_dim = mat_dim

    def __len__(self):
        return len(self.mat)

    def __getitem__(self, index):
        idx = np.random.randint(0, 5000-self.mat_dim)
        return paddle.to_tensor(self.mat[index][:, :, idx:idx+self.mat_dim]), self.label[index]

模型构建

class TextCNN(paddle.nn.Layer):
    def __init__(self, kernel_num=30, kernel_size=[3, 4, 5], dropout=0.5):
        super(TextCNN, self).__init__()
        self.kernel_num = kernel_num
        self.kernel_size = kernel_size
        self.dropout = dropout

        self.convs = nn.LayerList([nn.Conv2D(1, self.kernel_num, (kernel_size_, 3000)) 
                for kernel_size_ in self.kernel_size])
        self.dropout = nn.Dropout(self.dropout)
        self.linear = nn.Linear(3 * self.kernel_num, 1)

    def forward(self, x):
        convs = [nn.ReLU()(conv(x)).squeeze(3) for conv in self.convs]
        pool_out = [nn.MaxPool1D(block.shape[2])(block).squeeze(2) for block in convs]
        pool_out = paddle.concat(pool_out, 1)
        logits = self.linear(pool_out)

        return logits
model = TextCNN()

BATCH_SIZE = 30
EPOCHS = 200
LEARNING_RATE = 0.0005
device = paddle.device.get_device()
print(device)
gpu:0

模型训练

Train_Loader = DataLoader(MyDataset(train_mat[:-100], paddle.to_tensor(train_df['tag'].values[:-100])), batch_size=BATCH_SIZE, shuffle=True)
Val_Loader = DataLoader(MyDataset(train_mat[-100:], paddle.to_tensor(train_df['tag'].values[-100:])), batch_size=BATCH_SIZE, shuffle=True)
model = TextCNN()

optimizer = optim.Adam(parameters=model.parameters(), learning_rate=LEARNING_RATE)
criterion = nn.BCEWithLogitsLoss()

Test_best_Acc = 0
for epoch in range(0, EPOCHS):
    Train_Loss, Test_Loss = [], []
    Train_Acc, Test_Acc = [], []
    model.train()
    for i, (x, y) in enumerate(Train_Loader):
        if device == 'gpu':
            x = x.cuda()
            y = y.cuda()

        pred = model(x)
        loss = criterion(pred, y)
        Train_Loss.append(loss.item())

        pred = (paddle.nn.functional.sigmoid(pred)>0.5).astype(int)
        Train_Acc.append((pred.numpy() == y.numpy()).mean())
        loss.backward()
        optimizer.step()
        optimizer.clear_grad()
    model.eval()

    for i, (x, y) in enumerate(Val_Loader):
        if device == 'gpu':
            x = x.cuda()
            y = y.cuda()
        
        pred = model(x)
        Test_Loss.append(criterion(pred, y).item())
        pred = (paddle.nn.functional.sigmoid(pred)>0.5).astype(int)
        Test_Acc.append((pred.numpy() == y.numpy()).mean())
    print(
        "Epoch: [/] TrainLoss/TestLoss: :.4f/:.4f TrainAcc/TestAcc: :.4f/:.4f".format( \\
        epoch + 1, EPOCHS, \\
        np.mean(Train_Loss), np.mean(Test_Loss), \\
        np.mean(Train_Acc), np.mean(Test_Acc) \\
        ) \\
    )

    if Test_best_Acc < np.mean(Test_Acc):
        print(f'Acc imporve from Test_best_Acc to np.mean(Test_Acc) Save Model...')
        paddle.save(model.state_dict(), "model.pdparams")
        Test_best_Acc = np.mean(Test_Acc)

结果预测

Test_Loader = DataLoader(MyDataset(test_mat, paddle.to_tensor([0]*len(test_mat))), 
                batch_size=BATCH_SIZE, shuffle=False)

layer_state_dict = paddle.load("model.pdparams")
model.set_state_dict(layer_state_dict)

test_perd = np.zeros(len(test_mat))
for tta in range(10):
    test_pred_list = []
    for i, (x, y) in enumerate(Test_Loader):
        if device == 'gpu':
            x = x.cuda()
            y = y.cuda()
        
        pred = model(x)
        test_pred_list.append(
            paddle.nn.functional.sigmoid(pred).numpy()
        )

    test_perd += np.vstack(test_pred_list)[:, 0]
    print(f'Test TTA tta')
    
test_perd /= 10
test_path = glob.glob('./val/*.mat')
test_path = [os.path.basename(x)[:-4] for x in test_path]
test_path.sort()

test_answer = pd.DataFrame(
    'name': test_path,
    'tag': (test_perd > 0.5).astype(int)
)


整理不易,三连

2021深圳杯-赛题&思路

...对策问题的机器学习能力定量评价选题分析A题B题C题D题赛题及思路发布前言深圳杯出题啦,学长先在这更新赛题题目,思路随后就到,大家别急A题火星探测器着陆控制方案新华社北京5月15日电:2021年5月15日7时18... 查看详情

2021年ccf个贷违约预测第一名方案分享

文章目录1.团队介绍2.赛题分析3.解决方案3.1方案架构3.2数据预处理3.2.1特征处理3.2.2缺失值处理3.2.3异常值处理3.3数据探索与分析3.3.1双表数据探索分析-数据3.3.2双表数据探索分析-特征3.3.3双表数据分析小结3.4特征分析与构建3.4.1... 查看详情

2021年科大讯飞医疗实体及关系识别挑战赛前三名队伍分享

文章目录1.第一名Sayoulala1.1团队介绍1.2方案解析1.2.1赛题分析1.2.2方案选择1.2.3数据统计分析1.2.4方案框架1.3优化思路1.3.1待优化点1.3.2可尝试思路2.第二名五叶草2.1团队介绍2.2方案解析2.2.1赛题解析2.2.2模型设计 查看详情

2021年科大讯飞猪只盘点挑战赛前三名队伍分享

文章目录1.第一名得迈科技1.1团队介绍1.2算法方案解析1.2.1数据噪声1.2.2数据预处理1.2.3数据增强1.2.4模型训练与改进1.2.5模型训练trick1.3改进与创新1.4优化思路2.第二名9vE1Mtxp5k2.1团队介绍2.2赛题目标2.3赛题挑战2.4算法设计 查看详情

2021年科大讯飞新冠肺炎声音诊断挑战赛前三名队伍分享

文章目录1.第一名UoWp2s4l01.1成员介绍1.2赛题简介1.3算法方案解析1.3.1问题分析1.3.2降维可视化1.3.3模型训练1.4优化思路2.第二名NWPU_BFZY2.1团队介绍2.2算法方案解析2.2.1赛题简介2.2.2数据统计2.2.3去静音2.2.4数据增强 查看详情

2021年第三届全国高校计算机能力挑战赛大数据应用赛(代码片段)

...2021年第三届全国高校计算机能力挑战赛】大数据应用赛赛题:大数据应用赛一、赛题背景:二、时间安排:三、奖项设置:四、赛题和数据:五、评价标准:六、作品提交要求:七、解决方案:赛题ÿ... 查看详情

2021华数杯比赛通知&赛题思路

...数不多,拿奖也容易一些.关注公众号,届时更新赛题思路思路集合C题思路已出第一问核心:一维数据异常分析、多维异常分析第二问 查看详情

2021数学建模国赛||高教社杯||赛题||思路

2021数学建模国赛||高教社杯||赛题||思路赛题A题FAST”主动反射面的形状调节B题乙醇偶合制备C4烯烃C题生产企业原材料的订购与运输D题连铸切割的在线优化E题中药材的鉴别赛题A题FAST”主动反射面的形状调节        中国天眼... 查看详情

2021数学建模国赛-高社杯-比赛通知-赛题思路

文章目录1高社杯比赛通知2模型基础3赛题&思路分享2021高社杯数学建模,即数学建模国赛,马上就要来啦,届时L学长会在这和公众号第一时间更新赛题赛题解题思路哦希望今年大家都能取得好成绩1高社杯比赛通知... 查看详情

2021年科大讯飞基于用户画像的商品推荐挑战赛前三名队伍分享

文章目录1.第一名喔嚯1.1团队介绍1.2赛题方案解析1.2.1赛题介绍1.2.2解题思路1.2.3数据探索性分析1.2.4CatBoost分析1.2.5Fasttext分析1.2.6数据分析小结1.2.7数据预处理1.2.8文本特征构造1.2.9算法模型1.2.10模型训练1.2.11模型融合1.3模型结果1.4... 查看详情

2021年安徽省大数据与人工智能应用竞赛人工智能(网络赛)-本科组赛题(代码片段)

第一部分:人工智能基础环境搭建部署(15分)注:任务1与任务2任选一题完成即可。o 任务1:Anaconda3、scikit-learn、OpenCV3.X、PyTorch1.8.X、torchvision0.9.X库的安装与配置。要求(1)需使用比赛平台提供的上... 查看详情

2021国赛数学建模赛题与分析

2021国赛数学建模赛题与分析前言2021国赛数学建模A-E题A题B题C题资源包部分算法代码2010-2018年优秀论文:前言2021年竞赛的时间确定为9月9日(周四)18时至9月12日(周日)20时作为一名参加过多次的数模比赛的... 查看详情

2021年科大讯飞试题标签预测挑战赛前三名队伍分享

...章目录1.第一名iamcalculating1.1团队介绍1.2算法方案解析1.2.1赛题分析1.2.2模型框架1.2.3初赛数据1.2.4联合预测1.2.5训练技巧1.2.6总结1.3优化思路2.第二名CVTEDMer2.1团队介绍2.2算法方案解析2.2.1任务背景2.2.2数据清洗2.2.3数据分析2.2.4模型... 查看详情

工程机械核心部件寿命预测前三名方案总结与2022年最新方案分享(万文详解)

...归预测问题。文章目录1.比赛学习方法论2.工业寿命预测赛题讲解2.1赛题背景2.2赛题任务和数据介绍2.3评测标准2.4初赛与复赛排行榜2.5数据分析2.6数据预处理2.7特征提取3.前三名数据预处理方法比较4.前三名特征工程方法比较4.1特... 查看详情

2021数学建模“华为杯”b题:空气质量预报二次建模2方案设计附实现代码(代码片段)

目录相关链接1赛题的详细分析(必看)2方案的设计2.1问题一2.2问题二2.3问题三2.4问题四相关链接【数学建模国赛】2021B题:空气质量预报二次建模1赛后总结与分析【2021数学建模“华为杯”】B题:空气质量预报二... 查看详情

最新数据挖掘赛事方案梳理!

 Datawhale赛事 作者:牧小熊,华中农业大学,Datawhale成员赛题介绍科大讯飞:糖尿病遗传风险检测挑战赛。背景:截至2022年,中国糖尿病患者近1.3亿。中国糖尿病患病原因受生活方式、老龄化、城市化、... 查看详情

2021oceanbase数据库大赛来了!

 Datawhale赛事 主办方:OceanBase、蚂蚁集团学术团队在数据库领域,有这样一家企业,一直坚持做难而正确的事情。早在2010年,这个由20人组成的团队便开始筑梦之路,通过完全自主研发,实现心中那个真... 查看详情

大学生数学建模赛题解析及优秀论文-2021电工杯a题高铁牵引供电系统运行数据分析及等值建模(附python代码)

赛题背景我国是世界上电气化铁路运营里程最长、服役电力机车型号最多、运营最繁忙的国家。截至2020年底,我国铁路年消耗电量约800亿千瓦时,约占三峡年总发电量的80%。图1为高速铁路牵引供电系统示意图,主要包括牵引变... 查看详情