python warnings.filterwarnings не игнорирует DeprecationWarning из 'import sklearn.ensemble' - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь отключить предупреждение об устаревании с помощью следующего метода.

import warnings
warnings.filterwarnings(action='ignore')
from sklearn.ensemble import RandomForestRegressor

Тем не менее, он по-прежнему показывает:

DeprecationWarning: numpy.core.umath_tests является внутренним модулем NumPy и не должен импортироваться. Он будет удален в будущем выпуске NumPy. из numpy.core.umath_tests import inner1d

Почему это происходит и как я могу это исправить?

Я запускаю это на python 3.6.6, numpy 1.15.0 и scikit-learn 0.19.2, и добавление category=DeprecationWarning не помогло.

Ответы [ 2 ]

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

Не уверен, что это сработает. Но я попытался воссоздать предупреждение, и оно было отключено, поэтому попробуйте следующее:

import logging
logging.captureWarnings(True)

В соответствии с документами"Если перехват выполнен как True, предупреждения, выданные модулем предупреждений, будут перенаправлены в систему ведения журнала."

Вот что я сделал:

import logging
import re
import warnings
logging.captureWarnings(True)
warnings.filterwarnings('always', category=DeprecationWarning,
                        module=r'^{0}\.'.format(re.escape(__name__)))
warnings.warn("This is a DeprecationWarning",category=DeprecationWarning)

Предупреждение не было брошено.

logging.captureWarnings(False)
warnings.warn("This is a DeprecationWarning",category=DeprecationWarning)

Выход:

.../ipython:2: DeprecationWarning: This is a DeprecationWarning
0 голосов
/ 24 декабря 2018

Причина, по которой это происходит, в том, что Scikit сбрасывает ваш фильтр DeprecationWarning при импорте :

# Make sure that DeprecationWarning within this package always gets printed
warnings.filterwarnings('always', category=DeprecationWarning,
                        module=r'^{0}\.'.format(re.escape(__name__)))

подлый!

Единственное исправление, которое я нашел, это временно отключить stderr:

import os
import sys
sys.stderr = open(os.devnull, "w")  # silence stderr
from sklearn.ensemble import RandomForestRegressor
sys.stderr = sys.__stderr__  # unsilence stderr

где sys.__stderr__ относится к фактическому stderr системы (в отличие от sys.stderr, который просто говорит Python, куда печатать stderr).

...