Как отключить ConvergenceWarning с помощью sklearn? - PullRequest
0 голосов
/ 14 декабря 2018

Я использую GridSearchCV для оптимизации гиперпараметров для SVM.Я установил максимальное количество итераций, потому что не могу ждать несколько часов, чтобы получить результат.Я знаю, что будут предупреждения сходимости.Я просто хочу игнорировать эти предупреждения и не показываться в терминале.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 09 апреля 2019

Здесь я сделаю длинный выстрел.

Вы не предоставили достаточно информации.Вы только что упомянули, что используете SVM, но не какой тип SVM, так как существует много его реализаций, таких как SVC, NuSVC и LinearSVC.Эти разные типы имеют разные свойства.

Зачем заботиться?потому что некоторые из них поддерживают / принимают выполнение заданий в параллельно , таких как LinearSVC one!

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

Приведенный выше код (или другие его варианты) должен выполнять эту работу, ноесли он работает параллельно, он будет работать только в самом первом запуске / итерации (я не совсем уверен, почему, но кажется, что каждое задание имеет свою собственную конфигурацию Pythonic, как будто это новый экземпляр или что-то еще!)


Кроме того, вы упомянули, что используете GridSearchCV, который также имеет параметр n_job.Его Scikit Документация гласит:

Количество заданий для параллельного запуска.None означает 1, если только в контексте joblib.parallel_backend.-1 означает использование всех процессоров

joblib.parallel_backend означает, какое количество заданий задано в оценщике или любых заданных конфигурациях.


Сводка

Параллельное выполнение заданий может стать причиной не подавления предупреждений.Требуется больше информации от OP.


РЕДАКТИРОВАТЬ

Я проверил это снова, и действительно, используя GridSearchCV с scikit-learn версией 0.20.3 и низким 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): Успешно в подавлении предупреждений.

Как видите, если оценщик поддерживает многозадачность, настройка n_jobs=-1 or >1 не будет подавлять предупреждения независимо от n_jobs в GridSearchCV.С другой стороны, если оценщик не поддерживает многозадачность, установка n_jobs=-1 or >1 в GridSearchCV не сделает работу по подавлению предупреждений, однако установка n_jobs=None or 1 сделает ее работу.

Важное примечание

Это то, что я нашел с scikit-learn версией 0.20.3 , тем не менее, я попробовал это на своем другом ноутбуке с scikit-learn версией 0.19.2 и подавление предупреждений работало всегда, независимо!Я проверил scikit-learn GitHub репозиторий и заметил некоторые коммиты по поводу joblib начиная с версии 0.19.2, но я не уверен, было ли реальное изменение / обновление, которое вызвало вышеуказанное поведение!Вы можете открыть тикет там и обратиться к вышеупомянутым результатам.


ОБНОВЛЕНИЕ

Единственный способ, которым я мог бы подавить все предупреждения Scikit-learn, - это ввести следующий код в начале модуля.(но учтите, что все предупреждения, включая ваше, будут подавлены - мне это нужно, потому что у меня есть журналы, сохраненные в базе данных):

if not sys.warnoptions:
    warnings.simplefilter("ignore")
    os.environ["PYTHONWARNINGS"] = "ignore" # Also affect subprocesses
0 голосов
/ 27 июня 2019

Это было трудно отследить, так как все предложенные ответы, которые я видел, просто не работают.В конечном итоге у меня сработал пример кода Ранняя остановка 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.

Я думаю, что это довольно хорошо, поскольку он будет подавлять предупреждения только в конкретном случае, где вам это нужно, а не глобально.

0 голосов
/ 15 декабря 2018

Попробуйте это:

from warnings import filterwarnings
filterwarnings('ignore')
...