【问题标题】:How to disable ConvergenceWarning using sklearn?如何使用 sklearn 禁用 ConvergenceWarning?
【发布时间】:2019-05-16 00:49:20
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: python scikit-learn warnings


    【解决方案1】:

    这对我有用:

    from sklearn.exceptions import ConvergenceWarning
    ConvergenceWarning('ignore')
    

    【讨论】:

    • 在 PyCharm 中不起作用。装饰器方法(第一个答案)对我有用。
    【解决方案2】:

    为了控制 Python 警告,您可以使用 警告库。 详见documentation here。 所以你可以使用warning.simplefilter()方法如下:

    from warnings import simplefilter
    from sklearn.exceptions import ConvergenceWarning
    simplefilter("ignore", category=ConvergenceWarning)
    

    【讨论】:

    • 这个答案很简单,为我解决了这个问题。
    【解决方案3】:

    这很痛苦,因为我看到的所有建议答案都不起作用。最终对我有用的是示例代码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 导入任何内容。

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

    【讨论】:

    • 似乎很有用,但是该函数可能应该命名为与 SVM 相关的名称,因为这是问题中的方法。
    • 在生产环境中导入testing 代码有点味道,但是......好吧......
    • 函数中的#触发警告的代码是什么意思,在计算使用sklearn坐标下降的估计器时,你能否举一个明确的例子来关闭收敛警告算法?
    • 请注意,“sklearn.utils.testing”自 0.22 起已弃用,并将在 0.24 中删除。似乎“sklearn.utils._testing”(注意额外的下划线)是现在要走的路——见scikit-learn.org/stable/auto_examples/linear_model/…
    • 在 2021 年,以下对我有用:stackoverflow.com/questions/29086398/…
    【解决方案4】:

    我会在这里长篇大论。

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

    为什么要关心?因为其中一些支持/接受并行执行作业,例如LinearSVC one!

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

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


    另外,您提到您正在使用GridSearchCV,它也有n_job 参数。它的Scikit 文档说:

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

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


    总结

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


    编辑

    我再次检查了它,确实,使用 GridSearchCVscikit-learn 版本 0.20.3low max_iter 同时抑制警告,导致以下结果:

    1. SVC or LinearSVC + GridSearchCV(n_jobs=-1 or >1)失败抑制警告。
    2. SVC or LinearSVC + GridSearchCV(n_jobs=None or 1)成功抑制警告。
    3. LogisticRegression(n_jobs=-1, solver='sag') + GridSearchCV(n_jobs=None or 1 or >1 or -1)未能抑制警告。
    4. LogisticRegression(n_jobs=1, solver='sag') + GridSearchCV(n_jobs=-1 or >1)未能抑制警告。
    5. LogisticRegression(n_jobs=1, solver='sag') + GridSearchCV(n_jobs=None or 1)成功抑制警告。

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

    重要提示

    这就是我在 scikit-learn 版本 0.20.3 中发现的,不过,我在另一台笔记本电脑上用scikit-learn 版本 0.19.2 进行了尝试并抑制无论如何,警告一直有效!我检查了 scikit-learn GitHub 存储库并注意到自 0.19.2 版以来关于 joblib 的一些提交,但我不确定是否存在导致上述行为的真正更改/更新!您可能想在那里开一张票并参考上述结果。


    更新

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

    if not sys.warnoptions:
        warnings.simplefilter("ignore")
        os.environ["PYTHONWARNINGS"] = "ignore" # Also affect subprocesses
    

    【讨论】:

    • n_jobs 和并行处理的出色发现,让我很难过。
    • 很好的答案!这是唯一有助于抑制RandomizedSearchCVGridSearchCVnjobs>1 警告的答案!为了专门禁用警告,我将最后一行更改为:os.environ["PYTHONWARNINGS"] = ('ignore::UserWarning,ignore::ConvergenceWarning,ignore::RuntimeWarning')。指定要忽略警告的模块也是一个不错的补充:`os.environ["PYTHONWARNINGS"] = 'ignore::ConvergenceWarning:sklearn.model_selection.RandomizedSearchCV'
    • 我不再收到警告消息。非常有帮助。谢谢@Yahya! @JE_Muc 也感谢您的宝贵意见。
    【解决方案5】:

    试试这个:

    from warnings import filterwarnings
    filterwarnings('ignore')
    

    【讨论】:

    • 我试过这个,还有 warnings.simplefilter("ignore"), warnings.simplefilter("ignore", category=ConvergenceWarning)。不好。
    • 你是在终端上运行它吗?
    • 是的,我在终端运行时也使用“-W ignore”
    • 我曾经通过更改源代码禁用了一个恼人的警告,不妨试试看。
    • 在 JupyterLab 为我工作。谢谢:)
    猜你喜欢
    • 2020-12-04
    • 2017-07-14
    • 2017-04-05
    • 2020-11-26
    • 2019-10-11
    • 2013-11-01
    • 2017-11-04
    • 2019-06-07
    • 2019-11-18
    相关资源
    最近更新 更多