为何Keras与Sklearn计算得到的F1、准确率等指标值完全一致
你观察到的所有指标数值完全相等是符合计算逻辑的正常现象,不是运行错误,无需特殊修复,原理如下:
1. sklearn侧四类指标相等的原因
当你在多分类指标计算中指定average='micro'时,计算逻辑为:先统计所有类别的总真正例(TP)、总假正例(FP)、总假负例(FN),再基于全局统计值计算指标:
- 精确率 = 总TP / (总TP + 总FP)
- 召回率 = 总TP / (总TP + 总FN)
- F1值 = 2 * 精确率 * 召回率 / (精确率 + 召回率)
你的y_true和y_pred都是独热编码格式,每个样本仅有一个位置为1,此时每一个预测错误的样本,会同时贡献1个FP(把负类预测为正)和1个FN(把正类预测为负),因此总FP = 总FN,代入上面的公式可得:精确率 = 召回率 = F1值。
而准确率的计算逻辑是预测正确的样本数/总样本数 = 总TP / 总样本数,在总FP=总FN的前提下,总TP/(总TP+总FP) = 总TP/总样本数,因此准确率也和另外三个指标相等。
2. Keras与sklearn结果完全匹配的原因
- 你使用的
tfa.metrics.F1Score显式指定了average='micro',和sklearn的计算逻辑完全对齐,结果末尾的微小差异是float32和float64的精度差,属于正常误差。 tf.keras.metrics.CategoricalAccuracy本身就是多分类准确率计算接口,和sklearn的accuracy_score逻辑一致。tf.keras.metrics.Precision()和tf.keras.metrics.Recall()在独热编码的多分类输入场景下,默认统计全局的TP/FP/FN,等价于average='micro'的计算效果,因此结果和sklearn侧一致。
3. 如需获取不同指标值的修改方法
如果你需要区分四类指标的数值,修改平均方式即可,示例如下:
- sklearn侧将所有指标的
average参数改为'macro'(宏平均,每个类的指标先单独计算再算术平均,不考虑类别样本量差异)或'weighted'(加权平均,按每个类的样本量加权平均) - Keras侧:
- F1Score的
average参数修改为对应值 - Precision和Recall接口显式指定平均参数:
tf.keras.metrics.Precision(average='macro')、tf.keras.metrics.Recall(average='macro')
- F1Score的
内容的提问来源于stack exchange,提问作者Yogesh Riyat
相关产品推荐
相关产品推荐

