gpt4 book ai didi

R:实现我自己的梯度提升算法

转载 作者:行者123 更新时间:2023-12-03 15:51:30 25 4
gpt4 key购买 nike

我正在尝试编写自己的梯度提升算法。我知道有像 gbm 这样的现有软件包和 xgboost,但我想通过编写自己的算法来了解算法的工作原理。

我正在使用 iris数据集,我的结果是 Sepal.Length (连续)。我的损失函数是 mean(1/2*(y-yhat)^2) (基本上是前面有1/2的均方误差),所以我对应的梯度就是残差y - yhat .我将预测初始化为 0。

library(rpart)
data(iris)

#Define gradient
grad.fun <- function(y, yhat) {return(y - yhat)}

mod <- list()

grad_boost <- function(data, learning.rate, M, grad.fun) {
# Initialize fit to be 0
fit <- rep(0, nrow(data))
grad <- grad.fun(y = data$Sepal.Length, yhat = fit)

# Initialize model
mod[[1]] <- fit

# Loop over a total of M iterations
for(i in 1:M){

# Fit base learner (tree) to the gradient
tmp <- data$Sepal.Length
data$Sepal.Length <- grad
base_learner <- rpart(Sepal.Length ~ ., data = data, control = ("maxdepth = 2"))
data$Sepal.Length <- tmp

# Fitted values by fitting current model
fit <- fit + learning.rate * as.vector(predict(base_learner, newdata = data))

# Update gradient
grad <- grad.fun(y = data$Sepal.Length, yhat = fit)

# Store current model (index is i + 1 because i = 1 contain the initialized estiamtes)
mod[[i + 1]] <- base_learner

}
return(mod)
}

有了这个,我拆分了 iris将数据集转换为训练和测试数据集,并将我的模型拟合到其中。
train.dat <- iris[1:100, ]
test.dat <- iris[101:150, ]
learning.rate <- 0.001
M = 1000
my.model <- grad_boost(data = train.dat, learning.rate = learning.rate, M = M, grad.fun = grad.fun)

现在我从 my.model 计算预测值.对于 my.model ,拟合值为 0 (vector of initial estimates) + learning.rate * predictions from tree 1 + learning rate * predictions from tree 2 + ... + learning.rate * predictions from tree M .
yhats.mymod <- apply(sapply(2:length(my.model), function(x) learning.rate * predict(my.model[[x]], newdata = test.dat)), 1, sum)

# Calculate RMSE
> sqrt(mean((test.dat$Sepal.Length - yhats.mymod)^2))
[1] 2.612972


我有几个问题
  • 我的梯度提升算法看起来正确吗?
  • 我是否计算了预测值 yhats.mymod正确吗?
  • 最佳答案

  • 是的,这看起来是正确的。在每一步中,您都在拟合伪残差,这些残差被计算为损失相对于拟合的导数。您在问题开始时就已经正确地推导出了这个梯度,甚至费心得到正确的因子 2。
  • 这看起来也正确。您正在跨模型聚合,按学习率加权,就像您在训练期间所做的那样。

  • 但是为了解决没有被问到的问题,我注意到您的训练设置有一些怪癖。
  • iris数据集在 3 个物种(setosa、versicolor、virginica)之间平均分配,并且这些物种在数据中是相邻的。您的训练数据包含所有 setosa 和 versicolor,而测试集包含所有 virginica 示例。没有重叠,这会导致样本外问题。最好平衡您的训练和测试集以避免这种情况。
  • 学习率和模型数量的组合在我看来太低了。拟合收敛为 (1-lr)^n .与 lr = 1e-3n = 1000您只能对 63.2% 的数据量级进行建模。也就是说,即使每个模型都正确预测了每个样本,您也会估计正确值的 63.2%。用平均值而不是 0 初始化拟合会有所帮助,因为从那时起,效果是回归均值而不仅仅是拖累。
  • 关于R:实现我自己的梯度提升算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61002182/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com