使用Sklearn评估accuracy/precision/recall/f1结果一致,如何解决?
问题原因与解决方法
为什么四个指标结果相同?
你在计算precision、recall、f1时使用了average='micro'参数,在多分类(或二分类)任务中,micro平均的计算逻辑会让这三个指标和accuracy完全等价:
- micro-precision = 全局正确预测数 / 总预测数(总预测数等于总样本数,每个样本对应一个预测结果)
- micro-recall = 全局正确预测数 / 总真实样本数(总真实样本数就是总样本数)
- 基于上述两个值计算的micro-F1自然也等于accuracy
因此最终四个指标结果完全一致。
怎么解决?
根据你的任务类型选择合适的average参数:
- 二分类任务:直接去掉
average参数(默认值为binary),会自动计算正类的precision、recall、f1,结果会和accuracy产生差异。 - 多分类任务:
- 使用
average='macro':计算每个类的指标后取算术平均,不考虑类别的样本数量差异 - 使用
average='weighted':按每个类的样本数量加权计算平均,适合样本不均衡的场景 - 不指定
average参数:返回每个类的precision、recall、f1数组,能查看单个类别的表现
- 使用
修改后的代码示例(以weighted平均为例)
accuracy = accuracy_score(y_test, predictions) precision = precision_score(y_test, predictions, average='weighted') recall = recall_score(y_test, predictions, average='weighted') f1 = f1_score(y_test, predictions, average='weighted') print("Accuracy: ", accuracy) print("precision: ", precision) print("recall: ", recall) print("f1: ", f1)
查看每个类别的指标示例
precision_per_class = precision_score(y_test, predictions, average=None) recall_per_class = recall_score(y_test, predictions, average=None) f1_per_class = f1_score(y_test, predictions, average=None) print("每个类的precision: ", precision_per_class) print("每个类的recall: ", recall_per_class) print("每个类的f1: ", f1_per_class)
内容的提问来源于stack exchange,提问作者user572575
相关产品推荐
相关产品推荐

