欠損値gbm
を処理する方法を知っている人はいますか? R
Googleを使用して説明を見つけることができないようです。
質問する
13326 次
5 に答える
5
各ツリー内の個別のノードに欠損値を送信しているように見えます。「mygbm」という名前の gbm オブジェクトがある場合、「pretty.gbm.tree(mygbm, i.tree = 1)」と入力すると、ツリーの各分割に対して LeftNode、RightNode、および MissingNode があることがわかります。これは、(interaction.depth=1 があると仮定して) 各ツリーに 3 つのターミナル ノードがあることを意味します (分割の各側に 1 つ、予測子が欠落している場所に 1 つ)。
于 2013-04-29T12:59:58.067 に答える
2
于 2013-02-18T17:41:09.257 に答える
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
。
于 2013-02-06T00:20:33.107 に答える