首页 > 其他分享 >2021数据挖掘赛题方案来了!

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

时间:2022-10-20 12:33:45浏览次数:84  
标签:mat pred self 赛题 paddle test 2021 Test 数据挖掘


 Datawhale干货 

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

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

代码地址

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

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

赛题背景及任务

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


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

改进思路

  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数据挖掘赛题方案来了!_机器学习_03


标签:mat,pred,self,赛题,paddle,test,2021,Test,数据挖掘
From: https://blog.51cto.com/u_15699042/5779826

相关文章

  • 2021科大讯飞-车辆贷款违约预测赛事 Top1方案!
    作者:望尼玛,浙江大学,Datawhale优秀选手1.引言Hello,大家好。我是“摸鱼打比赛”队的wangli,首先介绍下自己吧,一枚半路出家的野生算法工程师。之所以起名字叫摸鱼打比赛,是因为......
  • 数据挖掘竞赛指南:曾经的数据挖掘少年,如今的阿里算法大佬
     Datawhale 作者:杰少,南京大学硕士简介:杰少,南京大学硕士,天池数据科学家,就职于阿里。KDD19,NIPS18,JDD19第二名,天池竞赛5次Top3,其他数据竞赛平台奖项20余项。数据竞赛近几......
  • 2021长安杯复盘学习
    目录检材一检材二检材三检材四检材五解压密码:2021第三届CAB-changancup.com给的文件都是VC加密过的,所以要先拿密码挂载一下建议挂载完把里面的镜像移到自己硬盘里0.0......
  • [GKCTF2021]random
    [GKCTF2021]random本题出现了MT19937伪随机数生成算法。目录[GKCTF2021]random题目分析MT19937算法步骤代码实现解法1解法2总结题目task.pyimportrandomfromhashli......
  • [GKCTF2021]RRRRSA
    [GKCTF2021]RRRRSA题目fromCrypto.Util.numberimport*fromgmpy2importgcdflag=b'xxxxxxxxxxxxx'p=getPrime(512)q=getPrime(512)m=bytes_to_long(fl......
  • 2021年非常全的.NET Core面试题
    1.如何在ASP.NETCore中激活Session功能?          首先要添加session包.其次要在configservice方法里面添加session。然后又在configure方法里面调用usese......
  • Divide by Zero 2021 and Codeforces Round #714 C
    C.AddOne显然对于每一位单独分析我们经过一次进位只能变成10这样该怎么做呢我们显然可以dp设dp[i][j]表示i(0-9)经过j次变换有几位显然我们初始化i+j<10就是1elsed......
  • 2021ICPC沈阳站 J Luggage Lock 思路以及C++实现
    题目JLuggageLock思路我们可以将密码锁的每一个状态看成一个节点,每一个操作看成从一个节点到另一个节点的权重为1(意思是经过一次操作)的有向边,这个问题就可以看成一个......
  • CVPR2021 最新出炉的最佳paper,陆续更新中...(附论文地址)
    计算机视觉研究院专栏作者:Edison_G今年的CVPR也陆续被大家熟知,录取的paper也公布出来,大家有兴趣的可以深入了解自己感兴趣的领域。作为计算机视觉领域三大顶会之一,CVPR2021......
  • ICCV2021何恺明团队又一神作:Transformer仍有继续改善的空间
    计算机视觉研究院专栏作者:Edison_G一个简单、渐进、但必须知道的基线:用于VisionTransformer的自监督学习。尽管标准卷积网络的训练方法已经非常成熟且鲁棒,然而ViT的训练方......