Tôi đang cố gắng để viết thuật toán tăng cường độ dốc của riêng tôi. Tôi hiểu có gói hiện như gbm
và xgboost,
nhưng tôi muốn hiểu làm thế nào các thuật toán hoạt động bằng cách viết của riêng tôi.
Tôi đang sử dụng bộ iris
dữ liệu và kết quả của tôi là Sepal.Length
(liên tục). Hàm mất của tôi là mean(1/2*(y-yhat)^2)
(về cơ bản là lỗi bình phương trung bình với 1/2 ở phía trước), do đó độ dốc tương ứng của tôi chỉ là phần dư y - yhat
. Tôi đang khởi tạo dự đoán ở mức 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)
}
Với điều này, tôi chia bộ iris
dữ liệu thành tập dữ liệu huấn luyện và kiểm tra và phù hợp với mô hình của tôi với nó.
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)
Bây giờ tôi tính các giá trị dự đoán từ my.model
. Đối với my.model
, các giá trị được trang bị là 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
Tôi có một vài câu hỏi
- Liệu thuật toán tăng cường độ dốc của tôi trông có đúng không?
- Tôi đã tính toán các giá trị dự đoán
yhats.mymod
chính xác chưa?