Есть ли способ визуализировать дерево решений (sklearn) с категориальными функциями, объединенными из одной функции с горячим кодированием?

Вот ссылка на файл .csv. Это классический набор данных, на котором можно попрактиковаться в деревьях решений!

import pandas as pd
import numpy as np
import scipy as sc
import scipy.stats
from math import log
import operator

df = pd.read_csv('tennis.csv')

target = df['play']
target.columns = ['play']
features_dataframe = df.loc[:, df.columns != 'play']

Здесь начинается моя головная боль

features_dataframe = pd.get_dummies(features_dataframe) 
features_dataframe.columns

Я выполняю одно горячее кодирование для столбцов моих функций (данных), хранящихся в features_dataframe, которые все категоричны, и распечатываю его, возвращает

Index(['windy', 'outlook_overcast', 'outlook_rainy', 'outlook_sunny',
   'temp_cool', 'temp_hot', 'temp_mild', 'humidity_high',
   'humidity_normal'],
  dtype='object')

Я понимаю, почему нужно выполнять одноразовое кодирование! sklearn не будет работать с категориальными столбцами.

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(target.values)

k = le.transform(target.values)

Приведенный выше код преобразует мой целевой столбец, хранящийся в target, который, по сути, имеет метки двоичных классов («да» и «нет»), в целое число, потому что sklearn не будет работать с категориями (УРА!)

и теперь, наконец, подбирая DecisionTreeClassifier, criterion = "entropy" - это то, что, как я предполагаю, использует концепцию ID3!

from sklearn import tree
from os import system

dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(features_dataframe, k)


dotfile = open("id3.dot", 'w')
tree.export_graphviz(dtree, out_file = dotfile, feature_names = features_dataframe.columns)
dotfile.close()

В файле id3.dot содержится необходимый код, который можно вставить на этот сайт, чтобы преобразовать код орграфа в правильно понятный визуализация!

Чтобы вы могли эффективно и легко мне помочь, я отправлю сюда код id3.dot!

digraph Tree {
node [shape=box] ;
0 [label="outlook_overcast <= 0.5\nentropy = 0.94\nsamples = 14\nvalue = [5, 9]"] ;
1 [label="humidity_high <= 0.5\nentropy = 1.0\nsamples = 10\nvalue = [5, 5]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="windy <= 0.5\nentropy = 0.722\nsamples = 5\nvalue = [1, 4]"] ;
1 -> 2 ;
3 [label="entropy = 0.0\nsamples = 3\nvalue = [0, 3]"] ;
2 -> 3 ;
4 [label="outlook_rainy <= 0.5\nentropy = 1.0\nsamples = 2\nvalue = [1, 1]"] ;
2 -> 4 ;
5 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1]"] ;
4 -> 5 ;
6 [label="entropy = 0.0\nsamples = 1\nvalue = [1, 0]"] ;
4 -> 6 ;
7 [label="outlook_sunny <= 0.5\nentropy = 0.722\nsamples = 5\nvalue = [4, 1]"] ;
1 -> 7 ;
8 [label="windy <= 0.5\nentropy = 1.0\nsamples = 2\nvalue = [1, 1]"] ;
7 -> 8 ;
9 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1]"] ;
8 -> 9 ;
10 [label="entropy = 0.0\nsamples = 1\nvalue = [1, 0]"] ;
8 -> 10 ;
11 [label="entropy = 0.0\nsamples = 3\nvalue = [3, 0]"] ;
7 -> 11 ;
12 [label="entropy = 0.0\nsamples = 4\nvalue = [0, 4]"] ;
0 -> 12 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}

Перейдите сюда и вставьте приведенный выше код орграфа, чтобы получить правильную визуализацию созданного дерева решений! Проблема здесь в том, что для больших деревьев и больших наборов данных будет так сложно интерпретировать из-за того, что одна функция с горячим кодированием отображается как имена функций, представляющие разбиение узлов!

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

Я имею в виду, есть ли способ создать визуализацию дерева решений, например это


person Community    schedule 25.10.2017    source источник
comment
Думаю, не в scikit. Вы можете попробовать другие библиотеки, которые могут обрабатывать категориальные данные как есть, например LightBGM, или инструменты, такие как Weka и R.   -  person Vivek Kumar    schedule 25.10.2017


Ответы (1)


Вероятно, проще просто не использовать One-Hot Encoding, а вместо этого использовать произвольные целочисленные коды для категорий конкретной функции.

Вы можете использовать pandas.factorize для категориальных переменных с целочисленным кодом.

person ogrisel    schedule 26.10.2017