了解二元分类器的精度和召回结果

Posted

技术标签:

【中文标题】了解二元分类器的精度和召回结果【英文标题】:Understanding Precision and Recall Results on a Binary Classifier 【发布时间】:2017-11-05 18:05:20 【问题描述】:

我知道机器学习中 Precision 和 Recall 指标之间的区别。一个优化 False Positives,另一个优化 False Negative。在统计学中,它被称为针对 I 类或 II 类错误进行优化。

但是,我对在什么情况下可以获得完全相反的 Precision 和 Recall 感到困惑?比如 Precision =1 和 Recall=0?。

让我重复一下:

precision = true positives / (true positives + false positives)

recall = true positives / (true positives + false negatives)

这是混淆矩阵

  predicted
            (+)   (-)
            ---------
       (+) | TP | FN |
actual      ---------
       (-) | FP | TN |
            ---------

现在,如果对于正 (1) 类的分类器,Precision = 1,这意味着没有 FP,并且所有预测标签都是 TP。

那么对于同一个正类,Recall 怎么可能是 0 呢?如果已经预测了一些 TP,实际上根据 Precision,所有预测的都只是 TP,那么对于 Recall,我们的分子非零,那么在什么情况下,对于同一个分类器正类,可以得到 Recall 0?

为了提供一些上下文,我针对二元分类问题运行了一个逻辑回归分类器。我有一些包含 774 个特征的 23K 训练数据。 770 个特征是二元或虚拟变量。

这是我的类标签的分布:

1    20429
0    12559

这是对大约 25 种超参数值组合进行 5 次网格搜索后的混淆矩阵和准确度值。

The mean train scores are [ 0.66883049  0.54314532  0.67008959  0.63187226  0.63100366  0.53165968
  0.54131812  0.55507725  0.5578254   0.57663273  0.57247462  0.57230056
  0.54402055  0.5762753   0.50925733  0.45781882  0.39366017  0.39037968
  0.3919818   0.38878762  0.39784982  0.39506755  0.48238147  0.38932944
  0.39801223]

The mean validation scores are [ 0.66445801  0.54107661  0.66878871  0.63184791  0.6305487   0.5291239
  0.53899788  0.55324585  0.55822615  0.57784418  0.57269066  0.57312373
  0.54536399  0.57593868  0.50790351  0.45727773  0.39318349  0.38906933
  0.39214413  0.38924256  0.39794725  0.39461262  0.4827855   0.38811658
  0.39812048]

The score on held out data is: 0.6687887055562773
 Hyper-Parameters for Best Score : 'alpha': 0.0001, 'l1_ratio': 0.45

The accuracy of sgd on test data is: 0.37526523188845107

Classification Metrics for sgd :
             precision    recall  f1-score   support

          0       0.38      1.00      0.55      3712
          1       1.00      0.00      0.00      6185

avg / total       0.77      0.38      0.21      9897

【问题讨论】:

我不确定我是否理解。如果精度=1,那么只有当FP=0时。并且 TP 不为 0。Recall=0 时,表示 TP=0。这是矛盾的 【参考方案1】:

您发布的输出四舍五入到小数点后 2 位,因此您的精度可能 = 1,召回率等于 0.001。例如,如果您仅将一个案例(正确)预测为 1,而其他所有案例都预测为 0,则可能会发生这种情况。因此,您的误报率非常高,您的召回率为 1/6185,接近 0。

【讨论】:

您的意思是说召回的假阴性率为0,因为召回与FN有关。我认为你有一个观点。可以是这样。这意味着这里的精确召回值是无用的。即使我专注于一种高精度的算法,只有 1 或 2 个正确值的精度也没有任何意义。另外,您为什么认为表现如此糟糕的情况会出现这种情况?我尝试了随机森林,它给出了 75% 的准确率,不像这里的 37。那么是不是因为 RF 发现的非线性决策边界和这里使用的线性逻辑不能导致性能不佳? 精确率和召回率并不是没用的,召回率为零是在告诉你你的模型很糟糕。逻辑回归不起作用的原因有很多,可能是非线性,可能是异常值,很难说 嗯。最后一个问题。当我运行我的 SVM 算法时,无论我进行多少次训练测试,这可能会导致不同的样本再次来训练,SVM 最终选择的模型总是相同的。但是当我运行逻辑时,它会因不同的火车测试拆分而有所不同。我不确定为什么会这样。就像你在上面看到的结果很糟糕。我再次进行了逻辑训练,现在我在不同的 alpha 和 l1_ratio 值下获得了 73% 的准确率。如果基础数据相同,为什么模型会改变,只是可能发生了不同的训练测试分裂。 很难说没有看到您的数据,但这可能是由于异常值,svm 不受这些影响,但 LR 是,因此可能是训练集是否选择了异常值。 好的,我查过了。即使在火车测试拆分中,我也有一个 random_state=42。因此,这意味着如果超时获得相同的随机抽样,我会运行训练测试拆分。所以数据保持不变。那如果我再次重新训练,为什么要改变模型。

以上是关于了解二元分类器的精度和召回结果的主要内容,如果未能解决你的问题,请参考以下文章

推荐系统+召回

机器学习实战——分类及性能测量完整案例(建议收藏慢慢品)

Keras 分类器上的准确率、召回率和 FMeasure 的 Sklearn Metrics

如何对医学大数据进行分类

第二章 | 分类问题 | F1-score | ROC曲线 | 精准率召回率 | tensorflow2.6+sklearn | 学习笔记

机器学习评价指标 本文针对二元分类器