2017-01-04 6 views
7

Ich habe begonnen, sckikit-learn für meine Arbeit zu verwenden. So wurde ich durch die tutorial gehen, die Standardverfahren gibt einige Datensätze zu laden:sklearn hat kein Attribut 'Datasets'

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

Doch für meine Bequemlichkeit, habe ich versucht, die Daten auf folgende Weise geladen:

In [1]: import sklearn 

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

Dies ist jedoch wirft folgende Fehlermeldung:

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

Allerdings, wenn ich verwende, um die scheinbar ähnliche Methode:

In [3]: from sklearn import datasets 

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

Es funktioniert ohne Problem. Tatsächlich funktioniert das Folgende auch:

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

Ich bin völlig verwirrt darüber. Fehle ich etwas sehr Triviales? Was ist der Unterschied zwischen den beiden Ansätzen?

+0

versuchen 'sudo pip installieren --upgrade sklearn' – DaveQ

+0

@DaveQ: Das hilft nicht. Jedenfalls habe ich 0.18.1 – Peaceful

Antwort

12

sklearn ist ein package. This answer gesagt, es sehr kurz und bündig:

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 ist ein Teilpaket von sklearn. Dies ist, warum dies geschieht:

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' 

jedoch der Grund, warum dies funktioniert:

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

ist, dass, wenn Sie das Unterpaket von datasets laden from sklearn import datasets tut es automatisch in den Namensraum der hinzugefügt wird Paket sklearn. Dies ist einer der weniger bekannten "traps" of the Python import system.

Beachten Sie auch, dass, wenn Sie die __init__.py for sklearn sehen Sie wird'datasets' als Mitglied __all__ sehen, aber das können Sie nur tun:

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

Ein letzter Punkt ist, dass, wenn Sie Inspect entweder sklearn oder datasets Sie sehen, dass, obwohl sie Pakete sind, ist ihr Typ module. Dies liegt daran, dass alle Pakete als Module betrachtet werden - jedoch sind nicht alle Module Pakete.

+0

So viel zu lernen! Vielen Dank :) – Peaceful

Verwandte Themen