perceptron等模型验证准确率舍入为3位小数的问题排查
问题描述
这是我首次使用perceptron、ave perceptron和pegasos模型开展实验。目前我编写的函数已通过多组测试用例验证,但在统计准确率时发现,所有验证准确率数值均被向下舍入到3 dp(3位小数)。
请问是否是以下这段代码导致了该问题?
pred = np.where(decision > np.finfo(float).eps, 1.0, -1.0)
补充说明
我已将上述代码修改为如下形式,但验证准确率的输出未发生任何变化。
pred = np.where(decision >= 1e-16, 1.0, -1.0)
回答
你贴的这两段预测标签生成代码,完全不会导致准确率被舍入到3位小数的问题。
这两段代码的作用只是给决策值decision加了极小的浮点误差容忍阈值,以此判断输出1.0还是-1.0的分类标签,逻辑里没有任何对数值做小数位截断、舍入的操作。你修改阈值后准确率输出没有任何变化,刚好能佐证这一点:阈值调整根本没有改变最终生成的预测标签,自然不会对准确率数值产生影响。
准确率被固定舍入到3位小数,问题基本出在后续环节,你可以按下面的顺序排查:
- 优先检查准确率的输出格式化逻辑:最常见的情况是打印时用了类似
print(f"验证准确率:{acc:.3f}")的写法,强制指定了只保留3位小数输出;或是代码里显式调用了round(acc, 3)、np.round(acc, 3)这类舍入函数 - 检查准确率计算链路:看有没有手动做精度截断的写法,比如类似
acc = int(correct_num / total_num * 1000) / 1000这种会把数值强制截断到千分位的逻辑 - 小概率情况是验证集样本量刚好为1000,此时准确率的最小粒度就是1/1000=0.001,天然只有3位小数,但这种情况不会出现“向下舍入”的特征,概率极低
排查时可以先在准确率计算完成、还没做任何输出/后续处理的位置,直接打印原始的准确率变量值,不要加任何格式化修饰:如果原始值精度高于3位,直接定位到输出格式化的问题即可;如果原始值本身就只有3位,再顺着计算链路往前逐行打印中间值,找到做截断的代码位置就行。
内容的提问来源于stack exchange,提问作者james hamilton
相关产品推荐
相关产品推荐

