You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Keras训练中精确率、召回率上升时准确率反而下降?

问题根因

你在模型编译时误用了Keras的准确率指标,核心逻辑差异如下:

  • tf.keras.metrics.Accuracy()的计算规则是逐元素判断预测值与真实值完全相等才判定为预测正确。你的二分类输出层使用sigmoid激活,输出是0~1区间的连续概率值,并非离散的0/1分类标签,和真实的0/1标签几乎不可能完全相等,因此该指标输出的数值完全不具备参考价值。
  • tf.keras.metrics.Precision()、tf.keras.metrics.Recall()两个指标默认会以0.5为阈值,先把连续概率转换为离散的0/1分类结果再计算指标值,因此这两个指标的表现是符合实际训练效果的。
  • 训练过程中该错误Accuracy指标持续下降是必然现象:训练初始阶段模型权重随机初始化,输出值多在0.5附近波动,存在极小概率出现输出值和标签完全相等的情况;随着训练推进,模型输出会逐渐向0、1两端收敛,和离散0/1标签的数值差会稳定不为0,统计到的"完全相等"样本占比自然会持续走低。

你用sklearn计算得到0.94的合理准确率,是因为sklearn的accuracy_score对应二分类概率输入时,默认会以0.5为阈值做分类转换,计算逻辑是正确的。

修复方案

将compile阶段metrics列表中的tf.keras.metrics.Accuracy()替换为二分类场景专用的准确率指标即可,修改后代码如下:

input = tf.keras.layers.Input(shape=(12,))
dense1 = tf.keras.layers.Dense(units=200, activation='relu')(input)
dense2 = tf.keras.layers.Dense(units=200, activation='relu')(dense1)
output = tf.keras.layers.Dense(units=1, activation='sigmoid')(dense2)

model = tf.keras.Model(input, output)
model.compile(
    optimizer=tf.keras.optimizers.Adam(),
    loss=tf.keras.losses.BinaryCrossentropy(),
    metrics=[
        tf.keras.metrics.BinaryAccuracy(threshold=0.5),
        tf.keras.metrics.Precision(), 
        tf.keras.metrics.Recall()
    ]
)

tf.keras.metrics.BinaryAccuracy()默认以0.5为阈值把sigmoid输出的概率转换为0/1分类结果,再统计预测正确的样本占比,计算逻辑和sklearn的准确率计算规则对齐,重新训练后就能得到符合预期的准确率数值。

额外注意:多分类场景下如果输出是softmax生成的各类别概率,也不要直接使用Accuracy(),one-hot标签场景用CategoricalAccuracy(),整数标签场景用SparseCategoricalAccuracy()。

内容的提问来源于stack exchange,提问作者rmoret

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:30:47