Python 使用5倍交叉验证时,在高度不平衡的数据中混淆F1分数和AUC分数

Python 使用5倍交叉验证时,在高度不平衡的数据中混淆F1分数和AUC分数,python,machine-learning,scikit-learn,classification,Python,Machine Learning,Scikit Learn,Classification,我一直在尝试使用5倍交叉验证对高度不平衡的数据进行分类。我的样本量是: 样本总数:12237899 阳性样本:1064份(占总数的0.01%) 我也想避免数据泄漏。然而,我的平均准确度和F-1分数都很低。我已经使用加权逻辑回归来帮助我处理不平衡数据,因为SMOTE在存在极度不平衡数据的情况下不能很好地工作。另外,我在sklearn库中看到了F-1分数的几个选项。例如:f1分数有一个参数,如:average{'micro','macro','samples','weighted','binary'

我一直在尝试使用5倍交叉验证对高度不平衡的数据进行分类。我的样本量是:

样本总数:12237899

阳性样本:1064份(占总数的0.01%)

我也想避免数据泄漏。然而,我的平均准确度和F-1分数都很低。我已经使用加权逻辑回归来帮助我处理不平衡数据,因为SMOTE在存在极度不平衡数据的情况下不能很好地工作。另外,我在sklearn库中看到了F-1分数的几个选项。例如:f1分数有一个参数,如:average{'micro','macro','samples','weighted','binary'}。不知道我应该用哪一个?另外,它与cross_val_分数的scoring='f1'参数(clf,X,y,cv=5,scoring='f1')有何区别


我不知道为什么我看到平衡的准确性和AUC分数是一样的!我欣赏你的想法!谢谢

你实际上在问三个不同的问题:

  • 为什么ROC AUC和平衡精度这么高
  • 为什么平均精度和F1成绩这么低
  • 哪个F1分数适用于不平衡分类
  • 提醒 灵敏度方程:
    灵敏度=TP/(TP+FN)

    假阳性率方程:
    FPR=FP/(FP+TN)

    特异性方程:
    特异性=1-FPR

    如果出现正的阶级失衡,
    FPR
    中的
    TN
    是罪魁祸首

    让我们看一下模拟示例:

    来自sklearn.metrics导入分类报告
    将numpy作为np导入
    y_true=np.串联([np.一(10),np.零(99990)])
    y_pred=np.串联([np.零(9),np.一(1),np.零(99990)])
    打印(分类报告(是真实的,是预测的))
    
    哪个输出:

                  precision    recall  f1-score   support
    
             0.0       1.00      1.00      1.00     99990
             1.0       1.00      0.10      0.18        10
    
        accuracy                           1.00    100000
       macro avg       1.00      0.55      0.59    100000
    weighted avg       1.00      1.00      1.00    100000
    
    二元分类案例中的敏感性是对正类的召回,因此
    0.1

    类似地,特异性是对阴性类别的回忆,因此
    1.0

    FPR为
    1-灵敏度=1-0.1=0.9

    有什么问题吗? 中华民国 ROC AUC计算的是所有可能阈值的FPR加权灵敏度之和。由于FPR是由于高度不平衡的负类而膨胀的,模型不费吹灰之力就获得了较高的ROC AUC分数

    平衡精度 现在,我们明白了,应该很清楚为什么平衡精度也很高。看看方程:
    平衡准确度=平均值(特异性、敏感性)
    。由于特异性被夸大,简单平均值也偏向于大多数类别

    好的,怎么修? 通过在中指定
    adjusted=True
    ,可以将平衡精度调整为不平衡。至于ROC AUC,另一种选择是使用精确回忆AUC,即
    sklearn.metrics.average\u Precision\u score

    f1成绩选项如何? 二元分类的默认值是仅计算正类的f1分数。如中所述,默认值为
    average='binary'

    让我们比较一下合成示例中的所有
    average
    选项:

    f1_分数(y_真,y_pred,average='binary')#0.1818。。。
    f1#U分数(y#U真、y#U pred、average='micro')#0.9991。。。
    f1#U分数(y#U true,y#U pred,average='macro')#0.5908。。。
    f1#U分数(y#U真、y#U pred、average='weighted')#0.9998。。。
    
    (None返回正类和负类的f1分数元组,而“samples”不适用于我们的情况)

    提醒是相关的:

    精度方程:
    Precision=TP/(TP+FP)

    召回方程:
    Recall=TP/(TP+FN)

    f1分数:
    f1\u分数=2*精度*召回/(精度+召回)

    由于它没有考虑到
    TN
    ,默认f1分数忽略了成功检测多数类的模型能力。在某些情况下,这可能过于苛刻,因此其他选项尝试使用不同的策略将其考虑在内:

    • average=“micro”
      统计正类和负类的TP、FP、FN,将它们相加,并计算精度、召回率和f1
    • average=“macro”
      统计每门课的总分、总成绩、总成绩,分别计算f1成绩,并计算所有f1成绩的未加权平均值
    • average=“weighted”
      不支持
      average=“macro”
      ,但支持加权平均(即每个类的样本数)
    选择哪个f1分数在很大程度上取决于应用程序。根据我的经验,
    average=“binary”
    对模型性能的要求太苛刻了,但我并没有像您这样经历过严重的类不平衡

    在你们的例子中,AP和F1分数很低,因为模型不能成功地预测积极的等级。有很多策略,我会建议一些对我有用的方法:选择一个有代表性的,但比大多数人小得多的子集


    在实例选择、选择最近邻和迭代案例过滤等方面有很多方法。我发现这篇文章内容丰富。

    你对此有何看法:?似乎PR、RC、ROC和AUC是误导性的有问题的评分标准!好书。我得说,我同意PR,RC是片面的指标,不适合用于模式选择,而忽略其他因素。然而,ROC AUC和PR AUC通过对所有可能阈值进行二值化来考虑预测概率。由于使用了整个混淆矩阵,ROC AUC不适用于不平衡类,但PR AUC只适用于少数类,因此更加稳健。到目前为止,这是我的最爱,所以我无法公正地判断。似乎统计学家根本不推荐F1成绩,即使他们不想认识到数据不平衡的问题。他们认为逻辑回归足以用黄金标准处理不平衡数据
                  precision    recall  f1-score   support
    
             0.0       1.00      1.00      1.00     99990
             1.0       1.00      0.10      0.18        10
    
        accuracy                           1.00    100000
       macro avg       1.00      0.55      0.59    100000
    weighted avg       1.00      1.00      1.00    100000