xgboost 中的加性偏差(及其修正?)

机器算法验证 机器学习 助推 过拟合 偏差校正
2022-03-14 05:00:53

我现在正在参加比赛。我知道做好这件事是我的工作,但也许有人想在这里讨论我的问题及其解决方案,因为这对他们所在领域的其他人也有帮助。

我已经训练了一个 xgboost 模型(一个基于树的模型和一个线性模型以及两者的集合)。正如这里已经讨论过的,训练集(我在其中进行交叉验证)上的平均绝对误差(MAE)很小(大约 0.3),然后在保留测试集上,误差大约为 2.4。然后比赛开始了,误差在 8 左右(!),令人惊讶的是, 预测总是比真实值高 8-9 !看图中黄色圈出的区域:

在此处输入图像描述

我不得不说,训练数据的时期在 15 年 10 月结束,比赛现在开始(16 年 4 月,3 月的测试期约为 2 周)。

今天,我只是从我的预测中减去了 9 的常数值,误差下降到 2,我在排行榜上获得了第 3 名(对于这一天)。;) 这是黄线的右边部分。

所以我想讨论的是:

  • xgboost 对在模型方程中添加截距项有何反应?如果系统变化太大(就像我从 10 月 15 日到 4 月 16 日的情况一样),这会导致偏差吗?
  • 没有截距的 xgboost 模型对目标值的平行变化是否更稳健?

我将继续减去 9 的偏差,如果有人感兴趣,我可以向您展示结果。在这里获得更多见解会更有趣。

1个回答

如果有人感兴趣,我会回答自己并让你知道我的发现。

首先是偏见:我花时间收集所有最近的数据并将其格式化等等。我早就应该这样做了。图片如下:

在此处输入图像描述

你看 2015 年底和 4 月 16 日的数据。价格水平完全不同。在 2015 年数据上训练的模型无法获得这种变化。

第二:xgboost的适配。我真的很喜欢下面的设置。训练和测试错误现在非常接近并且仍然很好:

xgb_grid_1 <- expand.grid(
    nrounds = c(12000),
    eta = c(0.01),
    max_depth = c(3),
    gamma = 1,
    colsample_bytree = c(0.7),
    min_child_weight = c(5) 
  )

  xgb_train_1 <- train(
    x = training,y = model.data$Price[inTrain],
    trControl = ctrl,
    tuneGrid = xgb_grid_1,
    method="xgbTree" 
   ,subsample = 0.8
    )

因此,我使用了很多树,并且所有树的深度最多为 3 个(如此处推荐)。这样做计算很快(树的大小随着每次拆分增长 2 倍)并且似乎减少了过度拟合。

我的总结:使用叶子少但叶子很多的树,并寻找最近的数据。对于比赛来说,这对我来说是不幸的......