在一个模型中,精确度和召回率是相同的 [英] Precision and recall are the same within a model

查看:16
本文介绍了在一个模型中,精确度和召回率是相同的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

分类问题有三个截然不同的类别。数据量偏小,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

Logistic回归

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

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

推荐答案

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

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

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

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

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

这篇关于在一个模型中,精确度和召回率是相同的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