2013-02-05 25 views
7

Rgbmが欠損値を処理する方法を知っていますか?私はgoogleを使用して説明を見つけることができないようです。欠損値のR gbm処理

+0

正確な詳細は何ですか? '?gbm'のヘルプページは、欠損値を処理できることを示しています。他に何かを知りたいのですか? –

+3

@BryanHanson:私はそれがそれらを扱うことができることを知っている、私はちょうどそれが行われた方法の説明を探しています。 – screechOwl

答えて

11

gbmが予測子がないことを説明するには、最初にgbmオブジェクトの単一のツリーを視覚化しましょう。

gbmオブジェクトmygbmがあるとします。例えば、あなたがmygbmに最初のツリーを可視化することができますpretty.gbm.tree(mygbm, i.tree=1)を使用する:

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 

詳細については、GBMのマニュアルを参照してください。各行はノードに対応し、最初の(名前のない)列はノード番号です。各ノードには左右のノードがあります(ノードがリーフの場合は-1に設定されています)。また、各ノードにはMissingNodeが関連付けられています。

観測を実行するには、ノード0から開始します。観測値にSplitVar = 46の値がない場合は、ノードMissingNode = 9に送信されます。ツリーの予測このような観測のためには、ノードゼロに分割される前にツリーが有する予測と同じ予測であるSplitCodePred = -4.396393e-06となる(ノード0についてはPrediction = -4.396393e-06)。

この手順は他のノードと分割変数でも同様です。

1

ソースコードから始めます。ただ、コンソールでgbmを入力すると、あなたのソースコードを示しています。

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> 

を素早く読み取り、データがモデルの枠に入れていることを示唆しているとNAのは、それがどのように見えるので、順番に、?na.pass読書、というna.passで処理されますそれは何も特別なことはしませんが、長期的にはそれが何を意味するのかを見るためには、おそらく全体のフィッティングプロセスを読む必要があります。あなたはgbm.fitのコードを見なければならないかもしれないように見えます。

1

official guide to gbmsは、テストデータに欠損値を導入するため、欠損値を処理するようにコーディングされていると想定します。

4

各ツリー内の別々のノードに欠損値を送信するように見えます。 "mygbm"と呼ばれるgbmオブジェクトがある場合、ツリーの各分割には、LeftNodeにRightNodeとMissingNodeがあることを「pretty.gbm.tree(mygbm、i.tree = 1)」と入力すると表示されます。これは、あなたにinteraction.depth = 1があると仮定すると、各ツリーは3つの終端ノード(分割の各側に1つと予測子が欠落している場所に1つ)を持つことを意味します。

1

特に、gbmパッケージは、次のようにNAs(欠損値)を扱います。このアルゴリズムは、分類ツリーまたは回帰ツリーを構築し、直列に組み合わせることによって機能します。所謂基礎学習木は、左と右の分割(@ user2332165が正しい)への観察を分割することによって構築される。 gbmにはMissingという別のノードタイプもあります。行または観測値にその変数の値がない場合、アルゴリズムは代理分割メソッドを適用します。

サロゲート分割をよりよく理解したい場合は、package rpart vignetteを読むことをおすすめします。

関連する問題