65
votes

I would like to ignore warnings from all packages when I am teaching, but scikit-learn seems to work around the use of the warnings package to control this. For example:

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    from sklearn import preprocessing

/usr/local/lib/python3.5/site-packages/sklearn/utils/fixes.py:66: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() instead
  if 'order' in inspect.getargspec(np.copy)[0]:
/usr/local/lib/python3.5/site-packages/sklearn/utils/fixes.py:358: DeprecationWarning: inspect.getargspec() is deprecated, use inspect.signature() instead
  if 'exist_ok' in inspect.getargspec(os.makedirs).args:

Am I using this module incorrectly, or is sklearn doing something its not supposed to?

2
This issue is different from the one in the post mentioned by @San, and it is not a duplicate as marked above A correct answer is given below by @joshterrell805 - it is a sklearn issue: they force deprecation warnings - davalo
@suever: this is not a duplicate. This was indeed a scikit-learn specific issue. In scikit-learn 0.22, the issue will be fixed as scikit-learn will no longer reconfigure the warning filters and instead always issue FutureWarnings that can be override by custom filters: github.com/scikit-learn/scikit-learn/pull/15080 - ogrisel
As mentioned by @ogrisel , the answers here are now outdated starting from version 0.22 (December 2019). Scikit-learn uses FutureWarning now, you can read more details in the link above and here - Niourf
from warnings import filterwarnings filterwarnings("ignore") - Ashish Anand
What I have considered is to use your execution environment to redirect the warning. For example, if I kick off from Eclipse, just have stderr sent elsewhere, a file perhaps, and then I don't have to deal with it. Fighting with scikit-learn for me seems to be a losing battle - demongolem

2 Answers

88
votes

It annoys me to the extreme that sklearn forces warnings.

I started using this at the top of main.py:

def warn(*args, **kwargs):
    pass
import warnings
warnings.warn = warn

#... import sklearn stuff...
70
votes

They have changed their warning policy in 2013. You can ignore warnings (also specific types) with something like this:

import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)

//EDIT: in the comments below, Reed Richards points out that the filterwarnings call needs to be in the file that calls the function that gives the warning. I hope this helps those who experienced problems with this solution.