Подтвердить что ты не робот

Как объяснить дерево решений из scikit-learn

У меня есть две проблемы с пониманием результата дерева решений из scikit-learn. Например, это одна из моих деревьев решений:

enter image description here Мой вопрос в том, как я могу использовать дерево?

Первый вопрос заключается в следующем: если образец удовлетворяет условию, он переходит в ветвь LEFT (если существует), в противном случае она будет ВПРАВО. В моем случае, если образец с X [7] > 63521.3984. Затем образец пойдет в зеленую коробку. Правильно?

Второй вопрос: когда образец достигает листа node, как я могу узнать, к какой категории он принадлежит? В этом примере у меня есть три категории для классификации. В красной рамке есть 91, 212 и 113 выборок, удовлетворяющих условию, соответственно. Но как я могу выбрать категорию? Я знаю, что есть функция clf.predict(sample), чтобы рассказать о категории. Могу ли я сделать это из графика??? Большое спасибо.

4b9b3361

Ответ 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() ) 

введите описание изображения здесь

Что касается определения класса на листе, ваш пример не имеет листьев с одним классом, как это делает набор данных диафрагмы. Это является общим и может потребовать переопределения модели для достижения такого результата. Дискретное распределение классов является лучшим результатом для многих перекрестно проверенных моделей.

Наслаждайтесь кодом!