【问题标题】:predict multivariate model using rfsrc使用 rfsrc 预测多元模型
【发布时间】:2019-04-13 10:55:39
【问题描述】:

我使用包“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 公式有什么不同吗?在文档中找不到任何关于此的内容。

【问题讨论】:

    标签: r random-forest


    【解决方案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
    

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2019-12-01
    • 2019-02-23
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多