解释决策树回归的Graphviz输出

我对Graphviz在回归任务中生成的决策树节点中的value字段感到好奇。我知道在决策树分类中,这个字段表示每个类别在分裂后所含样本的数量,但对于回归任务,我不确定它的含义是什么。

我的数据具有二维输入和十维输出。以下是我的回归问题中的树的示例:

enter image description here

使用以下代码生成并通过webgraphviz可视化

# X = (n x 2)  Y = (n x 10)  X_test = (m x 2)input_scaler = pickle.load(open("../input_scaler.sav","rb"))reg = DecisionTreeRegressor(criterion = 'mse', max_depth = 2)reg.fit(X,Y)pred = reg.predict(X_test)with open("classifier.txt", "w") as f:    f = tree.export_graphviz(reg, out_file=f)

回答:

回归树实际返回的输出是落在相应终端节点(叶子节点)的训练样本的因变量(此处为Y)的平均值;这些平均值在图中以value列表的形式显示,这里所有列表的长度均为10,因为您的Y是十维的。

换句话说,以您树的最左侧终端节点(叶子节点)为例:

  • 该叶子节点包含42个样本,这些样本满足X[0] <= 0.675X[1] <= 0.5
  • 这42个样本的十维输出的平均值在该叶子的value列表中显示,确实长度为10,即Y[0]的平均值为-152007.382Y[1]的平均值为-206040.675,依此类推,Y[9]的平均值为3211.487

您可以通过预测一些样本(来自您的训练集或测试集 – 这无关紧要)并检查您的十维结果是否是上述终端叶子节点中显示的4个value列表之一来确认这一点。

此外,您可以确认,对于value中的每个元素,子节点的加权平均值等于父节点的相应元素。再次以您的两个最左侧终端节点(叶子节点)的第一个元素为例,我们得到:

(-42*152007.382 - 56*199028.147)/98# -178876.39057142858

即它们的父节点(中间层的最左侧节点)的value[0]元素。再举一个例子,这次是您的两个中间节点的第一个value元素:

(-98*178876.391 + 42*417378.245)/140# -0.00020000000617333822

这再次与您的根节点的第一个value元素-0.0一致。

从您的根节点的value列表来看,似乎您十维Y的所有元素的平均值几乎为零,您可以(也应该)手动验证这一点,作为最终确认。


总结如下:

  • 每个节点的value列表包含属于该节点的训练样本的平均Y值
  • 对于终端节点(叶子节点),这些列表是树模型的实际输出(即输出将始终是这些列表之一,具体取决于X)
  • 对于根节点,value列表包含您整个训练数据集的平均Y值

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注