2013-02-05 43 views
7

Có ai biết cách gbm trong R xử lý các giá trị bị thiếu không? Tôi không thể tìm thấy bất kỳ lời giải thích bằng cách sử dụng google.R gbm xử lý các giá trị bị thiếu

+0

Chính xác bạn đang tìm kiếm chi tiết nào? Trang trợ giúp cho '? Gbm' cho thấy rằng nó có thể xử lý các giá trị bị thiếu. Bạn có muốn biết cái gì khác hoặc bổ sung? –

+3

@BryanHanson: Tôi biết nó có thể xử lý chúng, tôi chỉ tìm kiếm giải thích về cách nó được thực hiện. – screechOwl

Trả lời

11

Để giải thích ý nghĩa của gbm với các dự đoán bị thiếu, trước tiên hãy hình dung một cây duy nhất của đối tượng gbm.

Giả sử bạn có mygbm đối tượng gbm. Sử dụng pretty.gbm.tree(mygbm, i.tree=1) bạn có thể hình dung cây đầu tiên trên mygbm, ví dụ:

SplitVar SplitCodePred LeftNode RightNode MissingNode ErrorReduction Weight Prediction 
0  46 1.629728e+01  1   5   9  26.462908 1585 -4.396393e-06 
1  45 1.850000e+01  2   3   4  11.363868 939 -4.370936e-04 
2  -1 2.602236e-04  -1  -1   -1  0.000000 271 2.602236e-04 
3  -1 -7.199873e-04  -1  -1   -1  0.000000 668 -7.199873e-04 
4  -1 -4.370936e-04  -1  -1   -1  0.000000 939 -4.370936e-04 
5  20 0.000000e+00  6   7   8  8.638042 646 6.245552e-04 
6  -1 3.533436e-04  -1  -1   -1  0.000000 483 3.533436e-04 
7  -1 1.428207e-03  -1  -1   -1  0.000000 163 1.428207e-03 
8  -1 6.245552e-04  -1  -1   -1  0.000000 646 6.245552e-04 
9  -1 -4.396393e-06  -1  -1   -1  0.000000 1585 -4.396393e-06 

Xem tài liệu gbm để biết chi tiết. Mỗi hàng tương ứng với một nút và cột đầu tiên (chưa đặt tên) là số nút. Chúng tôi thấy rằng mỗi nút có nút trái và phải (được đặt thành -1 trong trường hợp nút là một chiếc lá). Chúng tôi cũng thấy mỗi nút đã liên kết một số MissingNode.

Để chạy quan sát xuống cây, chúng ta bắt đầu tại nút 0. Nếu quan sát có giá trị thiếu trên SplitVar = 46, thì nó sẽ được gửi xuống cây tới nút MissingNode = 9. Dự đoán của cây cho quan sát như vậy sẽ là SplitCodePred = -4.396393e-06, đó là dự đoán tương tự mà cây đã có trước khi bất kỳ sự phân chia nào được thực hiện thành nút số không (Prediction = -4.396393e-06 cho nút số không).

Quy trình tương tự cho các nút khác và biến phân tách.

1

Bắt đầu với mã nguồn sau đó. Chỉ cần gõ gbm tại giao diện điều khiển cho bạn mã nguồn:

