Kendi gradyan artırma algoritmamı yazmaya çalışıyorum. Orada gibi mevcut paketler anlıyoruz gbm
ve xgboost,
ancak algoritma kendi yazarak nasıl çalıştığını anlamak istedik.
iris
Veri kümesini kullanıyorum ve sonucum Sepal.Length
(sürekli). Kayıp fonksiyonum mean(1/2*(y-yhat)^2)
(temelde önde 1/2 ile ortalama kare hatası), bu yüzden karşılık gelen gradyan sadece kalıntıdır y - yhat
. Tahminleri 0'da başlatıyorum.
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)
}
Bununla, iris
veri setini bir eğitim ve test veri setine böldüm ve modelimi buna uydurdum .
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)
Şimdi tahmin edilen değerleri hesaplayacağım my.model
. Çünkü my.model
, takılan değerler 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
bir kaç sorum var
- Degrade yükseltme algoritmam doğru görünüyor mu?
- Tahmin edilen değerleri
yhats.mymod
doğru hesapladım mı?