我正在尝试在R中实现一个简单的用于回归的梯度提升算法。目前我已经有了以下代码,但错误没有像我预期的那样达到平稳状态。有什么建议吗?
data("OrchardSprays")niter <- 10learn <- 0.05y <- OrchardSprays$decreaseyhat <- rep(0,nrow(OrchardSprays))weight <- rep(1,nrow(OrchardSprays))loss <- function(y,yhat) (y - yhat)^2for (i in seq(niter)){ model <- lm(decrease~.,weights=weight,data=OrchardSprays) yhat <- yhat + weight * (predict(model) - yhat) / i error <- mean(loss(y,yhat)) weight <- weight + learn * (loss(y,yhat) - error) / error cat(i,"error:",error,"\n")}
输出:
1 error: 319.5881 2 error: 318.6175 3 error: 317.9368 4 error: 317.6112 5 error: 317.6369 6 error: 317.9772 7 error: 318.5833 8 error: 319.4047 9 error: 320.3939 10 error: 321.5086
回答:
我承认很久没有编写过权重优化器了,所以我的建议可能不太准确。我建议你从记录每次迭代的yhat
向量开始。看看这些值是否在振荡或趋向于零(因为我不知道你通过除以i
是在帮助还是在损害)。
同样,查看每次lm()迭代的R^2值。如果这些值非常接近1,你可能只是遇到了lm()当前规定的灵敏度限制。
如果你能提供你的算法来源,我们可以将代码与你实现的方程进行对比,这将很有帮助。
更新:快速查阅维基百科显示如下信息:“有几个开源的R包可用:gbm,[6] mboost,gbev。”我强烈建议你研究这些包,包括它们的源代码,看看它们是否能满足你的需求。