sklearn没有属性'datasets'

时间:2017-01-04 15:34:15

标签: python python-3.x machine-learning scikit-learn

我已经开始使用sckikit-learn来完成我的工作。所以我通过tutorial给出了加载一些数据集的标准程序:

$ 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 个答案:

答案 0 :(得分:26)

sklearnpackageThis answer非常简洁地说:

  

导入包时,只能直接看到该包的__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'>

是通过执行datasets加载子包from sklearn import datasets时,它会自动添加到包sklearn的命名空间中。这是鲜为人知的"traps" of the Python import system之一。

另请注意,如果您查看__init__.py for 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'>

最后一点需要注意的是,如果您检查sklearndatasets,您会看到,虽然它们是包,但其类型为module。这是因为所有包都被视为模块 - 但是,并非所有模块都是包。