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

时间:2019-03-07 10:50:49

标签: python machine-learning scikit-learn decision-tree

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

即它看起来像: enter image description here

因此,预测和因变量的视图如下:enter image description here

我能想到的一个原因是,我选择的功能可能根本不重要。但是,他们确实是有道理的。

有人可以解释一下这里出了什么问题吗?任何帮助将不胜感激。谢谢

1 个答案:

答案 0 :(得分:2)

除了您自己的数据的细节之外,原则上这并不奇怪,一旦您了解了决策树实际上是在做什么的话。

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

鉴于直觉上的预测方差低于实际值,根据终端节点(即max_depth的数量而降低多少的细节,以及自行处理数据。

来自documentation的以下图表应有助于形象化这一想法-应该直观地看出,数据的方差确实高于(离散的)预测之一:

enter image description here

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

import numpy as np
from sklearn.tree import DecisionTreeRegressor

# dummy data
rng = np.random.RandomState(1)
X = np.sort(5 * rng.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - 5*rng.rand(16)) # modify here - 5*

estimator_1 = DecisionTreeRegressor(max_depth=2)
estimator_1.fit(X, y)

estimator_2 = DecisionTreeRegressor(max_depth=5)
estimator_2.fit(X, y)

y_pred_1 = estimator_1.predict(X)
y_pred_2 = estimator_2.predict(X)

现在让我们检查差异:

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.2561013675900665

np.mean(y_pred_2)
# -1.2561013675900665

所有这些对于新人来说似乎令人惊讶,特别是如果他们试图“天真”地扩展线性回归的线性思维;但是决策树存在于自己的领域中,这与线性领域肯定是不同的(并且相距甚远)。

要回到我解决问题的离散化问题,让我们检查一下预测得到多少个唯一值;为简单起见,仅将讨论保留给y_pred_1

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

就是这样;您将从该回归树中获得的每个输出将是这三个值之一,并且从不介于“之间”的任何值,例如-10-5.82或[...](即无插值)。现在,至少再次直观地讲,您应该能够使自己确信,在这种情况下的方差不足为奇(大大……)低于实际数据之一(默认情况下,预测的分散性较低)... < / p>