【sklearn报错解决方案】UndefinedMetricWarning: Precision is ill-defined and being set to 0.0

本文深入探讨了在使用sklearn.metrics.precision_score计算精确率时遇到的`UndefinedMetricWarning`警告。精确率计算涉及预测正确标签的比例,当预测标签全为0时会导致除数为0的错误。示例展示了不同数据情况下精确率的计算,包括全0预测标签的情况。解决方法是直接忽略警告,因为在一个较大的batch_size中,个别样本精确率为0对整体影响较小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出错描述

  使用sklearn.metrics.precision_score计算精确率时,出现报错:UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in samples with no predicted labels.

问题原理分析

  精确率计算的是所有样本的平均精确率。而对于每个样本来说,精确率就是预测正确的标签数在整个预测为正确的标签数中的占比。其计算公式为:
在这里插入图片描述

  例如对于某个样本来说,其真实标签为[0, 1, 0, 1],预测标签为[0, 0, 0, 0]。那么该样本对应的精确率就应该为:(0 + 1 + 0 + 0) / (0 + 0 + 0 + 0),这时就会报错

情况一

  假设有数据:样本数batch_size = 5,标签数label_num = 4y_true为真实标签,y_pred为预测标签值。

y_true = np.array([[0, 1, 0, 1],
                   [0, 1, 1, 0],
                   [0, 0, 1, 0],
                   [1, 1, 1, 0],
                   [1, 0, 1, 1]])

y_pred = np.array([[0, 1, 1, 0],
                   [0, 1, 1, 0],
                   [0, 0, 1, 0],
                   [0, 1, 1, 0],
                   [0, 1, 0, 1]])

  对照上面给的数据y_truey_pred。那么该样本对应的准确率就应该为:
1 5 ∗ ( 1 2 + 2 2 + 1 1 + 2 2 + 1 2 ) = 0.8 \frac{1}{5} * (\frac{1}{2} + \frac{2}{2} + \frac{1}{1} + \frac{2}{2} + \frac{1}{2})= 0.8 51(21+22+11+22+21)=0.8

情况二

  假设数把y_pred的某一行改为全0,数据如下。

y_true = np.array([[0, 1, 0, 1],
                   [0, 1, 1, 0],
                   [0, 0, 1, 0],
                   [1, 1, 1, 0],
                   [1, 0, 1, 1]])

y_pred = np.array([[0, 1, 1, 0],
                   [0, 1, 1, 0],
                   [0, 0, 1, 0],
                   [0, 1, 1, 0],
                   [0, 0, 0, 0]])

  对照上面给的数据y_truey_pred。那么该样本对应的准确率就应该为:
1 5 ∗ ( 1 2 + 2 2 + 1 1 + 2 2 + 0 ) = 0.7 \frac{1}{5} * (\frac{1}{2} + \frac{2}{2} + \frac{1}{1} + \frac{2}{2} + 0)= 0.7 51(21+22+11+22+0)=0.7

情况三

  假设数把y_pred改为全0,数据如下。

y_true = np.array([[0, 1, 0, 1],
                   [0, 1, 1, 0],
                   [0, 0, 1, 0],
                   [1, 1, 1, 0],
                   [1, 0, 1, 1]])

y_pred = np.array([[0, 0, 0, 0],
                   [0, 0, 0, 0],
                   [0, 0, 0, 0],
                   [0, 0, 0, 0],
                   [0, 0, 0, 0]])

  对照上面给的数据y_truey_pred。那么该样本对应的准确率就应该为:
1 5 ∗ ( 0 + 0 + 0 + 0 + 0 ) = 0.0 \frac{1}{5} * (0 + 0 + 0 + 0 + 0 )= 0.0 51(0+0+0+0+0)=0.0

【注】所以如果有除数为0,sklearn中会默认把数值置为0来计算。

解决办法

  直接忽略警告即可。

import warnings
warnings.filterwarnings("ignore")

【注】一般一个batch_size都会在32-128,所以有个别样本的精确率为0,最后取平均也还能接收,直接忽略警告就行。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

征途黯然.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值