在这种情况下如何解释 AUC 分数?

数据挖掘 机器学习 Python 随机森林 混淆矩阵
2022-03-12 17:52:47

我只是在不平衡数据集上运行随机森林模型。我得到了一组 AUC 和混淆矩阵。AUC 似乎还不错,但实际上该模型将每个实例都预测为正数。那么它是如何发生的以及如何正确使用 AUC 呢?

在此处输入图像描述

ROC曲线如下:

在此处输入图像描述

我绘制了测试集中正类的预测概率。概率在一个狭窄的范围内(0-0.4)。

在此处输入图像描述

2个回答

如果您想弄清楚这个 ROC 是如何发生的,您最好列出包含“预测”值和“真实”值的元组,并使用“预测”值排序,然后绘制ROC。

在您的情况下,元组应该是这样的:

  predicted truth (x,y)
    0.53 0  (6/6,14/14)
    0.55 0  (5/6,14/14)
    0.57 1  (4/6,14/14)
    0.59 0  (4/6,13/14)
    0.60 1  (3/6,13/14)
    0.62 1  (3/6,12/14)
    0.63 0  (3/6,11/14)
    0.64 0  (2/6,11/14)
    0.66 1  (1/6,11/14)
    0.68 1  (1/6,10/14)
    0.71 1  (1/6,9/14)
    0.73 1  (1/6,8/14)
    0.77 1  (1/6,7/14)
    0.78 0  (1/6,6/14)
    0.82 1  (0/6,6/14)
    0.86 1  (0/6,5/14)
    0.89 1  (0/6,4/14)
    0.92 1  (0/6,3/14)
    0.94 1  (0/6,2/14)
    0.96 1  (0/6,1/14)
            (0/6,0/14)

将这些点 (x,y) 放在 ROC 图片上,应该是这样的: 在此处输入图像描述

就像你的一样!

顺便说一句,如果你想知道这些点是如何计算出来的,你可以查看下面用 scala 编写的代码:

    def computeAuc(predict: BDV[Double],groundTruth: BDV[Double]): Double
    = {
    
        // retrieve number of positive and negative samples in ground truth
        val nPos = groundTruth.toArray.filter(_>0).length
        val nNeg = groundTruth.toArray.filter(_<=0).length
    
        // tuple predict with ground truth , and sort with predict
        val pair = predict.toArray.zip(groundTruth.toArray)
        val sortedPair = pair.sortBy(_._1)
        var auc = 0.0.toDouble
        val x = BDV.zeros[Double](predict.length + 1)
        val y = BDV.zeros[Double](predict.length + 1)
        x(0) = 1.0
        y(0) = 1.0
    
        // calculate auc incrementally
        var i = 1.toInt
        while(i < sortedPair.length) {
          y(i) = (1.0 * sortedPair.slice(i,pair.length).filter(_._2 > 0).length) / nPos
          x(i) = (1.0 * sortedPair.slice(i,pair.length).filter(_._2 <= 0).length) / nNeg
          auc = auc + (((y(i) + y(i - 1))*(x(i - 1) - x(i)))/2.0)
          i += 1
        }
        auc = auc + ((y(i - 1) * x(i - 1))/2.0)
    
        auc
   }

最后,你的不平衡问题很严重,你最好在训练前进行下采样或上采样。

希望这对您有所帮助,祝您好运-)

AUC 基于您的预测的排名顺序,而不是分配给它的实际类别。输出的规模很可能行为不端。

看看你的预测值,我怀疑你的模型的预测在一个狭窄的范围内。如果是这种情况, argmax 将为您的所有观察结果产生相同的类(这就是正在发生的事情)。

您可能希望修改一些超参数,以查看究竟是哪一个导致了这种情况(可能从学习率开始)。如果逻辑回归给您带来相同的问题,这可能值得测试,这将有助于确定您的输入/特征是否存在问题。