模型中的精确率和召回率是相同的

Posted

技术标签:

【中文标题】模型中的精确率和召回率是相同的【英文标题】:Precision and recall are the same within a model 【发布时间】:2021-10-10 01:13:59 【问题描述】:

我正在从事一个多分类项目,我注意到无论我运行什么分类器,模型中的准确率和召回率都是相同的。

分类问题具有三个不同的类别。数据量偏小,13k 个实例分为测试(0.8)和训练(0.2)。

训练数据的形状为 (10608, 28),标签的形状为 (10608, 3)(二值化标签)。

分类不平衡:

标签 0 代表所有标签的 30% 标签 1 占所有标签的 4% 标签 2 占所有标签的 66%。

我正在比较不同的分类器,以便稍后专注于最有前途的分类器。在计算每个模型的精度和召回率时,我注意到它们在模型中总是相同的。

由于准确率和召回率的计算方式,当假阴性预测的数量等于假阳性预测的数量FP = FN 时,它们可能是相同的。

例子:

SGD 分类器

sgd_clf = OneVsRestClassifier(SGDClassifier(random_state=42))
sgd_clf.fit(data_tr, labels_tr)
y_pred_sgd = cross_val_predict(sgd_clf, data_tr, labels_tr, cv=5) 
cm_sgd = confusion_matrix(labels_tr.argmax(axis=1), y_pred_sgd.argmax(axis=1))  

cm_sgd:
array([[1038,   19, 2084],
       [ 204,   22,  249],
       [ 931,   48, 6013]], dtype=int64)
precision_score(labels_tr.argmax(axis=1), y_pred_sgd.argmax(axis=1), average="micro")  
0.666760935143288
recall_score(labels_tr.argmax(axis=1), y_pred_sgd.argmax(axis=1), average="micro") 
0.666760935143288

FP=FN=3535

逻辑回归

lr_clf = OneVsRestClassifier(LogisticRegression(random_state=42, max_iter=4000))
lr_clf.fit(data_tr, labels_tr)
y_pred_lr = cross_val_predict(lr_clf, data_tr, labels_tr, cv=5)
cm_lr = confusion_matrix(labels_tr.argmax(axis=1), y_pred_lr.argmax(axis=1))

cm_lr: 
array([[ 982,    1, 2158],
       [ 194,    7,  274],
       [ 774,    9, 6209]], dtype=int64)

precision_score(labels_tr.argmax(axis=1), y_pred_lr.argmax(axis=1), average="micro") 
0.6785444947209653
recall_score(labels_tr.argmax(axis=1), y_pred_lr.argmax(axis=1), average="micro") 
0.6785444947209653


FP=FN=3410

随机森林

rf_clf = OneVsRestClassifier(RandomForestClassifier(random_state=42))
rf_clf.fit(data_tr, labels_tr)
y_pred_forest = cross_val_predict(rf_clf, data_tr, labels_tr, cv=5)
cm_forest = confusion_matrix(labels_tr.argmax(axis=1), y_pred_forest.argmax(axis=1)) 

cm_forest: 
array([[1576,   56, 1509],
      [ 237,   45,  193],
      [1282,   61, 5649]], dtype=int64)
precision_score(labels_tr.argmax(axis=1), y_pred_forest.argmax(axis=1), average="micro")
0.6853318250377074
recall_score(labels_tr.argmax(axis=1), y_pred_forest.argmax(axis=1), average="micro")  
0.6853318250377074

FP=FN=3338

所有模型在一个模型中具有相同召回率和精度的可能性有多大?我错过了什么吗?

【问题讨论】:

【参考方案1】:

发生这种情况是因为您正在计算micro 的平均分数。在文档中,它被描述为:

通过计算真阳性、假阴性和假阳性的总数来全局计算指标。

现在要注意了:在保证每个测试用例都被分配到一个类的分类任务中,计算 micro 平均值等同于计算准确度分数。这就是为什么您在每个模型中获得相同结果的准确率和召回率:您基本上是在计算所有情况下的准确率。

您可以通过使用accuracy_score 并比较结果来验证这一点。

因此,您应该使用macroweighted 平均值来更好地评估模型的精度和召回率。

【讨论】:

感谢您的解释和解决我的困惑。我读到对于不平衡的分类,微观平均值优于宏观平均值。这也是我选择它的原因。我相信加权平均在我的情况下比宏观平均更有用,因为它是由支撑加权的。如果可以的话,我还有一个问题:在我的情况下,什么指标(即不平衡的多类分类)最适合比较不同的模型?虽然阅读了很多关于它的信息,但似乎没有明确的指标。 “最佳”选择(如果存在这种情况)实际上取决于潜在问题以及您愿意容忍的更多情况,即误报 (FP) 或误报 (FN)。假设您不太关心产生 FN 预测并希望最小化 FP 预测,您可能会更关注实现高精度分数(与公式比较)。对于相反的情况,您将分别更多地关注召回。如果您无法承受这两者之间的这种权衡,那么 F1 分数是一个很好的衡量标准,因为它是准确率和召回率的调和平均值。 话虽如此,这只是一个指导,而不是一个广泛的答案。还有更多指标,例如F-beta score 和precision-recall curve 下的区域,它们可能也适合您的特定情况。但我认为这应该是您深入研究该主题的良好开端,希望它能进一步帮助您。

以上是关于模型中的精确率和召回率是相同的的主要内容,如果未能解决你的问题,请参考以下文章

模型评估:精确率召回率准确率

分类--精确率和召回率

准确率(precision)与召回率(recall)

准确率(Accuracy) 精确率(Precision) 召回率(Recall)和F1-Measure(精确率和召回率的调和平均值)

有关平均精度AP 和精确度-召回率曲线PR AUC的疑惑

精确率和召回率