私はscikit-learnを調査し、エントロピーとジニの両方の分割基準を使用して意思決定ツリーを作成し、違いを調査しています。
私の質問は、どのように「フードを開き」、各レベルでツリーがどの属性に分割されているのか、関連する情報値とともに正確に見つけることができるので、2つの基準が異なる選択をする場所を見ることができますか?
これまで、ドキュメントに概説されている9つの方法を検討しました。彼らはこの情報へのアクセスを許可していないようです。しかし、確かにこの情報にはアクセスできますか?ノードとゲインのエントリを含むリストまたは辞書を想定しています。
完全に明らかな何かを見逃してしまった場合、あなたの助けと謝罪をありがとう。
ドキュメントから直接( 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_ ) )
オブジェクトのすべての要素を取得する
ツリーで何が起こっているかを簡単に確認したい場合は、以下を試してください。
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ビジュアライゼーションの矢印に対応します)。
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