我使用“ randomForestSRC”软件包,并且希望同时预测两个变量。我没有一个可以单独预测这两个变量的问题,但是无法使这些组合起作用。这是一个mwe:
library(randomForestSRC)
# create dataset, only continuous variables
dat <- mtcars[,c("drat", "wt", "qsec")]
dat$drat_wt <- dat$drat*dat$wt
dat$drat_qsec <- dat$drat*dat$qsec
train <- sample(nrow(dat), round(nrow(dat)*0.8))
# train the algorithms with only one outcome variable
test_1 <- rfsrc(drat_wt ~ . ,data = dat[train,],
importance = 'permute')
test_2 <- rfsrc(drat_qsec ~ . ,data = dat[train,],
importance = 'permute')
# train the radom forest with multiple outcome variables
test_3 <- rfsrc(cbind(drat_qsec,drat_wt) ~ . ,data = dat[train,],
importance = 'permute')
test_4 <- rfsrc(Multivar(drat_qsec,drat_wt) ~ . ,data = dat[train,],
importance = 'permute')
# predict all the random forest data
pred_1 <- predict(test_1, dat[-train,], na.action= "na.impute")
pred_2 <- predict(test_2, dat[-train,], na.action= "na.impute")
pred_3 <- predict(test_3, dat[-train,], na.action= "na.impute")
pred_4 <- predict(test_4, dat[-train,], na.action= "na.impute")
现在,对于仅具有一个结果(pred_1
和pred_2
)的随机森林,存在一个包含预测值的索引pred_1$predicted
,而对于其他随机森林则没有。
奖金:test_3
和test_4
的表述有什么不同?在文档中找不到关于此的任何内容。
答案 0 :(得分:1)
要回答第一个问题,pred_3和pred_4的输出包含一个列表元素regrOutput,该列表元素不包含在pred_1和pred_2对象中。如果查看此对象的内部,将找到两个结果变量(或目标变量或从属变量或...)的名称。例如,
names(pred_4$regrOutput)
[1] "drat_qsec" "drat_wt"
现在,在每个对象中,您都可以找到缺少的对象
names(pred_1)
。例如,
names(pred_4$regrOutput$drat_qsec)
[1] "predicted" "predicted.oob" "quantile" "quantile.oob" "err.rate"
和
setdiff(names(pred_1), names(pred_3))
[1] "predicted" "predicted.oob" "quantile" "quantile.oob" "err.rate"
我不确定第二个问题,但是对象具有相同的结构。探索这种情况的一种方法是浏览对象。
例如,为每个森林设置种子,然后查看返回的对象。
set.seed(1234)
test_3 <- rfsrc(cbind(drat_qsec,drat_wt) ~ . ,data = dat[train,],
importance = 'permute')
set.seed(1234)
test_4 <- rfsrc(Multivar(drat_qsec,drat_wt) ~ . ,data = dat[train,],
importance = 'permute')
由于第一个元素是调用(我们知道是不同的),因此请将其删除并检查身份。
identical(test_3[-1], test_4[-1])
现在,查看返回对象中的每个元素。
mapply(identical, test_3, test_4)
对不相同的内容进行归零:
which(!mapply(identical, test_3, test_4))
call forest regrOutput
1 19 36
然后进一步进入对象...
which(!mapply(identical, test_3$forest, test_4$forest))
nativeArray
2
以此类推。
但是,最重要的是,这些产生相同的结果吗?让我们重新运行预测并查看预测值。
pred_3 <- predict(test_3, dat[-train,], na.action= "na.impute")
pred_4 <- predict(test_4, dat[-train,], na.action= "na.impute")
现在,看看
pred_3$regrOutput$drat_qsec$predicted
[1] 68.04419 55.95063 55.02067 56.38382 56.38382 75.33735
pred_4$regrOutput$drat_qsec$predicted
[1] 68.04419 55.95063 55.02067 56.38382 56.38382 75.33735
它们在我看来都一样
identical(pred_3$regrOutput$drat_qsec$predicted,
pred_4$regrOutput$drat_qsec$predicted)
[1] FALSE
但是,它们并不相同。让我们使用推荐的all.equal
函数检查浮点值。
all.equal(pred_3$regrOutput$drat_qsec$predicted,
pred_4$regrOutput$drat_qsec$predicted)
[1] TRUE
嗯,这可能只是数值精度的问题。