在训练模型的过程中,我收到了这样的警告
我可以通过这样的调用更具体地触发它
from evalml.objectives import F1
f1 = F1()
f1.score(y_predicted=[0, 0],
y_true=[0, 1])
在处理方式上。 这是想到的
nan
或最差可能的指标替换分数。 也许我们然后将错误消息存储在结果字典中的某处是的,我们应该解决这个问题。 一般来说,除非我们的代码这样做,否则我们不应该允许任何东西被打印到标准输出。
我想知道这是否与#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那里