Может ли графвиз отображать горячо декодированные категориальные данные? - PullRequest
2 голосов
/ 12 марта 2019

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

Вот мои данные X со столбцами тезисов:

Категория,Размер, тип, рейтинг, жанр, количество версий

['ART_AND_DESIGN' '6000000+' 'Free' 'Everyone' 'Art & Design' '7']
['ART_AND_DESIGN' '6000000+' 'Бесплатно' 'Все' 'Искусство и дизайн' '2']
...
['FAMILY' '20000000+' 'Бесплатно' 'Все' 'Искусство и дизайн''13']

И мой пример кода:

X = self.df.drop(['Installs'], axis=1).values
y = self.df['Installs'].values

self.oheFeatures = OneHotEncoder(categorical_features='all')
EncodedX = self.oheFeatures.fit_transform(X).toarray()

self.oheY = OneHotEncoder()
EncodedY = self.oheY.fit_transform(y.reshape(-1,1)).toarray()

self.X_train, self.X_test, self.y_train, self.y_test = train_test_split(EncodedX, EncodedY, test_size=0.25, random_state=33)

clf = DecisionTreeClassifier(criterion='entropy', min_samples_leaf=100)
clf.fit(self.X_train, self.y_train)

tree.export_graphviz(clf, out_file=None, 
            feature_names=self.oheFeatures.get_feature_names(),
            class_names=self.oheY.get_feature_names(),
            filled=True, 
            rounded=True,  
            special_characters=True)  

Dot_data = tree.export_graphviz(clf, out_file=None) 
    graph = graphviz.Source(dot_data) 
    graph.render("applications") 

Но когда я пытаюсь визуализировать выходной результат, я получаю дерево решений закодированных данных:

output from graphviz

Есть ли способ, чтобы графвиз отображал "декодированные" данные вместо этого?

Спасибо!

1 Ответ

1 голос
/ 13 марта 2019

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

Что вынеобходимо помнить:

  • Ваше дерево ничего не "знает" ни о каких декодированных данных;Насколько это возможно, единственными фактическими данными являются закодированные в горячем виде
  • Graphviz не делает ничего, кроме простого отображения древовидной структуры

Учитывая вышеизложенное, вы можетев состоянии увидеть, что, хотя ваш запрос звучит действительно значимым и понимается как нужная особенность с точки зрения «бизнеса», служащего интерпретации дерева (в конце концов, одним из больших преимуществ древовидных моделей является именно их интерпретируемость), проблемаявляется весьма нетривиальным с точки зрения программирования (что на самом деле является SO): он даже не имеет ничего общего с Graphviz, в частности - проблема возникает, даже если мы хотим напечатать дерево вформа правил, и все это связано с выбором дизайна, сделанным scikit-learn для построения дерева.

Признаюсь, когда я впервые услышал об этом, я сам был удивлен, узнавчто деревья решений в scikit-learn не могут напрямую обрабатывать категориальные переменныеs (см. обсуждение в Может ли sklearn DecisionTreeClassifier действительно работать с категориальными данными? и все еще открытым Github выпуском по теме).И причина, по которой я был удивлен, заключается в том, что я знал, что, конечно, это не единственный доступный выбор дизайна: я пришел из R-фона, и я знал, что в R вполне возможно вписать деревья с категориальными характеристиками без необходимостигорячее кодирование;Вот пример :

enter image description here

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

...