我正在训练 ML 逻辑分类器,以使用 python scikit-learn 对两个类进行分类。他们处于极其不平衡的数据(大约14300:1)。我的准确率和 ROC-AUC 几乎为 100%,但准确率、召回率和 f1 分数为 0%。我知道准确性通常在非常不平衡的数据中没有用,但为什么 ROC-AUC 度量也接近完美?
from sklearn.metrics import roc_curve, auc
# Get ROC
y_score = classifierUsed2.decision_function(X_test)
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_score)
roc_auc = auc(false_positive_rate, true_positive_rate)
print 'AUC-'+'=',roc_auc
1= class1
0= class2
Class count:
0 199979
1 21
Accuracy: 0.99992
Classification report:
precision recall f1-score support
0 1.00 1.00 1.00 99993
1 0.00 0.00 0.00 7
avg / total 1.00 1.00 1.00 100000
Confusion matrix:
[[99992 1]
[ 7 0]]
AUC= 0.977116255281
上面是使用逻辑回归,下面是使用决策树,决策矩阵看起来几乎相同,但 AUC 却有很大不同。
1= class1
0= class2
Class count:
0 199979
1 21
Accuracy: 0.99987
Classification report:
precision recall f1-score support
0 1.00 1.00 1.00 99989
1 0.00 0.00 0.00 11
avg / total 1.00 1.00 1.00 100000
Confusion matrix:
[[99987 2]
[ 11 0]]
AUC= 0.4999899989
最佳答案
人们必须理解 AUC ROC 和“逐点”指标(例如准确度/精度等)之间的关键区别。ROC 是阈值的函数。给定一个输出属于每个类别的概率的模型(分类器),我们预测具有最高概率(支持度)的类别。然而,有时我们可以通过更改此规则并要求一个支持比另一个支持大 2 倍才能实际分类为给定类别来获得更好的分数。 这对于不平衡的数据集通常是正确的。通过这种方式,您实际上是在修改学习到的类的先验知识以更好地适应您的数据。 ROC 着眼于“如果我将此阈值更改为所有可能的值会发生什么”,然后 AUC ROC 计算该曲线的积分。
因此:
- 高 AUC ROC 与低 f1 或其他“点”指标相比,意味着您的分类器目前表现不佳,但您可以找到其分数实际上相当不错的阈值
- 低 AUC ROC 和低 f1 或其他“点”指标,意味着您的分类器目前表现不佳,即使拟合阈值也不会改变它
- 高 AUC ROC 和高 f1 或其他“点”指标,意味着您的分类器目前表现不错,对于许多其他阈值,它也会做同样的事情
- 低 AUC ROC 与高 f1 或其他“点”指标相比,意味着您的分类器目前表现不错,但对于许多其他阈值 - 效果相当糟糕
关于machine-learning - 如何解释几乎完美的准确度和 AUC-ROC,但 f1 分数、精确度和召回率为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34698161/