python教程—UndefinedMetricWarning: F-score定义错误,在没有预测样本的标签中被设置为0.0-Python实用宝典

python教程—UndefinedMetricWarning: F-score定义错误,在没有预测样本的标签中被设置为0.0

我得到了这个奇怪的错误:但是它还输出了第一次运行时的f-score:第二次运行时,它提供了没有错误的分数。这是为什么呢?

我得到一个奇怪的错误:

    classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples. 'precision', 'predicted', average, warn_for)`

但当我第一次跑步时,它也会输出f-score:

    metrics.f1_score(y_test, y_pred, average='weighted')

第二次运行时,它提供了没有错误的分数。这是为什么呢?

    >>> y_pred = test.predict(X_test) >>> y_test array([ 1, 10, 35, 9, 7, 29, 26, 3, 8, 23, 39, 11, 20, 2, 5, 23, 28, 30, 32, 18, 5, 34, 4, 25, 12, 24, 13, 21, 38, 19, 33, 33, 16, 20, 18, 27, 39, 20, 37, 17, 31, 29, 36, 7, 6, 24, 37, 22, 30, 0, 22, 11, 35, 30, 31, 14, 32, 21, 34, 38, 5, 11, 10, 6, 1, 14, 12, 36, 25, 8, 30, 3, 12, 7, 4, 10, 15, 12, 34, 25, 26, 29, 14, 37, 23, 12, 19, 19, 3, 2, 31, 30, 11, 2, 24, 19, 27, 22, 13, 6, 18, 20, 6, 34, 33, 2, 37, 17, 30, 24, 2, 36, 9, 36, 19, 33, 35, 0, 4, 1]) >>> y_pred array([ 1, 10, 35, 7, 7, 29, 26, 3, 8, 23, 39, 11, 20, 4, 5, 23, 28, 30, 32, 18, 5, 39, 4, 25, 0, 24, 13, 21, 38, 19, 33, 33, 16, 20, 18, 27, 39, 20, 37, 17, 31, 29, 36, 7, 6, 24, 37, 22, 30, 0, 22, 11, 35, 30, 31, 14, 32, 21, 34, 38, 5, 11, 10, 6, 1, 14, 30, 36, 25, 8, 30, 3, 12, 7, 4, 10, 15, 12, 4, 22, 26, 29, 14, 37, 23, 12, 19, 19, 3, 25, 31, 30, 11, 25, 24, 19, 27, 22, 13, 6, 18, 20, 6, 39, 33, 9, 37, 17, 30, 24, 9, 36, 39, 36, 19, 33, 35, 0, 4, 1]) >>> metrics.f1_score(y_test, y_pred, average='weighted') C:UsersMichaelMiniconda3envssnowflakeslibsite-packagessklearnmetricsclassification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples. 'precision', 'predicted', average, warn_for) 0.87282051282051276 >>> metrics.f1_score(y_test, y_pred, average='weighted') 0.87282051282051276 >>> metrics.f1_score(y_test, y_pred, average='weighted') 0.87282051282051276

另外,为什么后面有一个“precision”、“predicted”、average、warn_for)错误消息?没有开括号,那么为什么它以闭括号结束呢?我在Windows 10的conda环境中使用Python 3.6.0运行sklearn 0.18.1。

我还查看了 ,我不知道是不是同一个bug。这个也没有解决方案

回答

正如注释中提到的,y_true中的一些标签没有出现在y_pred中。特别是在这种情况下,标签“2”从未被预测:

    >>> set(y_test) - set(y_pred) {2}

这意味着没有F-score来计算这个标签,因此本例的F-score被认为是0.0。由于您要求的是平均分,您必须考虑到计算中包含了0分,这就是为什么scikit-learn向您显示这个警告。

这让我看到你没有第二次看到错误。如前所述,这是一个警告,它与python中的错误处理方式不同。大多数环境中的默认行为是只显示一次特定的警告。这种行为可以改变:

    import warnings warnings.filterwarnings('always') # "error", "ignore", "always", "default", "module" or "once"

如果在导入其他模块之前设置此设置,那么每次运行代码时都会看到警告。

除了设置warning .filterwarnings(“忽略”)之外,无法避免第一次看到这个警告。您 可以做的是,确定您对未预测的标签的分数不感兴趣,然后显式地指定您 感兴趣的标签(这些标签至少被预测过一次):

    >>> metrics.f1_score(y_test, y_pred, average='weighted', labels=np.unique(y_pred)) 0.91076923076923078

在本例中没有显示警告。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
4

发表评论