дерево решений, повторяющее имена классов

У меня есть очень простой образец данных/меток, проблема, с которой я сталкиваюсь, заключается в том, что сгенерированное дерево решений (pdf) повторяет имя класса:

from sklearn import tree
from sklearn.externals.six import StringIO  
import pydotplus

features_names = ['weight', 'texture']
features = [[140, 1], [130, 1], [150, 0], [110, 0]]
labels = ['apple', 'apple', 'orange', 'orange']

clf = tree.DecisionTreeClassifier()
clf.fit(features, labels)

dot_data = StringIO()
tree.export_graphviz(clf, out_file=dot_data, 
                         feature_names=features_names,  
                         class_names=labels,  
                         filled=True, rounded=True,  
                         special_characters=True,
                         impurity=False)

graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) 
graph.write_pdf("apples_oranges.pdf")

Полученный pdf выглядит так:

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

Итак, проблема довольно очевидна, это яблоко для обеих возможностей. Что я делаю не так?

Из DOCS:

список строк, bool или None, необязательный (по умолчанию=None)
Имена каждого из целевых классов в порядке возрастания номеров. Релевантно только для классификации и не поддерживается для нескольких выходных данных. Если True, показывает символическое представление имени класса.

«... в порядке возрастания» это не имеет для меня особого смысла, если я изменю kwarg на:

class_names=sorted(labels)

Результат тот же (очевидный в данном случае).


person Hula Hula    schedule 06.03.2018    source источник
comment
Имена классов буквально просто имена классов. Это не ярлыки для каждого примера. Итак, класс 0 — это «яблоко», а класс 1 — «апельсин», так что я думаю, вам просто нужно передать ['apple', 'orange']   -  person Ken Syme    schedule 06.03.2018
comment
Попробуйте class_names=unique(labels, 'stable')   -  person Dan    schedule 06.03.2018
comment
@KenSyme, спасибо, и я думаю, это должно быть отсортировано, верно? как sorted(set(labels)), потому что, если я этого не сделаю, он будет отображаться неправильно (переключен). Вы можете ответить вам, если хотите, я приму это как можно скорее   -  person Hula Hula    schedule 06.03.2018


Ответы (1)


Имена классов буквально просто имена классов. Это не ярлыки для каждого примера.

Итак, один класс — «яблоко», а другой — «апельсин», поэтому вам просто нужно передать ['apple', 'orange'].

Что касается порядка, чтобы обеспечить его правильную согласованность, вы можете использовать LabelEncoder, чтобы преобразовать вашу цель в целое число int_labels = labelEncoder.fit_transform(labels), используйте int_labels, чтобы соответствовать вашему дереву решений, затем используйте атрибут labelEncoder.classes_ для перехода в ваш график, а именно.

person Ken Syme    schedule 07.03.2018