Answers:
我不知道您到底做了什么,因此您的源代码将帮助我减少猜测。
实际上,许多随机森林都是窗口,在其中假定平均值代表该系统。这是过度夸张的CAR树。
假设您有两叶CAR树。您的数据将分为两堆。每堆的(恒定)输出将为其平均值。
现在,对数据的随机子集进行1000次处理。您仍将具有不连续区域,其输出为平均值。RF中的赢家是最常见的结果。那只是“模糊”类别之间的边界。
CART树的分段线性输出示例:
例如,让我们说我们的函数是y = 0.5 * x + 2。它的图如下所示:
如果要使用只有两个叶子的单个分类树对此模型建模,那么我们将首先找到最佳分割点,在该点处分割,然后将每个叶子处的函数输出近似为叶子上的平均输出。
如果我们使用CART树上的更多叶子再次进行此操作,则可能会得到以下结果:
为什么选择汽车森林?
您可以看到,在无限树叶的限制内,CART树将是可接受的近似值。
问题在于现实世界是嘈杂的。我们喜欢思考方式,但是世界既喜欢中心趋势(均值),也喜欢变化趋势(std dev)。有噪音。
赋予CAR-tree强大的强度和处理不连续性的能力的同一件事,使得它很容易像信号一样对噪声建模。
因此,Leo Breimann提出了一个简单而强大的命题:使用Ensemble方法使分类树和回归树变得健壮。他采用随机子集(引导重采样的表亲),并使用它们来训练CAR树的森林。当您询问森林问题时,整个森林都会说话,最常见的答案将作为输出。如果要处理数字数据,将期望值作为输出很有用。
因此,对于第二个图,请考虑使用随机森林进行建模。每棵树将具有数据的随机子集。这意味着“最佳”分割点的位置会因树而异。如果要绘制随机森林的输出图,则在您接近不连续点时,前几个分支将指示一个跳跃,然后是多个。该区域中的平均值将穿过一条平滑的S形路径。自举正在与高斯卷积,该阶跃函数上的高斯模糊变为S形。
底线:
每棵树需要很多分支才能很好地近似线性函数。
您可以更改许多“拨号”以影响答案,并且不太可能将它们全部设置为正确的值。
参考文献:
我注意到这是一个古老的问题,但是我认为应该添加更多内容。正如@Manoel Galdino在评论中所说,通常您对看不见的数据的预测感兴趣。但是这个问题是关于训练数据的性能,而问题是为什么随机森林在训练数据上表现不佳?答案凸显了袋装分类器的一个有趣问题,该问题经常给我带来麻烦:回归均值。
问题在于,袋装分类器(如随机森林)是通过从数据集中获取引导样本而制成的,它们在极端情况下往往表现不佳。由于极端情况下没有太多数据,因此它们倾向于被平滑掉。
更详细地讲,请记住,用于回归的随机森林对大量分类器的预测取平均值。如果您有一个与其他点相距甚远的单点,则许多分类器将看不到它,并且这些分类器实际上将做出样本外预测,这可能不是很好。实际上,这些样本外预测将趋向于将数据点的预测拉向总体均值。
如果使用单个决策树,则极值不会有相同的问题,但是拟合的回归也不是很线性。
这是R中的一个示例。生成的一些数据是y
五个x
变量的完美衬里组合。然后使用线性模型和随机森林进行预测。然后将y
训练数据上的值与预测值作图。您可以清楚地看到,随机森林在极端情况下表现不佳,因为具有非常大或非常小的值的数据点y
很少。
当使用随机森林进行回归时,对于看不见的数据进行预测时,您将看到相同的模式。我不确定如何避免这种情况。randomForest
R中的函数有一个粗略的偏差校正选项corr.bias
,该选项对偏差使用线性回归,但实际上并不起作用。
欢迎提出建议!
beta <- runif(5)
x <- matrix(rnorm(500), nc=5)
y <- drop(x %*% beta)
dat <- data.frame(y=y, x1=x[,1], x2=x[,2], x3=x[,3], x4=x[,4], x5=x[,5])
model1 <- lm(y~., data=dat)
model2 <- randomForest(y ~., data=dat)
pred1 <- predict(model1 ,dat)
pred2 <- predict(model2 ,dat)
plot(y, pred1)
points(y, pred2, col="blue")