我试图让Graphviz显示我的oneHotEncoded分类数据,但我不能让它工作。
以下是我的X数据和这些列:
Category, Size, Type, Rating, Genre, Number of versions
['ART_AND_DESIGN' '6000000+' 'Free' 'Everyone' 'Art & Design' '7']
['ART_AND_DESIGN' '6000000+' 'Free' 'Everyone' 'Art & Design' '2']
...
['FAMILY' '20000000+' 'Free' 'Everyone' 'Art & Design' '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")
但是当我尝试可视化输出结果时,我得到了编码数据的决策树:
有没有办法让graphviz显示“解码”的数据呢?
发布于 2020-09-13 10:47:55
@desertnaut是正确的,没有快速简单的方法来做到这一点,因为sklearn中的模型将二进制伪变量与任何其他实值功能完全相同地对待。
但是,至少在您的简单情况下(其中所有功能都是一次性编码的),这并不是很难实现。首先,您可以向get_feature_names
提供input_feature_names
,以便功能名称比X[34]
更有用。接下来,export_graphviz
的输出是点代码,它是人类可读的,因此也是人类可编辑的。在像您这样的小示例中,您可以完全手工完成;在较大的示例中,您可能希望使用regex替换或类似的东西。
我将a notebook放在一起来演示这一点,一次是在非常简单的情况下,一次是在稍微复杂的情况下。我考虑过修补export_graphviz
方法的某些部分,但最终只是在事后修改了点代码。当sklearn完成对保留特征名称的方法的决定和实现(或者至少完成了对所有转换器的get_feature_names
方法的充实)时,第二个示例应该适用于更复杂的转换器管道/组合。
https://stackoverflow.com/questions/55129963
复制相似问题