accuracy_score 和precision_score 可以相等吗?

Posted

技术标签:

【中文标题】accuracy_score 和precision_score 可以相等吗?【英文标题】:Can accuracy_score and precision_score be equal? 【发布时间】:2019-06-30 14:38:46 【问题描述】:

我正在尝试使用 sklearn 库在 python 3 中构建逻辑回归模型。

让我们继续使用以下简短版本,

dv - 因变量

idv - 自变量

现在我有 idv1、idv2、idv3、idv4、idv5、idv6、idv7、idv8 和 idv9。

其中 idv6 到 idv9 是分类变量(idv6 和 idv7 有 3 个类别..其中 idv8 和 idv9 是布尔变量..是或没有类型的变量 [0 或 1])

而 dv 又是一个布尔变量(是或否的变量)。

现在,我为最终模型数据创建了一个 idv6 到 idv9 的假人...即 idv6_c1、idv6_c2、idv_c3 并为其余的类似 idv8_c1、idv8_c2 为 idv8 和 idv9。

现在,在拟合模型并找到预测值的指标之后......

我得到 accuracy_score76.7415479670124 %precision_score76.7415479670124 %

我使用 sklearn.metrics.accuracy_scoresklearn.metrics.precision_score 库进行了计算。

我想知道..这是正确的还是我遗漏了什么...??

这会发生吗??...准确度和精度几乎等于小数点后 13 位???....我确定...我做错了什么...谁能帮帮我吗??

【问题讨论】:

【参考方案1】:

精度 = 真阳性 /(真阳性 + 假阳性)

准确率 =(真阳性 + 真阴性)/(真阳性 + 假阳性 + 真阴性 + 假阴性)

因此,如果没有负面预测,这两个值将相等。

【讨论】:

【参考方案2】:

精度定义为相关检索结果的比例,由下式给出:(tp/tp+fp),而精度是正确预测与输入样本总数的比率。

虽然可能性较小,但当真阴性和假阴性的数量都为零时,精度可能会等于精度。也就是说,您的系统不会将任何样本分类为阴性。

但是,您的问题可能与 here 中提到的微平均有关。

【讨论】:

【参考方案3】:

这里a link解决同样的分数结果和更详细的原理。

你只需要更改 scikit-learn 的参数即可。

average = macroaverage = weighted

代码和结果是从上面的链接复制的。 (https://simonhessner.de/why-are-precision-recall-and-f1-score-equal-when-using-micro-averaging-in-a-multi-class-problem/)

参考:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_score.html

print("Precision (micro): %f" % precision_score(labels, predicitons, average='micro'))
print("Recall (micro):    %f" % recall_score(labels, predicitons, average='micro'))
print("F1 score (micro):  %f" % f1_score(labels, predicitons, average='micro'), end='\n\n')

print("Precision (macro): %f" % precision_score(labels, predicitons, average='macro'))
print("Recall (macro):    %f" % recall_score(labels, predicitons, average='macro'))
print("F1 score (macro):  %f" % f1_score(labels, predicitons, average='macro'), end='\n\n')

print("Precision (weighted): %f" % precision_score(labels, predicitons, average='weighted'))
print("Recall (weighted):    %f" % recall_score(labels, predicitons, average='weighted'))
print("F1 score (weighted):  %f" % f1_score(labels, predicitons, average='weighted'))

会得到这个结果:

    Precision (micro): 0.444444
    Recall (micro): 0.444444
    F1 score (micro): 0.444444

    Precision (macro): 0.366667
    Recall (macro): 0.361111
    F1 score (macro): 0.355556

    Precision (weighted): 0.433333
    Recall (weighted): 0.444444
    F1 score (weighted): 0.429630

【讨论】:

以上是关于accuracy_score 和precision_score 可以相等吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Gridsearchcv 中评分

sklearn.metrics指标

sklearn.metrics 用法详解

在 GridSearch 和交叉验证中,我只得到 XGBClassifier 的 `accuracy_score` 而不是 `roc_auc`

用我自己的语料库用 scikit-learn 理解 accuracy_score?

如何在 LinearRegression 上使用 accuracy_score?