Python 使用5倍交叉验证时,在高度不平衡的数据中混淆F1分数和AUC分数
我一直在尝试使用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')有何区别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'
我不知道为什么我看到平衡的准确性和AUC分数是一样的!我欣赏你的想法!谢谢 你实际上在问三个不同的问题:
灵敏度=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分数忽略了成功检测多数类的模型能力。在某些情况下,这可能过于苛刻,因此其他选项尝试使用不同的策略将其考虑在内:
统计正类和负类的TP、FP、FN,将它们相加,并计算精度、召回率和f1average=“micro”
统计每门课的总分、总成绩、总成绩,分别计算f1成绩,并计算所有f1成绩的未加权平均值average=“macro”
不支持average=“weighted”
,但支持加权平均(即每个类的样本数)average=“macro”
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