R: thực hiện thuật toán tăng cường độ dốc của riêng tôi


10

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ư gbmxgboost,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ộ irisdữ 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ộ irisdữ 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

  1. Liệu thuật toán tăng cường độ dốc của tôi trông có đúng không?
  2. Tôi đã tính toán các giá trị dự đoán yhats.mymodchính xác chưa?

Câu trả lời:


0
  1. Vâng, điều này có vẻ đúng. Ở mỗi bước bạn phù hợp với phần dư psuedo, được tính là đạo hàm của sự mất mát đối với sự phù hợp. Bạn đã nhận được chính xác độ dốc này khi bắt đầu câu hỏi của bạn và thậm chí bận tâm để có được hệ số 2 đúng.
  2. Điều này cũng có vẻ đúng. Bạn đang tổng hợp trên các mô hình, được cân nhắc bởi tỷ lệ học tập, giống như bạn đã làm trong quá trình đào tạo.

Nhưng để giải quyết điều gì đó không được hỏi, tôi nhận thấy rằng thiết lập đào tạo của bạn có một vài điều kỳ quặc.

  • Bộ irisdữ liệu được chia đều giữa 3 loài (setosa, Versolor, virginica) và chúng nằm liền kề trong dữ liệu. Dữ liệu đào tạo của bạn có tất cả các setosa và nhiều màu, trong khi bộ kiểm tra có tất cả các ví dụ virginica. Không có sự chồng chéo, điều này sẽ dẫn đến các vấn đề ngoài mẫu. Tốt nhất là cân bằng bộ đào tạo và kiểm tra của bạn để tránh điều này.
  • Sự kết hợp giữa tỷ lệ học tập và số lượng mô hình có vẻ quá thấp đối với tôi. Sự phù hợp hội tụ như (1-lr)^n. Với lr = 1e-3n = 1000bạn chỉ có thể mô hình hóa 63,2% cường độ dữ liệu. Đó là, ngay cả khi mọi mô hình dự đoán chính xác mọi mẫu, bạn sẽ ước tính 63,2% giá trị chính xác. Khởi tạo sự phù hợp với mức trung bình, thay vì 0, sẽ giúp ích từ đó hiệu ứng là hồi quy trung bình thay vì chỉ là một lực cản.

Cảm ơn bạn đã bình luận của bạn. Bạn có thể mở rộng lý do tại sao "phù hợp hội tụ là (1-lr) ^ n" không? Lý do đằng sau này là gì?
YQW

Đó là bởi vì fit <- fit + learning.rate * prediction, nơi predictioncòn lại target - fit. Vì vậy fit <- fit + lr * (target - fit), hoặc fit <- fit * (1 - lr) + target * lr. Đây chỉ là một trung bình di chuyển theo cấp số nhân. Theo Wikipedia , "trọng số được bỏ qua bằng cách dừng sau các điều khoản k nằm (1-α)^kngoài tổng trọng số" ( αlà tỷ lệ học tập và kn). Bạn đang bắt đầu với ước tính bằng 0 thay vì giá trị trung bình, do đó, trọng số này được bỏ qua trực tiếp ngoài dự đoán.
mcskinner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.