python-3.x - python sklearn没有属性'datasets'


$ 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()



两种方法之间的区别是什么?

时间:

sklearn是一个包,它非常简洁:

导入包时,只有该包的variables/functions/classes文件中的__init__.py是直接可见的,不是子包或模块。

datasetssklearn的子包,这就是为什么会发生这种情况:


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



当通过执行以下操作加载子包datasetsfrom sklearn import datasets它会自动添加到包sklearn的命名空间,这是Python导入系统中鲜为人知的"陷阱"之一。

另外,请注意,如果查看sklearn__init__.py,将看到'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'>



...