【问题标题】:how can I plot graphviz decision tree with inverse-transform (actual) values?如何绘制带有逆变换(实际)值的 graphviz 决策树?
【发布时间】:2019-09-29 16:42:26
【问题描述】:

我正在使用 graphviz 绘制分类决策树。

在适应功能之前,我使用“preprocessing.StandardScaler()”来缩放它们

因此,当我绘制决策树时,我会根据“转换后的值”来绘制它

有没有办法在绘制之前对分类器进行“inverse_trasform”,以便决策树绘制节点处的实际值而不是转换后的值?

是的,我已经尝试过 scale.inverse_transform(rf_clf) .... 但当然不要'tork...

从 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 

第一个节点的结果是“Petal_width

我希望树能以英寸为单位显示实际价值...

【问题讨论】:

    标签: python scikit-learn graphviz zscaler inverse-transform


    【解决方案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]]
    

    您生成的点文件将包含更新后的值。但是,您将无法再通过缩放特征使用树进行预测。

    注意:阈值与没有缩放的值不完全相同,我不确定缩放器是否应该对阈值产生这样的影响。

    【讨论】:

      猜你喜欢
      • 2018-02-09
      • 1970-01-01
      • 2017-10-09
      • 2018-07-05
      • 2016-03-12
      • 2016-09-20
      • 2020-08-19
      • 2017-01-01
      • 2017-02-21
      相关资源
      最近更新 更多