आर: अपने स्वयं के ढाल बूस्टिंग एल्गोरिदम को लागू करना


10

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

मेरे कुछ प्रश्न हैं

  1. क्या मेरा ढाल बूस्टिंग एल्गोरिथ्म सही लगता है?
  2. क्या मैंने अनुमानित मूल्यों की yhats.mymodसही गणना की है?

जवाबों:


0
  1. हाँ यह सही लग रहा है। प्रत्येक चरण में आप प्यूसीडो-अवशिष्ट के लिए उपयुक्त हैं, जो कि फिट के संबंध में नुकसान के व्युत्पन्न के रूप में गणना की जाती है। आपने अपने प्रश्न की शुरुआत में इस ढाल को सही ढंग से प्राप्त किया है, और यहां तक ​​कि 2 अधिकार का कारक प्राप्त करने के लिए परेशान किया है।
  2. यह भी सही लगता है। आप मॉडल भर में एकत्र कर रहे हैं, सीखने की दर से भारित, जैसा आपने प्रशिक्षण के दौरान किया था।

लेकिन कुछ ऐसा करने के लिए जो नहीं पूछा गया था, मैंने देखा कि आपके प्रशिक्षण सेटअप में कुछ विचित्रताएँ हैं।

  • irisडाटासेट समान रूप से 3 प्रजातियां (setosa, वर्सिकलर, virginica) और इन आंकड़ों में निकट हैं के बीच विभाजन है। आपके प्रशिक्षण डेटा में सभी सेटोसा और वर्सीकोलर हैं, जबकि परीक्षण सेट में वर्जिनिका के सभी उदाहरण हैं। कोई ओवरलैप नहीं है, जो आउट-ऑफ-सैंपल की समस्याओं को जन्म देगा। इससे बचने के लिए अपने प्रशिक्षण और परीक्षण सेट को संतुलित करना बेहतर होता है।
  • सीखने की दर और मॉडल गणना का संयोजन मेरे लिए बहुत कम दिखता है। फिट के रूप में परिवर्तित (1-lr)^n। के साथ lr = 1e-3और n = 1000आप डेटा परिमाण का केवल 63.2% मॉडल कर सकते हैं। यही है, भले ही प्रत्येक मॉडल प्रत्येक नमूने को सही ढंग से भविष्यवाणी करता है, आप सही मूल्य के 63.2% का अनुमान लगा रहे होंगे। 0 के बजाय एक औसत के साथ फिट को शुरू करना, तब से मदद करेगा जब तक प्रभाव सिर्फ एक ड्रैग के बजाय माध्य के लिए एक प्रतिगमन है।

आपकी टिप्पणीयों के लिए धन्यवाद। क्या आप इस बात पर विस्तार कर सकते हैं कि "फिट (1-lr) ^ n" के रूप में क्यों परिवर्तित होता है? इसके पीछे तर्क क्या है?
YQW

इसकी वजह है fit <- fit + learning.rate * prediction, जहां predictionअवशिष्ट है target - fit। तो fit <- fit + lr * (target - fit), या fit <- fit * (1 - lr) + target * lr। यह सिर्फ एक घातीय चलती औसत है। विकिपीडिया के अनुसार , "k की शर्तों (1-α)^kके कुल भार से बाहर निकलने के बाद रोक दिया गया वजन" ( αसीखने की दर है और kहै n)। आप माध्य के बजाय 0 के अनुमान के साथ शुरू कर रहे हैं, इसलिए छोड़े गए यह वजन सीधे भविष्यवाणी से बाहर आता है।
mcskinner
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.