classification_report与precision_score有什么关联?precision_score报错如何解决?
classification_report与precision_score关联及报错解决方案
二者关联
二者均为scikit-learn metrics模块下的官方分类评估工具,底层的精确率、召回率、F1值计算逻辑完全一致:
classification_report是批量计算工具,会自动遍历所有类别分别计算各指标,同时输出macro、weighted等聚合平均结果,最终格式化为可视化表格precision_score、recall_score、f1_score是单指标计算函数,默认针对二分类场景下的正类返回单值结果,也支持通过参数配置返回多分类的平均指标
报错原因
你的数据集标签为字符串类型的ham和spam,而precision_score、recall_score、f1_score三个函数的默认参数pos_label=1,这个默认值仅适用于标签为0/1数值类型的二分类场景,你的标签集合中不存在1这个值,因此触发参数校验报错。classification_report 不需要指定正类,默认会遍历所有类别计算指标,因此可以正常输出结果。
解决方法
根据你的使用需求选择对应配置即可:
场景1:计算单个类别的指标(比如垃圾邮件分类场景下通常spam为正类)
显式指定pos_label参数为对应类别值即可,修改后代码如下:
from sklearn.metrics import accuracy_score from sklearn.metrics import precision_score from sklearn.metrics import recall_score from sklearn.metrics import f1_score print(accuracy_score(y_test,predicted)) # 指定正类为spam print(precision_score(y_test,predicted, pos_label='spam')) print(recall_score(y_test,predicted, pos_label='spam')) print(f1_score(y_test,predicted, pos_label='spam'))
运行后输出的结果会和classification_report中spam对应的precision 1.00、recall 0.74、f1-score 0.85完全一致。
场景2:计算全局平均指标(对应classification_report中的macro avg或weighted avg)
指定average参数即可,不需要传pos_label:
# 计算macro平均(各类别指标算术平均) print(precision_score(y_test,predicted, average='macro')) print(recall_score(y_test,predicted, average='macro')) print(f1_score(y_test,predicted, average='macro')) # 计算weighted平均(各类别指标按样本占比加权平均) print(precision_score(y_test,predicted, average='weighted')) print(recall_score(y_test,predicted, average='weighted')) print(f1_score(y_test,predicted, average='weighted'))
运行后输出的结果会和classification_report中对应平均行的数值完全一致。
内容的提问来源于stack exchange,提问作者Sredyu
相关产品推荐
相关产品推荐

