Python 未捕获因变量方差的决策树

Python 未捕获因变量方差的决策树,python,machine-learning,scikit-learn,decision-tree,Python,Machine Learning,Scikit Learn,Decision Tree,我正在使用决策树回归器。数据点的数量为15000个,具有15个特征。我面临的问题是,即使在高度过拟合的条件下(我使深度=25,最小值。叶子上的样本=2),预测的方差也比因变量小得多(即,它仍然处于拟合状态)。首先,我认为这可能是一个偏差-方差问题,但是所有预测的平均值和因变量的平均值都等于小数点后9位 i、 e.它看起来像: 因此,预测和因变量具有如下视图: 我能想到的一个原因是,我选择的功能可能根本不重要。然而,它们确实有意义 有人能解释一下这里可能出了什么问题吗?任何帮助都将不胜感激。除了

我正在使用决策树回归器。数据点的数量为15000个,具有15个特征。我面临的问题是,即使在高度过拟合的条件下(我使深度=25,最小值。叶子上的样本=2),预测的方差也比因变量小得多(即,它仍然处于拟合状态)。首先,我认为这可能是一个偏差-方差问题,但是所有预测的平均值和因变量的平均值都等于小数点后9位

i、 e.它看起来像:

因此,预测和因变量具有如下视图:

我能想到的一个原因是,我选择的功能可能根本不重要。然而,它们确实有意义


有人能解释一下这里可能出了什么问题吗?任何帮助都将不胜感激。除了您自己的数据细节之外,这在原则上并不令人惊讶,只要您了解决策树在幕后的实际操作

回归树实际作为输出返回的是在各个终端节点(叶)中结束的训练样本的因变量
y
的平均值。实际上,这意味着输出在默认情况下是离散化的:在输出时获得的值是终端节点中的有限值集,它们之间没有任何插值

考虑到这一点,直观地说,预测的方差低于实际值并不令人惊讶,其具体程度取决于终端节点的数量(即
max_depth
),当然也取决于数据本身

以下来自的曲线图应有助于将想法形象化——从直觉上看,数据的方差确实高于(离散化的)预测值:

让我们修改该示例中的代码,添加一些异常值(这会放大问题):

现在让我们检查差异:

np.var(y) # true data
# 11.238416688700267

np.var(y_pred_1) # max_depth=2
# 1.7423865989859313

np.var(y_pred_2) # max_depth=5
# 6.1398871265574595
正如预期的那样,预测的方差随着树深度的增加而增加,但仍然(显著)低于真实数据的方差。当然,所有的平均值都是相同的:

np.mean(y)
# -1.2561013675900665

np.mean(y_pred_1)
# -1.2561013675900665

np.mean(y_pred_2)
# -1.2561013675900665
对于新手来说,所有这些似乎都令人惊讶,特别是如果他们试图“天真地”扩展线性回归的线性思维;但是决策树生活在它们自己的领域中,这当然与线性树不同(而且相去甚远)

为了回到我打开答案的离散化问题,让我们检查一下我们的预测得到了多少唯一值;为简单起见,仅将讨论内容保留在
y\u pred\u 1

np.unique(y_pred_1)
# array([-11.74901949,  -1.9966201 ,  -0.71895532])

就这样,;从该回归树得到的每个输出都将是这3个值中的一个,而不是任何“介于”之间的值,如
-10
-5.82
或[…](即无插值)。现在,至少从直觉上讲,你应该能够说服自己,在这种情况下,方差比实际数据的方差低(很多…)并不令人惊讶(默认情况下预测的分散性较小).

撇开你自己数据的细节不谈,原则上这并不奇怪,一旦你了解了决策树在幕后到底在做什么

回归树实际作为输出返回的是在各个终端节点(叶)中结束的训练样本的因变量
y
的平均值。实际上,这意味着输出在默认情况下是离散化的:在输出时获得的值是终端节点中的有限值集,它们之间没有任何插值

考虑到这一点,直观地说,预测的方差低于实际值并不令人惊讶,其具体程度取决于终端节点的数量(即
max_depth
),当然也取决于数据本身

以下来自的曲线图应有助于将想法形象化——从直觉上看,数据的方差确实高于(离散化的)预测值:

让我们修改该示例中的代码,添加一些异常值(这会放大问题):

现在让我们检查差异:

np.var(y) # true data
# 11.238416688700267

np.var(y_pred_1) # max_depth=2
# 1.7423865989859313

np.var(y_pred_2) # max_depth=5
# 6.1398871265574595
正如预期的那样,预测的方差随着树深度的增加而增加,但仍然(显著)低于真实数据的方差。当然,所有的平均值都是相同的:

np.mean(y)
# -1.2561013675900665

np.mean(y_pred_1)
# -1.2561013675900665

np.mean(y_pred_2)
# -1.2561013675900665
对于新手来说,所有这些似乎都令人惊讶,特别是如果他们试图“天真地”扩展线性回归的线性思维;但是决策树生活在它们自己的领域中,这当然与线性树不同(而且相去甚远)

为了回到我打开答案的离散化问题,让我们检查一下我们的预测得到了多少唯一值;为简单起见,仅将讨论内容保留在
y\u pred\u 1

np.unique(y_pred_1)
# array([-11.74901949,  -1.9966201 ,  -0.71895532])

就这样,;从该回归树得到的每个输出都将是这3个值中的一个,而不是任何“介于”之间的值,如
-10
-5.82
或[…](即无插值)。现在,至少从直觉上讲,你应该能够说服自己,在这种情况下,方差比实际数据的方差低(很多…)并不出人意料(默认情况下预测的分散性较小).

可能是因为没有足够的特征,有时,似乎有意义的事情在统计上是不相关的,你说它们确实有意义,但你能证明这是事实吗?如果我用五个变量的bucketing拟合一条线性线,在7个特征中,我看到了统计上显著的趋势。这可能允许我评论说,这些变量与因变量之间存在一般关系。然而,我包含了REST8变量,认为即使它们不