मैं अपने स्वयं के ढाल बूस्टिंग एल्गोरिथ्म लिखने की कोशिश कर रहा हूं। मैं समझता हूं कि मौजूदा पैकेज जैसे हैं 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
सही गणना की है?