আমি আমার নিজস্ব গ্রেডিয়েন্ট বুস্টিং অ্যালগরিদম লেখার চেষ্টা করছি। আমি বুঝতে পারি যে এখানে বিদ্যমান প্যাকেজ রয়েছে 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
সঠিকভাবে গণনা করেছি ?