【发布时间】:2019-05-16 00:49:20
【问题描述】:
我正在使用 GridSearchCV 来优化 SVM 的超参数。我设置了最大迭代次数,因为我等不及几个小时才能得到结果。我知道会有收敛警告。我只是 想要忽略这些警告并且不显示在终端中。
提前致谢。
【问题讨论】:
标签: python scikit-learn warnings
我正在使用 GridSearchCV 来优化 SVM 的超参数。我设置了最大迭代次数,因为我等不及几个小时才能得到结果。我知道会有收敛警告。我只是 想要忽略这些警告并且不显示在终端中。
提前致谢。
【问题讨论】:
标签: python scikit-learn warnings
这对我有用:
from sklearn.exceptions import ConvergenceWarning
ConvergenceWarning('ignore')
【讨论】:
为了控制 Python 警告,您可以使用 警告库。 详见documentation here。 所以你可以使用warning.simplefilter()方法如下:
from warnings import simplefilter
from sklearn.exceptions import ConvergenceWarning
simplefilter("ignore", category=ConvergenceWarning)
【讨论】:
这很痛苦,因为我看到的所有建议答案都不起作用。最终对我有用的是示例代码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 导入任何内容。
我认为这非常好,因为它只会在您需要它的特定情况下抑制警告,而不是全局。
【讨论】:
testing 代码有点味道,但是......好吧......
我会在这里长篇大论。
您没有提供足够的信息。您刚刚提到您使用的是SVM,但没有提到SVM 的类型,因为它有很多实现,例如SVC、NuSVC 和LinearSVC。这些不同的类型具有不同的属性。
为什么要关心?因为其中一些支持/接受并行执行作业,例如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 的更多信息。
我再次检查了它,确实,使用 GridSearchCV 和 scikit-learn 版本 0.20.3 和 low max_iter 同时抑制警告,导致以下结果:
SVC or LinearSVC + GridSearchCV(n_jobs=-1 or >1):失败抑制警告。SVC or LinearSVC + GridSearchCV(n_jobs=None or 1):成功抑制警告。LogisticRegression(n_jobs=-1, solver='sag') + GridSearchCV(n_jobs=None or 1 or >1 or -1):未能抑制警告。LogisticRegression(n_jobs=1, solver='sag') + GridSearchCV(n_jobs=-1 or >1):未能抑制警告。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 和并行处理的出色发现,让我很难过。
RandomizedSearchCV 和GridSearchCV 和njobs>1 警告的答案!为了专门禁用警告,我将最后一行更改为:os.environ["PYTHONWARNINGS"] = ('ignore::UserWarning,ignore::ConvergenceWarning,ignore::RuntimeWarning')。指定要忽略警告的模块也是一个不错的补充:`os.environ["PYTHONWARNINGS"] = 'ignore::ConvergenceWarning:sklearn.model_selection.RandomizedSearchCV'
试试这个:
from warnings import filterwarnings
filterwarnings('ignore')
【讨论】: