gbm可以凭空做出预测?

机器算法验证 r 助推 缺失数据
2022-04-08 06:02:51

梯度提升机的 R 实现可以处理缺失数据,这是一个众所周知且非常有用的功能(gbm包)。然而,当一个训练好的模型被要求对一个缺失值的测试集进行预测时,它会得到一些不直观、相当令人惊讶的结果。

我用一排 NA 制作了一个数据框,即所有预测变量都不存在,这成为我的测试集。我打电话predict,仍然得到一个非 NA 预测值。这怎么可能发生?

此外,这个预测值非常接近,但不完全是响应的平均值,如下面的代码所示。这个值是多少?

set.seed(12345)
X = matrix(rnorm(5*100), ncol=5)
colnames(X) = paste("X", 1:5, sep="")
y = rnorm(100)
df = data.frame(y=y, X)
test.df = data.frame(matrix(NA, ncol=ncol(X)))

bm <- gbm(y~., data=df, distribution="gaussian", n.trees=100, cv.folds=10)  
best.iter <- gbm.perf(bm,method="cv", plot.it=FALSE)
pred = predict(bm, newdata=test.df, n.trees=best.iter, type="response")
pred
[1] 0.06221279
mean(y)
[1] 0.06415998

编辑:我认为它们并不重要,但这是我正在使用的 gbm 和 R 的版本

GBM 2.1.1

R 3.2.3

1个回答

这是由于默认参数bag.fraction=0.5. 在此设置下,对于每棵树,随机 50% 的数据用于拟合。在您的代码中,pred是为第 100 棵树选择的 50% 行的平均响应。如果您设置bag.fraction=1平均预测等于平均响应:

bm <- gbm(y~., data=df, distribution="gaussian", n.trees=100, cv.folds=10, bag.fraction=1)