আর: আমার নিজস্ব গ্রেডিয়েন্ট বুস্টিং অ্যালগরিদম বাস্তবায়ন


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, versicolor, virginica) এবং এই তথ্য সংলগ্ন হয় ভাগাভাগি হয়। আপনার প্রশিক্ষণ ডেটাতে সমস্ত সেটোসা এবং ভার্সিকালার রয়েছে, যখন পরীক্ষার সেটটিতে ভার্জিনিকার উদাহরণ রয়েছে। কোনও ওভারল্যাপ নেই, যা নমুনা ছাড়াই সমস্যার কারণ হতে পারে। এটি এড়াতে আপনার প্রশিক্ষণ এবং পরীক্ষার সেটগুলিতে ভারসাম্য বজায় করা ভাল।
  • শেখার হার এবং মডেল গণনার সংমিশ্রণটি আমার কাছে খুব কম দেখাচ্ছে। ফিট হিসাবে রূপান্তর (1-lr)^n। সঙ্গে lr = 1e-3এবং n = 1000আপনি শুধুমাত্র ডেটা মাত্রার 63.2% মডেল পারবেন না। এটি হ'ল, এমনকি প্রতিটি মডেল প্রতিটি নমুনার সঠিকভাবে ভবিষ্যদ্বাণী করে, আপনি সঠিক মানটির .2৩.২% অনুমান করবেন। 0 এর পরিবর্তে গড়ের সাথে ফিটটি শুরু করা তখন থেকে কার্যকর হবে কারণ তখন থেকে প্রভাবটি কেবল একটি টানার পরিবর্তে গড়ের প্রতিরোধী is

আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ। "ফিটগুলি (1-lr) হিসাবে রূপান্তর করে কেন" আপনি প্রসারিত করতে পারেন? এর পিছনে যুক্তি কী?
YQW

এটি কারণ fit <- fit + learning.rate * prediction, যেখানে predictionঅবশিষ্ট আছে target - fit। সুতরাং fit <- fit + lr * (target - fit), বা fit <- fit * (1 - lr) + target * lr। এটি কেবলমাত্র একটি সূচকীয় চলমান গড়। প্রতি উইকিপিডিয়া , "ওজন ট পদ পর বাঁধন দ্বারা বাদ দেওয়া হয় (1-α)^k(আউট মোট ওজন এর" αহয় শেখার হার এবং kহয় n)। আপনি গড়ের পরিবর্তে 0 অনুমান দিয়ে শুরু করছেন, সুতরাং বাদ দেওয়া এই ওজনটি ভবিষ্যদ্বাণী থেকে সরাসরি আসে।
mcskinner
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.