我用 party::cforest 和 n_trees 训练了一个随机森林进行回归(连续响应)。 当使用“predict(type=”response”)时,得到的只是所有n_trees响应的平均值。 如何获得每棵树的响应(即 n_trees 响应)? 非常感谢!我已经尝试了好几个星期了,但我仍然一无所知!
我也尝试使用 partykit 训练森林,但我仍然找不到获得所有响应的方法。 文档中有一个带有分位数函数的示例。我尝试使用函数(y,w)中位数(y)获取所有响应的中位数(如果我无法明确获得所有答案,至少我认为我可以从中获得一些统计数据),但这给了我相同的结果所有数据点的值。所以我不太明白 FUN 在 partykit::predict 中应该如何运作
我还尝试了预测(type =“prob”),正如其他分类随机森林的帖子中所建议的那样,但我得到了一个错误“无法计算具有非整数权重的经验分布函数”。
所以我仍然一无所知。 谢谢您的帮助!
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
。