Как объяснить дерево решений из scikit-learn
У меня есть две проблемы с пониманием результата дерева решений из scikit-learn. Например, это одна из моих деревьев решений:
Мой вопрос в том, как я могу использовать дерево?
Первый вопрос заключается в следующем: если образец удовлетворяет условию, он переходит в ветвь LEFT (если существует), в противном случае она будет ВПРАВО. В моем случае, если образец с X [7] > 63521.3984. Затем образец пойдет в зеленую коробку. Правильно?
Второй вопрос: когда образец достигает листа node, как я могу узнать, к какой категории он принадлежит? В этом примере у меня есть три категории для классификации. В красной рамке есть 91, 212 и 113 выборок, удовлетворяющих условию, соответственно. Но как я могу выбрать категорию?
Я знаю, что есть функция clf.predict(sample), чтобы рассказать о категории. Могу ли я сделать это из графика???
Большое спасибо.
Ответы
Ответ 1
Строка value
в каждом окне сообщает вам, сколько образцов в этом node попадает в каждую категорию по порядку. Поэтому в каждом поле цифры в value
складываются с номером, указанным в sample
. Например, в вашем красном поле 91 + 212 + 113 = 416. Таким образом, это означает, что если вы достигнете этого node, в категории 1, 212 в категории 2 было 91 пункт данных и 113 в категории 3.
Если вы собираетесь предсказать результат для новой точки данных, которая достигла этого листа в дереве решений, вы бы предсказали категорию 2, потому что это наиболее распространенная категория для образцов в node.
Ответ 2
Согласно книге "Learning scikit-learn: Machine Learning in Python", дерево решений представляет собой серию решений, основанных на данных обучения.
! (http://i.imgur.com/vM9fJLy.png)
Чтобы классифицировать экземпляр, мы должны ответить на вопрос в каждом node. Например, Is sex <= 0,5? (говорим ли мы о женщине?). Если да, вы переходите к левому дочернему элементу node в дереве; в противном случае вы перейдете к правильному дочернему элементу node. Вы продолжаете отвечать на вопросы (была ли она в третьем классе? Была ли она в первом классе?) И была ли она ниже 13 лет?), Пока вы не доберетесь до листа. Когда вы там, предсказание соответствует целевому классу, который имеет большинство экземпляров.
Ответ 3
Первый вопрос:
Да, ваша логика правильная. Левый node имеет значение True, а правый node - False. Это противоречит интуиции; true, как правило, означает меньшее значение.
Второй вопрос:
Эту проблему лучше всего разрешить, визуализируя дерево как график с pydotplus.
Атрибут 'class_names' для tree.export_graphviz() добавит объявление класса в класс большинства каждого node. Код выполняется в iPython.
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf2 = tree.DecisionTreeClassifier()
clf2 = clf2.fit(iris.data, iris.target)
with open("iris.dot", 'w') as f:
f = tree.export_graphviz(clf, out_file=f)
import os
os.unlink('iris.dot')
import pydotplus
dot_data = tree.export_graphviz(clf2, out_file=None)
graph2 = pydotplus.graph_from_dot_data(dot_data)
graph2.write_pdf("iris.pdf")
from IPython.display import Image
dot_data = tree.export_graphviz(clf2, out_file=None,
feature_names=iris.feature_names,
class_names=iris.target_names,
filled=True, rounded=True, # leaves_parallel=True,
special_characters=True)
graph2 = pydotplus.graph_from_dot_data(dot_data)
## Color of nodes
nodes = graph2.get_node_list()
for node in nodes:
if node.get_label():
values = [int(ii) for ii in node.get_label().split('value = [')[1].split(']')[0].split(',')];
color = {0: [255,255,224], 1: [255,224,255], 2: [224,255,255],}
values = color[values.index(max(values))]; # print(values)
color = '#{:02x}{:02x}{:02x}'.format(values[0], values[1], values[2]); # print(color)
node.set_fillcolor(color )
#
Image(graph2.create_png() )
![введите описание изображения здесь]()
Что касается определения класса на листе, ваш пример не имеет листьев с одним классом, как это делает набор данных диафрагмы. Это является общим и может потребовать переопределения модели для достижения такого результата. Дискретное распределение классов является лучшим результатом для многих перекрестно проверенных моделей.
Наслаждайтесь кодом!