如何解释近乎完美的准确性和 AUC-ROC 但零 f1 分数、精确度和召回率

How to interpret almost perfect accuracy and AUC-ROC but zero f1-score, precision and recall

我正在训练机器学习逻辑分类器,使用 python scikit-learn 对两个 类 进行分类。他们处于极度不平衡的数据中(大约14300:1)。我获得了几乎 100% 的准确率和 ROC-AUC,但准确率、召回率和 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 与 "point-wise" 指标(如 accuracy/precision 等)之间的关键区别。ROC 是阈值的 函数 。给定一个输出属于每个 class 概率的模型 (classifier),我们预测具有最高概率(支持度)的 class。但是,有时我们可以通过更改此规则并要求一个支持比另一个大 2 倍以实际 class 确定为给定的 class 来获得更好的分数。 对于不平衡的数据集,这通常是正确的。通过这种方式,您实际上是在修改 classes 的先验知识以更好地适应您的数据。 ROC 查看 "what would happen if I change this threshold to all possible values" 然后 AUC ROC 计算这样一条曲线的积分。

因此:

  • 高 AUC ROC 与低 f1 或其他 "point" 指标,意味着 您的 classifier 目前做得不好,但是您可以找到其分数的阈值其实还不错
  • 低 AUC ROC 和低 f1 或其他 "point" 指标,意味着 你的 classifier 目前做得不好,即使适合阈值也不会改变它
  • 高 AUC ROC 和高 f1 或其他 "point" 指标,意味着 你的 classifier 目前做得不错,对于许多其他阈值它会做同样
  • 低 AUC ROC 与高 f1 或其他 "point" 指标,意味着 你的 classifier 目前做得不错,但是对于许多其他阈值 - 它是很糟糕