我有一个具有二进制类属性的数据集。有 623 个实例为 +1 类(癌症阳性)和 101,671 个实例为 -1 类(癌症阴性)。
我尝试了各种算法(朴素贝叶斯、随机森林、AODE、C4.5),它们都有不可接受的假阴性率。随机森林具有最高的总体预测准确率(99.5%)和最低的假阴性率,但仍然漏掉了 79% 的阳性类别(即未能检测到 79% 的恶性肿瘤)。
有什么想法可以改善这种情况吗?
谢谢!
我有一个具有二进制类属性的数据集。有 623 个实例为 +1 类(癌症阳性)和 101,671 个实例为 -1 类(癌症阴性)。
我尝试了各种算法(朴素贝叶斯、随机森林、AODE、C4.5),它们都有不可接受的假阴性率。随机森林具有最高的总体预测准确率(99.5%)和最低的假阴性率,但仍然漏掉了 79% 的阳性类别(即未能检测到 79% 的恶性肿瘤)。
有什么想法可以改善这种情况吗?
谢谢!
即使现实中的答案总是true
or false
,您也可以让您的类属性不是标签而是浮点数,即 1.0 和 0.0(或 100 和 0)。也就是说,您可以将其框定为回归问题,而不是分类问题。
那么预测的输出也将是该频谱上的数字,即概率而不是标签。您当前的实现基本上等同于阈值为 0.5 的回归模型。
通过这样的输出,您或您的客户可以定义一个可接受的阈值(例如 0.3)。当然,那时会有更多的假阳性,但对于某些应用,比如检测癌症,这是最佳的。
过采样(阳性)或欠采样(阴性)也是解决此问题的方法,但必须深思熟虑,会牺牲准确性,并且在创建数据和训练后仍然会牺牲控制来移动阈值。
已经提到过采样和过采样作为一种技术,但我想我会指出一个常用的变体:
它于 2002 年在本文中提出。这是摘要中的一个片段:
本文表明,我们对少数(异常)类进行过采样和对多数(正常)类进行欠采样的方法相结合,可以比仅对多数类进行欠采样获得更好的分类器性能(在 ROC 空间中)。
你可以很容易地在 Python 中使用它,使用package imbalanced-learn
,它包含在 Scikit-Learn 的contrib模块中,必须单独安装。
不平衡学习是一个 python 包,提供了许多数据集中常用的重采样技术,显示出严重的类间不平衡。
该软件包包括组合过采样/欠采样的方法以及一组实用程序来生成可以流入 Keras/Tensorflow 的批量数据。