为何手动用混淆矩阵计算与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的结果差异极大,召回率也有类似问题,请问原因是什么?
问题原因
公式完全搞反
你手动计算用的TP/(TP+FN)是**召回率(Recall)**的计算公式,而精度(Precision)的正确公式是TP/(TP+FP)。反过来,召回率的计算才是用TP除以TP加FN,这是核心错误。正类标签的匹配问题
scikit-learn的precision_score默认将标签中数值更大的类别视为正类(比如标签是0和1时,默认正类是1),你也可以通过pos_label参数显式指定。如果手动计算时搞反了正类(比如把0当成正类),结果也会完全偏离。混淆矩阵的行列对应
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
相关产品推荐
相关产品推荐

