如何从“派对”随机森林(cforest)中获取每棵树的响应(预测)?

问题描述 投票:0回答:1

我用 party::cforest 和 n_trees 训练了一个随机森林进行回归(连续响应)。 当使用“predict(type=”response”)时,得到的只是所有n_trees响应的平均值。 如何获得每棵树的响应(即 n_trees 响应)? 非常感谢!我已经尝试了好几个星期了,但我仍然一无所知!

我也尝试使用 partykit 训练森林,但我仍然找不到获得所有响应的方法。 文档中有一个带有分位数函数的示例。我尝试使用函数(y,w)中位数(y)获取所有响应的中位数(如果我无法明确获得所有答案,至少我认为我可以从中获得一些统计数据),但这给了我相同的结果所有数据点的值。所以我不太明白 FUN 在 partykit::predict 中应该如何运作

我还尝试了预测(type =“prob”),正如其他分类随机森林的帖子中所建议的那样,但我得到了一个错误“无法计算具有非整数权重的经验分布函数”。

所以我仍然一无所知。 谢谢您的帮助!

r random-forest party
1个回答
0
投票

ntree
各个预测实际上不是在
cforest()
内计算的。相反,森林的预测被计算为原始响应的加权平均值,其中权重取决于新的数据点。

但是,您可以设置

ntree
各个树并自行计算预测。所有必要的信息都在
cforest
对象中。

让我们考虑以下简单的示例,使用只有 10 棵树的森林来获取

cars
数据:

library("partykit")
set.seed(1)
cf <- cforest(dist ~ speed, data = cars, ntree = 10)

然后您可以获得两个新数据点的预测:

nd <- data.frame(speed = c(10, 20)) 
predict(cf, newdata = nd)  
##        1        2
## 22.65411 63.11666

现在为了复制这一点,我们还可以设置森林中的 10 棵单独的树。为此,我们使用

constparty
类,也由
ctree()
返回:

ct <- lapply(seq_along(cf$nodes), function(i) as.constparty(
  party(cf$nodes[[i]], data = cf$data, terms = cf$terms,
    fitted = data.frame(
      `(response)` = cf$fitted[["(response)"]],
      `(weights)` = cf$weights[[i]],
      check.names = FALSE))
))

对于 10 棵

constparty
树的列表,您可以应用
predict()
方法来获取 10 个单独的预测并计算它们的平均值:

p <- sapply(ct, predict, newdata = nd)
dim(p)
## [1]  2 10
rowMeans(p)
##        1        2 
## 22.65411 63.11666 

但现在您还可以使用所有单个树的预测来检查完整的 2 x 10 矩阵

p

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.