如何使用sklearn禁用ConvergenceWarning?

时间:2018-12-14 18:19:43

标签: scikit-learn warnings

我正在使用GridSearchCV优化SVM的超参数。我设置了最大迭代次数,因为我迫不及待要几个小时才能得到结果。我知道会有收敛警告。我只是 想忽略这些警告而不显示在终端中。

谢谢。

5 个答案:

答案 0 :(得分:2)

这很难找到答案,因为我看到的所有建议答案都行不通。最终对我有用的是示例代码Early stopping of Stochastic Gradient Descent

from sklearn.utils.testing import ignore_warnings
from sklearn.exceptions import ConvergenceWarning

然后您可以像这样对函数进行注释:

@ignore_warnings(category=ConvergenceWarning)
def my_function():
    # Code that triggers the warning

请注意,您无需直接从warnings导入任何内容。

我认为这很好,因为它只会在您需要的特定情况下而不是全局地抑制警告。

答案 1 :(得分:1)

我将在这里远射。

您没有提供足够的信息。您刚刚提到您正在使用SVM,但没有使用哪种类型的SVM,因为它有许多实现,例如SVCNuSVCLinearSVC。这些不同的类型具有不同的属性。

为什么要护理?因为其中有些支持/接受并行执行任务,例如LinearSVC

with warnings.catch_warnings():
    warnings.filterwarnings("ignore", category=ConvergenceWarning)

上面的代码(或它的其他变体)应该可以完成这项工作,但是如果它是并行运行的,那么它只会在第一次运行/迭代时就可以做到(我不太清楚为什么会这样做,但是似乎每一项工作具有自己的Pythonic配置,就好像它是新实例一样!)


此外,您提到您正在使用同时具有GridSearchCV参数的n_job。其Scikit文档说:

  

要并行运行的作业数。除非在   joblib.parallel_backend上下文。 -1表示使用所有处理器

joblib.parallel_backend表示在估算器或任何按定义的配置中设置的作业数量。


摘要

并行运行作业可能是未取消显示警告的原因。需要来自OP的更多信息。


编辑

我再次检查了它,确实使用了GridSearchCV版本{strong> 0.20.3 和 low scikit-learn 在抑制警告的同时会导致以下结果:

  1. max_iter + SVC or LinearSVC无法抑制警告。
  2. GridSearchCV(n_jobs=-1 or >1) + SVC or LinearSVC:抑制警告成功
  3. GridSearchCV(n_jobs=None or 1) + LogisticRegression(n_jobs=-1, solver='sag')无法抑制警告。
  4. GridSearchCV(n_jobs=None or 1 or >1 or -1) + LogisticRegression(n_jobs=1, solver='sag')无法抑制警告。
  5. GridSearchCV(n_jobs=-1 or >1) + LogisticRegression(n_jobs=1, solver='sag'):抑制警告成功

如您所见,如果估算器支持多个作业,则无论GridSearchCV(n_jobs=None or 1)中的n_jobs=-1 or >1为何,设置n_jobs都不会抑制警告。另一方面,如果估算器不支持多作业,则在GridSearchCV中设置n_jobs=-1 or >1不会使警告抑制起作用,但是,设置GridSearchCV会使它起作用。

重要提示

这是我在n_jobs=None or 1版本 0.20.3 中发现的,但是,我在另一台scikit-learn版本 0.19.2 的笔记本电脑上尝试了strong>和抑制警告始终有效,无论如何!我检查了scikit-learn的GitHub存储库,并注意到自{0.19.2版本以来,有关scikit-learn的一些提交,但是我不确定是否存在导致上述行为的真正更改/更新!您可能要在那打开一张票,并参考以上结果。


更新

我可以禁止所有joblib警告的唯一方法是在模块的开头发出以下代码。 (但请注意,这将禁止所有警告,包括您的警告-我需要这样做,因为我已将日志保存到数据库中):

Scikit-learn

答案 2 :(得分:0)

尝试一下:

from warnings import filterwarnings
filterwarnings('ignore')

答案 3 :(得分:0)

这对我有用:

来自sklearn.exceptions的

导入ConvergenceWarning ConvergenceWarning('ignore')

答案 4 :(得分:0)

为了控制Python警告,您可以使用警告库。 请参阅详细的documentation here。 因此,您可以使用warning.simplefilter()方法,如下所示:

Dim logo As Picture
Set logo = ThisWorkbook.Sheets("Sheet1").Pictures("Picture1")