Keras多目标分类模型验证准确率与sklearn计算结果不一致疑问
结果不一致的核心原因
你当前进行的是多标签分类任务,模型输出层使用sigmoid激活、损失函数使用binary_crossentropy的配置符合任务要求,两个准确率结果差异的核心原因是Keras内置准确率和sklearn的accuracy_score的计算规则完全不同。
Keras侧val_accuracy的计算逻辑
当损失函数指定为binary_crossentropy时,Keras默认调用BinaryAccuracy指标,计算规则为:
- 对每个样本的每一个标签维度,单独对比预测值与真实值是否一致
- 统计所有标签维度中预测正确的总数量,除以全部样本的总标签数量,得到最终准确率
比如你训练日志中最后一轮val_accuracy为0.5250,代表验证集里平均有52.5%的标签维度被预测正确。
sklearn侧accuracy_score的计算逻辑
sklearn的accuracy_score默认是为单标签分类设计的,在多标签场景下的默认规则为:
- 只有当单个样本的所有标签维度的预测结果和真实结果完全匹配时,才判定该样本预测正确
- 统计完全预测正确的样本数量,除以总样本数量得到最终准确率
你得到的0.0777的结果,代表验证集里只有约7.77%的样本所有标签都被完全预测正确,和Keras的统计维度完全不同,所以数值差异极大。
对齐两种结果的方法
如果你要得到和Keras val_accuracy完全一致的结果,可以使用以下两种方式:
- 手动逐元素计算准确率:
import numpy as np y_pred = np.round(model.predict(X_test)) y_true = y_test.toarray() keras_aligned_acc = (y_pred == y_true).mean()
- 通过Hamming Loss反向计算:
from sklearn.metrics import hamming_loss keras_aligned_acc = 1 - hamming_loss(y_true, y_pred)
多标签分类的指标建议
多标签分类任务中,Keras默认的逐元素准确率参考价值有限,更建议使用以下指标评估模型效果:
- 精确率(Precision)、召回率(Recall)、F1分数:可通过
sklearn.metrics.f1_score指定average参数计算微平均、宏平均等不同维度的结果 - 子集准确率:即sklearn默认的
accuracy_score结果,代表完全预测正确的样本占比 - Hamming Loss:代表单个标签维度的错误率,数值越低效果越好
小提示:你的代码里输入层变量名误写为
imput_,属于拼写笔误,不影响运行但建议修正为input_更符合规范。
内容的提问来源于stack exchange,提问作者Rodrigo Serna Pérez
相关产品推荐
相关产品推荐

