我正在训练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
答案 0 :(得分:42)
必须了解AUC ROC和"逐点"之间的关键区别。精度/精度等指标.ROC是阈值的函数。给定一个模型(分类器)输出属于每个类的概率,我们预测具有最高概率(支持)的类。但是,有时我们可以通过更改此规则获得更好的分数,并要求一个支持比另一个大2倍,以实际分类为给定的类。 对于不平衡的数据集通常是这样。这样,您实际上是在修改类的学习优先级以更好地适应您的数据。 ROC着眼于如果我将此阈值更改为所有可能的值,将会发生什么?"然后AUC ROC计算这种曲线的积分。
因此: