使用rfsrc

时间:2019-04-13 10:55:39

标签: r random-forest

我使用“ 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_1pred_2)的随机森林,存在一个包含预测值的索引pred_1$predicted,而对于其他随机森林则没有。

奖金:test_3test_4的表述有什么不同?在文档中找不到关于此的任何内容。

1 个答案:

答案 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

嗯,这可能只是数值精度的问题。