Как найти атрибуты, на которые разбивается дерево, при использовании scikit-learn?

Я изучаю scikit-learn, принимая деревья решений с критериями разделения энтропии и gini и исследуя различия.

Мой вопрос: как я могу "открыть капюшон" и выяснить, какие атрибуты деревьев расщепляются на каждом уровне вместе со связанными с ними информационными значениями, чтобы я мог видеть, где два критерия делают разные варианты?

До сих пор я изучил 9 методов, описанных в документации. Они, похоже, не позволяют получить доступ к этой информации. Но, безусловно, эта информация доступна? Я предвижу список или dict, у которого есть записи для node и получения.

Спасибо за вашу помощь и мои извинения, если я пропустил что-то совершенно очевидное.

Ответ 1

Непосредственно из документации (http://scikit-learn.org/0.12/modules/tree.html):

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

В вашем дереве решений есть также атрибут 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

для более подробной информации смотрите исходный код метода экспорта

В общем случае вы можете использовать модуль inspect

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

чтобы получить все элементы объекта

Decision tree visualization from sklearn docs

Ответ 2

Если вам просто нужен быстрый взгляд на то, что происходит в дереве, попробуйте:

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 вместе содержат порядок расщепления (каждый из них будет соответствовать стрелке в визуализации графика).