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

使用自定义Adam优化器后sklearn报Precision和F-score未定义警告如何解决

警告根因

该警告触发的核心原因是:你的模型在测试集上完全没有预测出部分真实存在的类别,即这些类别仅出现在真实标签test_data_generator.classes中,从未出现在预测结果y_pred里。sklearn计算精确率时分母为「预测为对应类别的样本总数」,分母为0时无法计算指标,因此触发该警告。


你之前的方案为什么会丢失准确率

你传入labels=np.unique(y_pred)相当于手动指定只评估预测结果中出现过的类别,直接舍弃了所有未被预测到的类别。此时classification_report的评估范围和全局样本不一致,所以全局准确率不会正常输出,且剩余类别的宏平均、加权平均指标也会存在偏差,属于治标不治本的方案。


正确解决方法

方案1:直接使用官方提示的zero_division参数(推荐)

该参数专门用于控制分母为0时的指标处理逻辑,取值支持:

  • 0:无法计算的指标直接设为0,不弹出警告
  • 1:无法计算的指标直接设为1,不弹出警告
  • "warn":默认值,弹出警告后指标设为0

修改你的指标计算代码即可,既不会丢失任何类别、准确率正常显示,也不会触发警告:

from sklearn.metrics import confusion_matrix, classification_report

prediksi = model.predict(test_data_generator)
y_pred = np.argmax(prediksi, axis=1)
print(confusion_matrix(test_data_generator.classes, y_pred))
# 新增zero_division参数即可
print(classification_report(test_data_generator.classes, y_pred, zero_division=0))

方案2:如果确实需要隐藏未被预测的类别

如果你不需要在报告中展示未被预测的类别,可以单独计算全局准确率,再生成自定义类别的评估报告:

from sklearn.metrics import confusion_matrix, classification_report, accuracy_score

prediksi = model.predict(test_data_generator)
y_pred = np.argmax(prediksi, axis=1)
print(confusion_matrix(test_data_generator.classes, y_pred))
# 单独打印全局准确率
print(f"全局准确率: {accuracy_score(test_data_generator.classes, y_pred):.4f}")
# 生成仅包含预测到的类别的报告,同时加zero_division避免警告
print(classification_report(test_data_generator.classes, y_pred, labels=np.unique(y_pred), zero_division=0))

额外优化建议

该警告本质也反映了模型的拟合问题:你当前设置的Adam学习率为1e-5,属于非常小的数值,有可能出现模型欠拟合、少数类完全没学到的情况。可以先检查训练集的准确率变化,如果训练集准确率也很低,可以适当调大学习率到1e-4~5e-4区间尝试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:03:00