如何使用反变换(实际)值绘制Graphviz决策树?

4
我正在使用graphviz绘制分类决策树。
在拟合特征之前,我使用了“preprocessing.StandardScaler()”对它们进行缩放。
因此,当我绘制决策树时,它是基于“转换后的值”绘制的。
有没有一种方法可以在绘制之前将分类器“inverse_transform”,以便决策树绘制节点的实际值而不是转换后的值?
是的,我已经尝试过scale.inverse_transform(rf_clf) ....但是当然不起作用......
从sklearn.datasets中导入数据集。
iris = datasets.load_iris()

从字典创建数据框

species = [iris.target_names[x] for x in iris.target]
iris = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris['Species'] = species

转换为数组

Features = np.array(iris[['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width']])

levels = {'setosa':0, 'versicolor':1, 'virginica':2}
Labels =  np.array([levels[x] for x in iris['Species']])

分割

nr.seed(1115)
indx = range(Features.shape[0])
indx = ms.train_test_split(indx, test_size = 100)
X_train = Features[indx[0],:]
y_train = np.ravel(Labels[indx[0]])
X_test = Features[indx[1],:]
y_test = np.ravel(Labels[indx[1]])

扩展:

scale = preprocessing.StandardScaler()
scale.fit(X_train)
X_train = scale.transform(X_train)

分类器拟合

rf_clf = tree.DecisionTreeClassifier() ###simple TREE
rf_clf.fit(X_train, y_train)*

使用Graphviz绘制决策树:

dot_data = tree.export_graphviz(rf_clf, out_file=None, 

             feature_names=['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'], 
             class_names=['setosa', 'versicolor', 'virginica'], 

                 filled=True, rounded=True,  
                 special_characters=True)

print(dot_data)

graph = graphviz.Source(dot_data)  
graph 

第一个节点的结果为“花瓣宽度≤0.53”,第二个节点为“花瓣长度≤-0.788”,这是实数的负数。

我更喜欢树上显示的真实值以英寸为单位...

1个回答

1
您可以遍历树并自己设置节点阈值的值。
如果您考虑此示例用于遍历树:https://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html#sphx-glr-auto-examples-tree-plot-unveil-tree-structure-py 当它说 print("%snode=%s test node: go to node %s if X[:, %s] <= %s else to node %s."...时,您可以重写阈值,并使用缩放器的inverse_transform函数进行测试特征。
transformed = np.empty(X_train.shape[1])
transformed[:] = np.nan
transformed[feature[i]] = threshold[i]
threshold[i] = scale.inverse_transform(transformed)[feature[i]]

你生成的点文件将包含更新后的值。但是,由于特征已经缩放,你将无法再使用树进行预测。
注意:阈值的值与不缩放时并不完全相同,我不确定缩放器是否应该对阈值产生影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接