function (formula = formula(data), distribution = "bernoulli", 
    data = list(), weights, var.monotone = NULL, n.trees = 100, 
    interaction.depth = 1, n.minobsinnode = 10, shrinkage = 0.001, 
    bag.fraction = 0.5, train.fraction = 1, cv.folds = 0, keep.data = TRUE, 
    verbose = TRUE) 
{ 
    mf <- match.call(expand.dots = FALSE) 
    m <- match(c("formula", "data", "weights", "offset"), names(mf), 
     0) 
    mf <- mf[c(1, m)] 
    mf$drop.unused.levels <- TRUE 
    mf$na.action <- na.pass 
    mf[[1]] <- as.name("model.frame") 
    mf <- eval(mf, parent.frame()) 
    Terms <- attr(mf, "terms") 
    y <- model.response(mf, "numeric") 
    w <- model.weights(mf) 
    offset <- model.offset(mf) 
    var.names <- attributes(Terms)$term.labels 
    x <- model.frame(terms(reformulate(var.names)), data, na.action = na.pass) 
    response.name <- as.character(formula[[2]]) 
    if (is.character(distribution)) 
     distribution <- list(name = distribution) 
    cv.error <- NULL 
    if (cv.folds > 1) { 
     if (distribution$name == "coxph") 
      i.train <- 1:floor(train.fraction * nrow(y)) 
     else i.train <- 1:floor(train.fraction * length(y)) 
     cv.group <- sample(rep(1:cv.folds, length = length(i.train))) 
     cv.error <- rep(0, n.trees) 
     for (i.cv in 1:cv.folds) { 
      if (verbose) 
       cat("CV:", i.cv, "\n") 
      i <- order(cv.group == i.cv) 
      gbm.obj <- gbm.fit(x[i.train, , drop = FALSE][i, 
       , drop = FALSE], y[i.train][i], offset = offset[i.train][i], 
       distribution = distribution, w = ifelse(w == 
        NULL, NULL, w[i.train][i]), var.monotone = var.monotone, 
       n.trees = n.trees, interaction.depth = interaction.depth, 
       n.minobsinnode = n.minobsinnode, shrinkage = shrinkage, 
       bag.fraction = bag.fraction, train.fraction = mean(cv.group != 
        i.cv), keep.data = FALSE, verbose = verbose, 
       var.names = var.names, response.name = response.name) 
      cv.error <- cv.error + gbm.obj$valid.error * sum(cv.group == 
       i.cv) 
     } 
     cv.error <- cv.error/length(i.train) 
    } 
    gbm.obj <- gbm.fit(x, y, offset = offset, distribution = distribution, 
     w = w, var.monotone = var.monotone, n.trees = n.trees, 
     interaction.depth = interaction.depth, n.minobsinnode = n.minobsinnode, 
     shrinkage = shrinkage, bag.fraction = bag.fraction, train.fraction = train.fraction, 
     keep.data = keep.data, verbose = verbose, var.names = var.names, 
     response.name = response.name) 
    gbm.obj$Terms <- Terms 
    gbm.obj$cv.error <- cv.error 
    gbm.obj$cv.folds <- cv.folds 
    return(gbm.obj) 
} 
<environment: namespace:gbm> 

Một đọc nhanh chóng cho thấy rằng các dữ liệu được đưa vào một khung mô hình và NA của được xử lý với na.pass để đến lượt mình, ?na.pass Reading đó, nó trông giống như nó không có gì đặc biệt với họ, nhưng có thể bạn sẽ phải đọc toàn bộ quá trình phù hợp để xem điều đó có nghĩa là gì về lâu dài. Có vẻ như bạn có thể cũng cần xem mã của gbm.fit và cứ tiếp tục như vậy.

1

official guide để gbms giới thiệu các giá trị thiếu cho dữ liệu thử nghiệm, vì vậy tôi cho rằng chúng được mã hóa để xử lý các giá trị bị thiếu.

4

Dường như gửi các giá trị bị thiếu đến một nút riêng biệt trong mỗi cây. Nếu bạn có một đối tượng gbm được gọi là "mygbm" thì bạn sẽ thấy bằng cách nhập "pretty.gbm.tree (mygbm, i.tree = 1)" cho mỗi phần tách trong cây có một nút LeftNode là RightNode và MissingNode. Điều này ngụ ý rằng (giả sử bạn có tương tác.depth = 1) mỗi cây sẽ có 3 nút đầu cuối (1 cho mỗi bên của phân chia và một cho nơi dự đoán bị thiếu).

1

Gói gbm trong giao dịch cụ thể với NA (giá trị bị thiếu) như sau. Thuật toán hoạt động bằng cách xây dựng và kết hợp chặt chẽ các phân loại hoặc cây hồi quy. Cái gọi là cây học cơ sở được xây dựng bằng cách chia sẻ các quan sát thành các phần chia tách Trái và Phải (@ user2332165 là đúng). Ngoài ra còn có một loại nút riêng biệt của Thiếu trong gbm. Nếu hàng hoặc quan sát không có giá trị cho biến đó, thuật toán sẽ áp dụng phương thức tách thay thế.

Nếu bạn muốn hiểu chia tách thay thế tốt hơn, tôi khuyên bạn nên đọc package rpart vignette.

Các vấn đề liên quan