xgboost 无法识别完美拟合的回归线

数据挖掘 r 回归 决策树 xgboost 合奏
2022-02-22 18:52:04

对于数据集,我想使用 xgboost 来优化预测的集成,而不是仅仅使用它们的算术平均值进行组合。我发现 xgboost 生成的预测比模型可以选择组合nn

我不知道为什么会这样。为了说明我的观察,我创建了下面的玩具数据集。人工目标变量由和两个解释变量 之间的确定关系, xgboost 可以做出完美的预测,但事实并非如此。线性模型很容易做到。由于这是我能想到的最简单的多元线性回归模型,而 xgboost 失败了,我想知道其中的含义。

y=x1+x22with x1,x2N(0,1)
yx1x2

  • 为什么会这样?回归树模型的局限性是什么?
  • 如果 xgboost 不能重现 MSE 最小化算术平均值作为最佳组合机制,为什么还要使用 xgboost 进行预测的堆叠和集成?

请注意,xgboost 的参数不影响这一点。我尝试了很多参数设置,结果从来都不是完美的。

数据生成

library(tidyverse)
library(xgboost)
n <- 1000
param0 <- list("objective"  = "reg:linear", "eval_metric" = "rmse")
set.seed(1)
df <- tibble(x1 = rnorm(n), x2 = rnorm(n), y = (x1+x2)/2)

xgboost

xgtrain <- xgb.DMatrix(as.matrix(df[1:900,c("x1","x2")]), label = df$y[1:900], missing = NA)
xgtest <- xgb.DMatrix(as.matrix(df[901:1000,c("x1","x2")]), missing = NA)
#Crossvalidation just to illustrate that the algorithm 
#learns something that is not correct since the test data 
#cannot be forecasted with 0 error. 
#xgb.cv(nrounds = 100,nfold = 10, params = param0, data = xgtrain)  
#nrounds and other parameters do not not get you to the prefect forecast
model <- xgb.train(nrounds = 100, params = param0, data = xgtrain)  
preds_xgb <- predict(model, xgtest)
#no perfect forecasts
sqrt(mean((preds_xgb-df$y[901:1000])^2))
0.04654448

线性回归

model <- lm(y ~ x1+x2, data = df[1:900,])
#0.5 and 0.5 for x1 and x2 as expected
model$coefficients 
preds_lm <- predict(model, df[901:1000,c("x1","x2")])
#perfect forecasts
sqrt(mean((preds_lm-df$y[901:1000])^2))
1.389314e-15
2个回答

我认为发生这种情况的原因是基于树的方法存在线性问题。这是因为基于树的方法对变量进行分区,而不是对变量的组合进行分区。为了拟合线性回归,基于树的方法必须进行大量分区才能获得低误差。但是,原则上,使用足够深的树应该能够过度拟合训练数据,尽管它可能需要很多树。

如果您关心的是做出完美的预测,那么没有任何基于树的方法能够做出完美的预测,大多数类型的数据都会发生这种情况。由于您的数据是线性的,因此您碰巧能够使用线性回归进行完美预测,但这在现实生活中不会发生。

(补充@David上面所说的),

简短的回答是,

  • 你不能指望基于树的模型来推断......

曾在 Slack 上询问过(引用 miguel_perez),这是答复,请意识到在您的示例中,您正在接近一条带楼梯的线。即使丢弃其他可疑的第一个错误也不足以提供足够的数据点。树不是近似线的合适工具,尤其是在没有足够数据的情况下......

或者你没有足够的功能来做同样的事情......(cpmp)

此外,如果您只想进行回归,那么我们有不同的回归器,Vowpal Wabbit,KNN 等......