You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何手动用混淆矩阵计算与sklearn的precision_score结果不一致?

问题与代码

这是我运行的代码:

import pandas as pd
whole_population = pd.read_csv('Whole_population_with_Class_column.csv')
whole_population = whole_population.drop(whole_population.columns[0],axis=1)
from sklearn import metrics
from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score, roc_auc_score, matthews_corrcoef

actual = whole_population['Landslide']
predicted = whole_population['Jenks_Class']
confusion_matrix = metrics.confusion_matrix(actual, predicted)

accuracy = accuracy_score(actual, predicted)
precision = precision_score(actual, predicted)
recall = recall_score(actual, predicted)
f1_score = f1_score(actual, predicted)
mcc = matthews_corrcoef(actual, predicted)

print(accuracy)
print(precision)
print(recall)
print(f1_score)
print(mcc)

代码生成混淆矩阵后,输出结果如下:

  • 0.6647094256133509 (accuracy)
  • 0.9985021160091312 (precision)
  • 0.664066520207418 (recall)
  • 0.7976474608673689 (f1 score)
  • 0.06769568834135027 (mcc)

已知scikit-learn生成的混淆矩阵格式为:

TN | FP
FN | TP

手动按公式precision = TP/(TP+FN) = 4720/(4720+407361) = 0.0114540588计算,得到的精度值与precision_score的结果差异极大,召回率也有类似问题,请问原因是什么?


问题原因
  1. 公式完全搞反
    你手动计算用的TP/(TP+FN)是**召回率(Recall)**的计算公式,而精度(Precision)的正确公式是TP/(TP+FP)。反过来,召回率的计算才是用TP除以TP加FN,这是核心错误。

  2. 正类标签的匹配问题
    scikit-learn的precision_score默认将标签中数值更大的类别视为正类(比如标签是0和1时,默认正类是1),你也可以通过pos_label参数显式指定。如果手动计算时搞反了正类(比如把0当成正类),结果也会完全偏离。

  3. 混淆矩阵的行列对应
    sklearn的confusion_matrix(y_true, y_pred)是行对应真实标签、列对应预测标签:

  • 第一行:真实负类样本,第一列是TN(真实负、预测负),第二列是FP(真实负、预测正)
  • 第二行:真实正类样本,第一列是FN(真实正、预测负),第二列是TP(真实正、预测正)
    要确认手动取值时有没有搞混TP、FP、FN的位置。比如你用的4720如果是TP,407361是FN,那这个计算结果应该和sklearn输出的召回率(0.66左右)匹配;而精度需要用TP除以(TP+FP),结合你得到的0.998的精度结果来看,说明FP的数值极小,正类预测错误的情况极少,所以精度极高。

内容的提问来源于stack exchange,提问作者Mansha Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:16:03