web-dev-qa-db-fra.com

sklearn n'a pas d'attribut 'datasets'

J'ai commencé à utiliser sckikit-learn pour mon travail. Je parcourais donc le tutoriel qui donne la procédure standard pour charger certains jeux de données:

$ python
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()

Cependant, pour ma commodité, j'ai essayé de charger les données de la manière suivante:

In [1]: import sklearn

In [2]: iris = sklearn.datasets.load_iris()

Cependant, cela génère l'erreur suivante:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-2-db77d2036db5> in <module>()
----> 1 iris = sklearn.datasets.load_iris()

AttributeError: 'module' object has no attribute 'datasets'

Cependant, si j'utilise la méthode apparemment similaire:

In [3]: from sklearn import datasets

In [4]: iris = datasets.load_iris()

Cela fonctionne sans problème. En fait, ce qui suit fonctionne également:

In [5]: iris = sklearn.datasets.load_iris()

Je suis complètement confus à ce sujet. Suis-je en train de manquer quelque chose de très trivial? Quelle est la différence entre les deux approches?

19
Peaceful

sklearn est un package . Cette réponse l'a dit très succinctement:

lorsque vous importez un package, seules les variables/fonctions/classes du __init__.py Les fichiers de ce package sont directement visibles, pas les sous-packages ou modules.

datasets est un sous-package de sklearn. C'est pourquoi cela se produit:

In [1]: import sklearn

In [2]: sklearn.datasets
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-2-325a2bfc35d0> in <module>()
----> 1 sklearn.datasets

AttributeError: module 'sklearn' has no attribute 'datasets'

Cependant, la raison pour laquelle cela fonctionne:

In [3]: from sklearn import datasets

In [4]: sklearn.datasets
Out[4]: <module 'sklearn.datasets' from '/home/ethan/.virtualenvs/test3/lib/python3.5/site-packages/sklearn/datasets/__init__.py'>

est que lorsque vous chargez le sous-package datasets en faisant from sklearn import datasets il est automatiquement ajouté à l'espace de noms du package sklearn. C'est l'un des moins connus "pièges" du système d'importation Python .

Notez également que si vous regardez le __init__.py pour sklearn vous verrez voir 'datasets' en tant que membre de __all__ , mais cela ne vous permet que de faire:

In [1]: from sklearn import *
In [2]: datasets
Out[2]: <module 'sklearn.datasets' from '/home/ethan/.virtualenvs/test3/lib/python3.5/site-packages/sklearn/datasets/__init__.py'>

Un dernier point à noter est que si vous inspectez sklearn ou datasets, vous verrez que, bien qu'il s'agisse de packages, leur type est module. En effet, tous les packages sont considérés comme des modules. Cependant, tous les modules ne sont pas des packages.

30
elethan