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
. Это связано с тем, что все пакеты считаются модулями - однако не все модули являются пакетами.