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

新手上路,请多包涵

我收到这个奇怪的错误:

 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:\Users\Michael\Miniconda3\envs\snowflakes\lib\site-packages\sklearn\metrics\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)
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。 This SO post 也没有解决方案。

原文由 Sticky 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

如评论中所述, y_test 中的某些标签不会出现在 y_pred 中。特别是在这种情况下,永远不会预测标签“2”:

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

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

这使我无法第二次看到错误。正如我提到的,这是一个 _警告_,与 python 中的错误处理方式不同。大多数环境中的默认行为是只显示一次特定警告。这种行为可以改变:

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

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

除了设置 warnings.filterwarnings('ignore') 之外,没有办法避免第一次看到此警告。您 可以 做的是确定您对未预测的标签分数不感兴趣,然后明确指定 感兴趣的标签(至少预测过一次的标签):

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

警告将消失。

原文由 Shovalt 发布,翻译遵循 CC BY-SA 4.0 许可协议

当我训练我的分类模型时,同样的问题也发生在我身上。造成这个问题的原因是正如警告信息所说的“in labels with no predicated samples”,它会导致计算f1-score时除法为零。当我阅读 sklearn.metrics.f1_score 文档时,我找到了另一个解决方案,有如下注释:

当 true positive + false positive == 0 时,precision 未定义;当真阳性 + 假阴性 == 0 时,召回率未定义。在这种情况下,默认情况下,指标将设置为 0,f-score 也是如此,并且将引发 UndefinedMetricWarning。可以使用 zero_division 修改此行为

the zero_division default value is "warn" , you could set it to 0 or 1 to avoid UndefinedMetricWarning .它对我有用;)哦等等,当我使用 zero_division 时还有另一个问题,我的 sklearn 报告说使用 scikit-learn 0.21.3 没有这样的关键字参数。只需运行 pip install scikit-learn -U

原文由 petty.cf 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题