2017-04-11 7 views
-1

私はAdaboostをsklearnに混乱させようとしていますが、概念的には小さな違いを明確にしたかっただけです。パッケージとの混乱をインポート

私はthisスタックオーバーフローの記事を読んだ。私はまた、奇妙なインポートエラーでいくつかの他のスタック記事をあやふやにしました。しかし、私はまだこれらのコードスニペットの1つがなぜ機能するのか、他のブレークは混乱しています。

基本的には、sklearn.ensembleをインポートするさまざまな方法を使いこなしています。私はsklearnがパッケージであると考えていました。

import sklearn 
clf = sklearn.ensemble.AdaBoostClassifier 
AttributeError: 'module' object has no attribute 'ensemble' 

このエラーは、アンサンブルが属性ではないことを示しています。アンサンブル自体がパッケージなので、これは理にかなっていると思います。

このコードのスニップはも動作します:

import sklearn.ensemble 
clf = sklearn.ensemble.AdaBoostClassifier 

私の質問があり、区別は何ですか?パッケージをインポートする場合、そのスーパーパッケージ内のパッケージを参照するのは問題ありませんか?なぜこれは許されないでしょうか?私のドキュメントをリンクさせても構いませんが、見た目には最適な場所についてはわかりませんでした。

ありがとうございました!

+0

https://stackoverflow.com/questions/8899198/module-has-no-attributeの可能な複製 –

答えて

1

単独で使用する場合、importキーワードは常にモジュールではなく、パッケージが続いている:あなたはパッケージ内の生活をインポートするモジュールは、あなたがするドット表記を使用することができる場合

import my_module 

そのモジュールをインポート:

import my_package.my_module 

パッケージの名前はまた、そのパッケージ内__init__.pyモジュールの名前として使用することができるので、混乱が生じます。 import sklearnの場合、すべてのパッケージ内容はimportではなく、sklearn.__init__.pyモジュールのみです。したがって

import sklearn #imports the contents of sklearn.__init__.py 
import sklearn.ensemble # imports the contents of sklearn.ensemble.py 

ものをインポートする別の方法は、この場合、構築物

from <module> import <attributes> 

あり、同様のルールが適用される:fromキーボードは、モジュールではなく、パッケージが続きます。だから、その後、

from sklearn import an_awesome_function 

場合は、パッケージsklearnの一部であるモジュールsklearn.__init__.py、で定義されたan_awesome_functionをインポートしています。