使用 rfsrc 预测多变量模型
predict multivariate model using rfsrc
我使用包 "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
公式有什么区别吗?在文档中找不到关于此的任何内容。
要回答您的第一个问题,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
啊,这可能只是数值精度的问题。
我使用包 "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
公式有什么区别吗?在文档中找不到关于此的任何内容。
要回答您的第一个问题,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
啊,这可能只是数值精度的问题。