R: kendi gradyan artırma algoritmamı uygulamak


10

Kendi gradyan artırma algoritmamı yazmaya çalışıyorum. Orada gibi mevcut paketler anlıyoruz gbmve xgboost,ancak algoritma kendi yazarak nasıl çalıştığını anlamak istedik.

irisVeri 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, irisveri 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

  1. Degrade yükseltme algoritmam doğru görünüyor mu?
  2. Tahmin edilen değerleri yhats.mymoddoğru hesapladım mı?

Yanıtlar:


0
  1. Evet bu doğru görünüyor. Her adımda, fit ile ilgili olarak kayıp türevi olarak hesaplanan psuedo kalıntılarına uyuyorsunuz. Sorunun başlangıcında bu degradeyi doğru bir şekilde türettiniz ve hatta 2 faktörünü doğru elde etmek için rahatsız oldunuz.
  2. Bu da doğru görünüyor. Eğitim sırasında yaptığınız gibi, öğrenme hızına göre ağırlıklandırılmış modeller arasında bir araya geliyorsunuz.

Ancak sorulmayan bir şeyi ele almak için, eğitim kurulumunuzun birkaç tuhaflığı olduğunu fark ettim.

  • irisVeri kümesi eşit 3 tür (setosa, versicolor virginica) ve bu veriler de bitişik arasında bölünür. Egzersiz setinizde tüm setosa ve versicolor bulunurken, test seti virginica örneklerinin tümüne sahiptir. Örnekleme dışı sorunlara yol açacak hiçbir çakışma yoktur. Bundan kaçınmak için egzersiz ve test setlerinizi dengelemeniz tercih edilir.
  • Öğrenme oranı ve model sayısı kombinasyonu bana çok düşük görünüyor. Uygun olarak yakınsar (1-lr)^n. İle lr = 1e-3ve n = 1000veri büyüklüğünün yalnızca% 63.2'sini modelleyebilirsiniz. Yani, her model her numuneyi doğru bir şekilde tahmin etse bile, doğru değerin% 63.2'sini tahmin edersiniz. Uyumun 0 yerine ortalama ile başlatılması, o zamandan beri etki sadece sürükleme yerine ortalamaya bir gerilemedir.

Yorumlarınız için teşekkür ederim. Neden "fit (1-lr) ^ n" olarak birleşiyor? Bunun arkasındaki mantık nedir?
YQW

Çünkü artık fit <- fit + learning.rate * predictionnerede . Yani , ya da . Bu sadece üssel hareketli bir ortalamadır. Başına Wikipedia , "k terimleri sonra durdurarak ihmal ağırlığıdır (toplam ağırlığın dışı" öğrenme oranı ve olduğu ). Ortalama yerine 0 tahmini ile başlıyorsunuz, bu nedenle atlanan bu ağırlık doğrudan tahminden çıkar. predictiontarget - fitfit <- fit + lr * (target - fit)fit <- fit * (1 - lr) + target * lr(1-α)^kαkn
mcskinner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.