Evalml: 抑制来自标准输出的 sklearn UndefinedMetric 警告(F1 分数)

创建于 2020-03-02  ·  6评论  ·  资料来源: alteryx/evalml

在训练模型的过程中,我收到了这样的警告

Screen Shot 2020-03-02 at 4 54 36 PM

我可以通过这样的调用更具体地触发它

from evalml.objectives import F1

f1 = F1()
f1.score(y_predicted=[0, 0],
         y_true=[0, 1])

在处理方式上。 这是想到的

  1. 在自动搜索过程中完全静音。 用nan或最差可能的指标替换分数。 也许我们然后将错误消息存储在结果字典中的某处
  2. 制作不占用多行的更清晰的警告消息
enhancement

所有6条评论

是的,我们应该解决这个问题。 一般来说,除非我们的代码这样做,否则我们不应该允许任何东西被打印到标准输出。

我想知道这是否与#311有关。

我认为我们应该执行您的两个建议:抑制此 sklearn stdout 输出,并在可能的情况下编写我们自己的警告消息。

@christopherbunn RE 您在会议中提到了这一点,是否应该将其标记为进行中?

@christopherbunn @jeremyliweishih我对此进行了更多阅读,我希望这里的解决方法是为我们所有的精度和 f1 目标(二进制和多类)设置zero_division=0.0

解释
精度n_true_pos / (n_true_pos + n_false_pos) 。 因此,如果模型从不预测有问题的数据拆分上的特定标签,则该标签不会有任何真或假阳性,因此将除以 0。 f1 也是如此。

争论
假设我们在平衡类方面做得很好(我们目前没有这样做,但这是一个单独的主题,#194 #457)。 如果是这样,则训练或验证拆分极不可能包含特定类的少数实例。 如果我们可以假设,并且模型仍然没有对特定标签进行预测,我会认为这是一个糟糕的模型,因此我们应该给它尽可能低的分数,对于精度和 f1 来说都是 0。

听起来不错?

例子

In [38]: import numpy as np

In [39]: import sklearn.metrics

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

In [41]: y_pred = np.array([0, 0, 0, 0, 0])

In [42]: sklearn.metrics.precision_score(y_true, y_pred)
/Users/dylan.sherry/.pyenv/versions/3.8.2/envs/evalml/lib/python3.8/site-packages/sklearn/metrics/_classification.py:1272: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, msg_start, len(result))
Out[42]: 0.0

In [43]: sklearn.metrics.precision_score(y_true, y_pred, zero_division=0.0)
Out[43]: 0.0

@dsherry对我来说很有意义。 我认为这就是我们现在正在做的事情,但也有警告(因为它默认为“警告”,设置为 0 并发布警告)

@jeremyliweishih是的!

@christopherbunn那里

此页面是否有帮助?
0 / 5 - 0 等级