R: การใช้อัลกอริทึมการเร่งการไล่ระดับสีของฉันเอง


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.model0 (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. ใช่มันดูถูกต้อง ในแต่ละขั้นตอนคุณมีความเหมาะสมกับส่วนที่เหลือของ psuedo ซึ่งคำนวณได้ว่าเป็นอนุพันธ์ของการสูญเสียที่เกี่ยวกับความพอดี คุณได้รับการไล่ระดับสีอย่างถูกต้องตั้งแต่เริ่มต้นคำถามและยังใส่ใจที่จะได้ตัวคูณ 2
  2. สิ่งนี้ยังดูถูกต้อง คุณกำลังรวมตัวกันของแบบจำลองโดยถ่วงน้ำหนักตามอัตราการเรียนรู้เช่นเดียวกับที่คุณทำในระหว่างการฝึก

แต่เพื่อพูดถึงสิ่งที่ไม่ได้ถามฉันสังเกตเห็นว่าการตั้งค่าการฝึกอบรมของคุณมีนิสัยใจคอน้อย

  • irisชุดข้อมูลที่ถูกแบ่งออกเท่า ๆ กันระหว่าง 3 ชนิด (setosa, versicolor, เวอร์) และเหล่านี้เป็นที่อยู่ติดกันในข้อมูล ข้อมูลการฝึกอบรมของคุณมี setosa และ versicolor ทั้งหมดในขณะที่ชุดทดสอบมีตัวอย่างของ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.