今天老肥和大家分享的是AIWIN的秋季赛-心电图智能诊断竞赛的任务一Baseline方案,线上与线下验证得分均为0.719
,采用的是单模树模型。
心电图是临床最基础的一个检查项目,因为安全、便捷成为心脏病诊断的利器。每天都有大量的心电图诊断需求,但是全国范围内诊断心电图的专业医生数量不足,导致很多医院都面临专业心电图医生短缺的情况。
人工智能技术的出现,为改善医生人力资源不足的问题带来了全新的可能。由于心电图数据与诊断的标准化程度较高,相对较易于运用人工智能技术进行智能诊断算法的开发。
本赛题任务一为要求针对心电图输出二元
(正常 v.s 异常)分类标签,评价指标为F1
,心电数据的单位为mV,采样率为 500HZ,记录时长为 10 秒,存储格式为 MAT;文件中存储了 12 导联的电压信号(包含了I,II,III,aVR,aVL,aVF,V1,V2,V3,V4,V5 和 V6)。
每个样本心电图的数据的形状为(12,5000)
, 一个非常直观的思路便是将其进行分导联采样再将所有导联展平作为训练的原始数据避免特征维度过大。
def get_data(sep_length):
"""
读取数据,提取部分数据用于训练预测
"""
train_path = glob.glob('data/train/*.mat')
test_path = glob.glob('data/val/*.mat')
matrix = np.zeros((2000, 5000 * 12 // sep_length))
i = 0
for p in tqdm(train_path):
ecgdata = sio.loadmat(p)['ecgdata']
sep = ecgdata[:, ::sep_length]
sep = sep.reshape(-1,)
matrix[i, :] = sep
i += 1
for p in tqdm(test_path):
ecgdata = sio.loadmat(p)['ecgdata']
sep = ecgdata[:, ::sep_length]
sep = sep.reshape(-1,)
matrix[i, :] = sep
i += 1
data = pd.DataFrame(matrix)
data.columns = [f'{i}' for i in range(len(data.columns))]
return data
对于该数据进行特征提取,主要包括不同导联内数据的均值、方差等统计,所有导联数据的均值、方差等统计,因为该数据为时序,考虑对数据做差分再求统计。
def feature_eng(data, f, feat):
"""
统计特征
"""
data[f'{f}_min'] = data[feat].min(1)
data[f'{f}_max'] = data[feat].max(1)
data[f'{f}_mean'] = data[feat].mean(1)
data[f'{f}_std'] = data[feat].std(1)
data[f'{f}_median'] = data[feat].median(1)
data[f'{f}_skew'] = data[feat].skew(1)
return data
特征提取完后我们直接使用竞赛利器LightGBM进行五折交叉验证训练预测并生成提交文件即可。
除了上述内容,我们可以进一步对数据的时序特性进行挖掘,也可以尝试使用深度学习模型对本赛题任务进行建模。最后,按照惯例我已上传了完整Baseline代码