作者|Rishiraj Acharya
编译|VK
来源|Medium
在医学数据集的训练算法期间面临的许多问题中,这三个最常见:
- 类别不均衡
- 多任务
- 数据集大小
对于这些问题,我将分享一些解决问题的技术。
类别不均衡挑战
在现实世界中,我们看到的健康人比患病的人要多得多,这也反映在医学数据集中。健康和患病类别的例子数量并不平均。这反映了疾病在现实世界中的频率。在医疗数据集和信用卡欺诈数据集中,你可能会看到正常样本的数量是异常样本的一百倍。
结果,很容易被误认为是模型表现出色,而实际上却并非如此。如果使用accuracy_score准确度这样的简单度量,就会发生这种情况。准确度对于这类数据集来说不是一个很好的度量标准,因为标签严重倾斜,所以一个只输出正常标签的神经网络的准确率甚至还能略高于90%。
解决方案:
我们可以定义更有用的指标,例如F1度量或"精确度/召回率"。精度定义为"真正例个数/(真正例个数+假正例个数)"。假正例很多时这是一个很好的度量。另一方面,召回率定义为"真正例个数/(真正例个数+假反例个数)"。当假反例本很多时这是一个很好的度量。医疗领域的大多数模型就是这种情况。但是,我们经常需要同时考虑假正例个数和假反例个数,这就是F1度量的功能。它在精确度(Precision)和召回率(Recall)之间取得均衡,由公式2 * ((Precision*Recall) / (Precision+Recall))给出。
处理类不均衡的另一种流行技术是"重采样"。这是从多数类(样本过多的那一类)中删除示例(称为欠采样)或在少数类中添加示例(称为过采样)以在这两个类之间取得均衡的行为。尽管它们可以通过使用复杂的重采样技术来解决,但它们具有自己的缺点,如信息丢失和过拟合。
多任务挑战
在现实世界中,通常仅预测健康或患病是不够的。我们经常需要将医疗数据分为多个类别或标签。例如,仅从心律中检测出心律失常并没有那么有市场,对患者进行分析判断得到哪种心律失常更有价值。例如病状可能是房颤,室上性心动过速或任何其他类型。
从理论上讲,可以为需要分类的每个标签训练单独的神经网络模型,但是这对于写代码来说非常不切实际。如果我们可以将所有这些分类模型组合到一个返回多个预测的单个深度神经网络中,就比较有价值。
解决方案:
我们使用一种称为"多类别分类"或"多标签分类"的方法来应对这一挑战,它们之间略有不同。在多类别中,数据样本的类别是互斥的,而在多标签中,数据样本可以属于多个类别。在医学领域,我们通常使用多标签分类,因为如果患者被诊断为肺不张(肺的膨胀不全),则并不意味着他/她就不会有心脏肥大。我们将模型最后一层的分数再传递给Sigmoid激活函数。这会把最后一层的每个分数转换为0到1之间的值,而与其他分数无关。
对于多标签分类,我们选择的损失函数变为binary_crossentropy,其中由于我们使用了Sigmoid激活函数,因此每个标签都被视为独立的伯努利分布。在需要多类的情况下,可以用损失函数设置为categorical_crossentropy的softmax激活函数来替换Sigmoid激活函数。
数据集大小挑战
处理医学数据集的主要挑战是这些数据集的大小。大型训练数据除了具有良好的体系结构外,还对模型的性能起着重要的作用,并且可用于疾病的患者数据数量往往不够。低数据集大小是导致高偏差和高方差的主要原因。这导致模型的推广和优化困难。
解决方案:
为了解决模型优化的困难,我们使用一种称为"迁移学习"的方法,其中我们使用从相关网络较低层中学习来训练较高层,而无需它们从头开始学习。由于先前的训练,较低的图层可以用作良好的特征提取器,因此我们可以根据数据集对其进行微调。该技术优化速度更快,并减少了训练新模型所需的数据量。
为了解决模型泛化的困难,我们使用一种称为"数据增强"的技术,将数据提供给模型之前,不是复制相同的示例,而是对示例进行一些随机转换。这样,我们可以使模型对于大小或亮度等微小变化保持不变。诸如水平或垂直翻转图像,更改图像的亮度或对比度,将图像旋转或缩放到一定程度之类的做法都有助于数据扩充。此技术在小型数据集中避免过度拟合非常有用。
原文链接:https://medium.com/aiformedicine/challenges-of-training-models-on-medical-data-7ecc03db2d65
欢迎关注磐创AI博客站:
http://panchuang.net/
sklearn机器学习中文官方文档:
http://sklearn123.com/
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/