python warnings.filterwarnings不会忽略来自'import sklearn.ensemble'的DeprecationWarning

时间:2018-09-07 14:38:04

标签: python scikit-learn suppress-warnings deprecation-warning

我正在尝试通过以下方法使DeprecationWarning静音。

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

但是,它仍然显示:

  

DeprecationWarning:numpy.core.umath_tests是一个内部NumPy模块,不应导入。它将在将来的NumPy版本中删除。     从numpy.core.umath_tests导入inner1d

为什么会发生这种情况,我该如何解决?

我正在python 3.6.6,numpy 1.15.0和scikit-learn 0.19.2上运行它,添加category=DeprecationWarning并没有帮助。

2 个答案:

答案 0 :(得分:2)

发生这种情况的原因是Scikit resets your DeprecationWarning filter when you import it

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

鬼S!

我发现的唯一解决方法是暂时禁止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)。

答案 1 :(得分:0)

不确定是否可行。但是我试图重新创建警告,但它已被静音,请尝试以下操作:

import logging
logging.captureWarnings(True)

根据docs“如果捕获为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