web-dev-qa-db-ja.com

scikit-learnを使用しているときに、ツリーがどの属性に分割されているかを見つけるにはどうすればよいですか?

私はscikit-learnを調査し、エントロピーとジニの両方の分割基準を使用して意思決定ツリーを作成し、違いを調査しています。

私の質問は、どのように「フードを開き」、各レベルでツリーがどの属性に分割されているのか、関連する情報値とともに正確に見つけることができるので、2つの基準が異なる選択をする場所を見ることができますか?

これまで、ドキュメントに概説されている9つの方法を検討しました。彼らはこの情報へのアクセスを許可していないようです。しかし、確かにこの情報にはアクセスできますか?ノードとゲインのエントリを含むリストまたは辞書を想定しています。

完全に明らかな何かを見逃してしまった場合、あなたの助けと謝罪をありがとう。

39
Matt O'Brien

ドキュメントから直接( http://scikit-learn.org/0.12/modules/tree.html ):

from io import StringIO
out = StringIO()
out = tree.export_graphviz(clf, out_file=out)

StringIOモジュールはPython3でサポートされなくなり、代わりにioモジュールをインポートします。

また、決定ツリーオブジェクトにはtree_属性があり、構造全体に直接アクセスできます。

そして、あなたは単にそれを読むことができます

clf.tree_.children_left #array of left children
clf.tree_.children_right #array of right children
clf.tree_.feature #array of nodes splitting feature
clf.tree_.threshold #array of nodes splitting points
clf.tree_.value #array of nodes values

詳細については exportメソッドのソースコード をご覧ください。

一般に、inspectモジュールを使用できます

from inspect import getmembers
print( getmembers( clf.tree_ ) )

オブジェクトのすべての要素を取得する

Decision tree visualization from sklearn docs

32
lejlot

ツリーで何が起こっているかを簡単に確認したい場合は、以下を試してください。

Zip(X.columns[clf.tree_.feature], clf.tree_.threshold, clf.tree_.children_left, clf.tree_.children_right)

xは独立変数のデータフレームであり、clfは決定木オブジェクトです。 clf.tree_.children_leftおよびclf.tree_.children_rightには、分割が行われた順序が含まれます(これらはそれぞれ、graphvizビジュアライゼーションの矢印に対応します)。

11
Daniel Gibson

Scikit Learnは、バージョン0.21(2019年5月)でexport_textと呼ばれるおいしい新しいメソッドを導入して、ツリーのすべてのルールを表示します。 ドキュメントはこちら

モデルを作成したら、2行のコードが必要です。まず、export_textをインポートします。

from sklearn.tree.export import export_text

次に、ルールを含むオブジェクトを作成します。ルールを読みやすくするには、feature_names引数を使用して、機能名のリストを渡します。たとえば、モデルの名前がmodelで、機能の名前がX_trainというデータフレームで指定されている場合、tree_rulesというオブジェクトを作成できます。

tree_rules = export_text(model, feature_names=list(X_train))

次に、tree_rulesを印刷または保存します。出力は次のようになります。

|--- Age <= 0.63
|   |--- EstimatedSalary <= 0.61
|   |   |--- Age <= -0.16
|   |   |   |--- class: 0
|   |   |--- Age >  -0.16
|   |   |   |--- EstimatedSalary <= -0.06
|   |   |   |   |--- class: 0
|   |   |   |--- EstimatedSalary >  -0.06
|   |   |   |   |--- EstimatedSalary <= 0.40
|   |   |   |   |   |--- EstimatedSalary <= 0.03
|   |   |   |   |   |   |--- class: 1
0
yzerman