sklearn报错解决方案UndefinedMetricWarning: Precision is ill-defined and being set to 0.0
Posted 征途黯然.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sklearn报错解决方案UndefinedMetricWarning: Precision is ill-defined and being set to 0.0相关的知识,希望对你有一定的参考价值。
出错描述
使用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 = 4
。y_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_true
、y_pred
。那么该样本对应的准确率就应该为:
1
5
∗
(
1
2
+
2
2
+
1
1
+
2
2
+
1
2
)
=
0.8
\\frac15 * (\\frac12 + \\frac22 + \\frac11 + \\frac22 + \\frac12)= 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_true
、y_pred
。那么该样本对应的准确率就应该为:
1
5
∗
(
1
2
+
2
2
+
1
1
+
2
2
+
0
)
=
0.7
\\frac15 * (\\frac12 + \\frac22 + \\frac11 + \\frac22 + 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_true
、y_pred
。那么该样本对应的准确率就应该为:
1
5
∗
(
0
+
0
+
0
+
0
+
0
)
=
0.0
\\frac15 * (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,最后取平均也还能接收,直接忽略警告就行。
以上是关于sklearn报错解决方案UndefinedMetricWarning: Precision is ill-defined and being set to 0.0的主要内容,如果未能解决你的问题,请参考以下文章
sklearn报错解决方案UndefinedMetricWarning: Precision is ill-defined and being set to 0.0
sklearn报错解决方案UndefinedMetricWarning: Precision is ill-defined and being set to 0.0
报错cannot import name 'AdaptiveLasso' from 'sklearn.linear_model',怎么解决?
No module named ‘sklearn.model_selection‘问题解决
python报错:cannot import name ‘joblib‘ from ‘sklearn.externals‘
成功解决(机器学习分割数据问题):ModuleNotFoundError: No module named ‘sklearn.cross_validation‘