2017-01-04 23 views
7

Zacząłem używać sckikit-learn dla mojej pracy. Więc ja jechałem przez tutorial co daje standardową procedurę, aby załadować kilka zestawów danych:sklearn nie ma atrybutu 'datasets'

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

Jednak dla mojej wygody, starałem ładowania danych w następujący sposób:

In [1]: import sklearn 

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

Jednak ta rzuca następujący błąd:

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

Jednakże, jeśli mogę użyć pozornie podobną metodę:

In [3]: from sklearn import datasets 

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

Działa bez problemu. W rzeczywistości działa również:

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

Jestem całkowicie zdezorientowany na ten temat. Czy brakuje mi czegoś bardzo trywialnego? Jaka jest różnica między tymi dwoma podejściami?

+0

spróbuj 'sudo pip install --upgrade sklearn' – DaveQ

+0

@DaveQ: To nie pomoże. W każdym razie mam 0.18.1 – Peaceful

Odpowiedz

12

sklearn to package. This answer że to bardzo zwięźle

when you import a package, only variables/functions/classes in the __init__.py file of that package are directly visible, not sub-packages or modules.

datasets jest podgrupą pakiet sklearn. To dlaczego tak się dzieje:

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' 

Jednak powód to działa:

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

jest to, że podczas ładowania sub-pakiet datasets wykonując from sklearn import datasets ono automatycznie dodawane do nazw z pakiet sklearn. Jest to jeden z mniej znanych "traps" of the Python import system.

Należy również pamiętać, że jeśli spojrzeć na __init__.py for sklearn ty będzie zobaczyć 'datasets' jako członek __all__, ale to tylko pozwala zrobić:

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

ostatnia uwaga jest taka, że ​​jeśli sprawdź albo sklearn lub datasets zobaczysz, że chociaż są to paczki, ich typ to module. Dzieje się tak, ponieważ wszystkie pakiety są uważane za moduły - jednak nie wszystkie moduły są pakietami.

+0

Tyle się nauczyć! Dzięki :) – Peaceful