sklearn не имеет атрибутов 'datasets'

я начал использовать sckikit-learn для своей работы. Итак, я проходил через учебник который дает стандартную процедуру для загрузки некоторых наборов данных:

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

однако для моего удобства я попытался загрузить данные следующим образом:

In [1]: import sklearn

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

однако это вызывает следующую ошибку:

---------------------------------------------------------------------------
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'

однако, если я использую подобный метод, видимо:

In [3]: from sklearn import datasets

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

Он работает без проблем. На самом деле следующие работает:

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

я совершенно запутался в этом. Я упускаю что-то очень тривиальное? В чем разница между этими двумя подходами?

1 ответов


sklearn - это пакета. ответ об этом очень лаконично:

при импорте пакета, только переменные/функции/классы __init__.py файл этого пакета непосредственно виден, а не субпакеты или модули.

datasets суб-пакет sklearn. Вот почему это происходит:

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'

однако, причина, почему это работает:

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'>

это когда вы загружаете субпакет datasets делать from sklearn import datasets он автоматически добавляется в пространство имен пакета sklearn. Это один из малоизвестных "ловушки" системы импорта Python.

кроме того, обратите внимание, что если вы посмотрите на __init__.py на sklearn вы будет посмотреть 'datasets' как член __all__, но это только позволяет вам делать:

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'>

последний момент, чтобы отметить, что если вы проверяете либо sklearn или datasets вы увидите, что, хотя они являются пакетами, их тип module. Это связано с тем, что все пакеты считаются модулями - однако не все модули являются пакетами.