在我看来,我在 R 中的 Caret 包中发现了 method=gbm 的 predict() 函数的性能错误。我很想知道其他人是否同意,或者是否有人对这种行为有解释这个功能的。
1. 生成数据
library(caret)
x1 <- rnorm(100)
x2 <- rnorm(100, 2)
y <- x1 + x2 + rnorm(100)
df <- data.frame(x1=x1, x2=x2, y=y)
2.使用method="lm"进行预测
以下代码按预期工作:使用 method=“lm” 两个预测值匹配。在第一种情况 p1 中,“y”包含在 newdata 中,在第二种情况下,p2 中不包含。
tempd <- df[1:99, c("y", "x1", "x2") ]
newdata <- df[100, c("y", "x1", "x2")]
lm.fit <- train(y~x1 + x2, data=tempd, method="lm")
p1 <- predict(lm.fit$finalModel, newdata=newdata)
newdata <- df[100, c("x1", "x2")]
p2 <- predict(lm.fit$finalModel, newdata=newdata)
p1 应该等于 p2,并且:
p1==p2
3.使用method="gbm"进行预测
此代码未按预期工作:使用方法 =“gbm”,设置相同,两个预测值不匹配。
tempd <- df[1:99, c("y","x1","x2")]
newdata <- df[100, c("y","x1","x2")]
gbm.fit <- train(y~x1+x2 , data=tempd, method="gbm", verbose=F)
p1 <- predict(gbm.fit$finalModel, newdata=newdata,
n.trees=gbm.fit$finalModel$tuneValue$n.trees,
interaction.depth=gbm.fit$finalModel$tuneValue$interaction.depth,
shrinkage=gbm.fit$finalModel$tuneValue$shrinkage)
newdata <- df[100, c("x1","x2")]
p2 <- predict(gbm.fit$finalModel, newdata=newdata,
n.trees=gbm.fit$finalModel$tuneValue$n.trees,
interaction.depth=gbm.fit$finalModel$tuneValue$interaction.depth,
shrinkage=gbm.fit$finalModel$tuneValue$shrinkage)
在这种情况下,p1 不等于 p2:
p1==p2
4. 使用不同设置的 method="gbm" 进行预测
但是,奇怪的是,有一个小的变化——没有明确命名子集操作中的变量——它确实有效:
tempd <- df[1:99, ]
newdata <- df[100, ]
gbm.fit <- train(y~x1+x2 , data=tempd, method="gbm", verbose=F)
p1 <- predict(gbm.fit$finalModel, newdata=newdata,
n.trees=gbm.fit$finalModel$tuneValue$n.trees,
interaction.depth=gbm.fit$finalModel$tuneValue$interaction.depth,
shrinkage=gbm.fit$finalModel$tuneValue$shrinkage)
newdata <- df[100, c("x1","x2")]
p2 <- predict(gbm.fit$finalModel, newdata=newdata,
n.trees=gbm.fit$finalModel$tuneValue$n.trees,
interaction.depth=gbm.fit$finalModel$tuneValue$interaction.depth,
shrinkage=gbm.fit$finalModel$tuneValue$shrinkage)
p1==p2
提前感谢我们的想法。
杰夫