-
-
Notifications
You must be signed in to change notification settings - Fork 26.5k
Description
Since scikit-learn 0.22, the dict_learning function is defined in sklearn/decomposition/_dict_learning.py and exposed as sklearn.decomposition.dict_learning in the sklearn/decomposition/__init__.py file.
At the same time we also have a sklearn/decomposition/dict_learning.py deprecated module for backward compat. This module is not imported by default in sklearn/decomposition/__init__.py to avoid deprecation warning.
So far so good. The problem is that if the users or a tool later import sklearn.decomposition.dict_learning (the deprecated module), then the symbol sklearn.decomposition.dict_learning points to the module instead of the function:
>>> from sklearn.decomposition import dict_learning
>>> type(dict_learning)
<class 'function'>
>>> import sklearn.decomposition.dict_learning
/home/ogrisel/code/scikit-learn/sklearn/utils/deprecation.py:144: FutureWarning: The sklearn.decomposition.dict_learning module is deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.decomposition. Anything that cannot be imported from sklearn.decomposition is now part of the private API.
warnings.warn(message, FutureWarning)
>>> from sklearn.decomposition import dict_learning
>>> type(dict_learning)
<class 'module'>This can happen (semi-randomly?) when running test discovery with pytest --pyargs sklearn from a non-source folder (without the scikit-learn conftest.py file) or when calling all_estimators() from scikit-learn.
Note that in 0.21.3 we did not have the problem because once the sklearn.decomposition.dict_learning module is imported once, it is cached, and therefore, sklearn.decomposition.dict_learning is always referring to the function.
We have the same problem for the sklearn.inspection.partial_dependence function / module.
I will open a PR with a possible fix.