使用 MICE 进行多重插补后执行随机森林

机器算法验证 回归 随机森林 缺失数据 多重插补 老鼠
2022-03-19 20:30:45

我想建立一个预测模型。由于我的数据有一些缺失的数据,我用 MICE 算法对数据进行了估算。之后我想用随机森林做一个回归。

现在我有点卡住了,因为:

我想用 MICE 进行多重插补,因为我想考虑模型中缺失变量的方差。所以我用 MICE 估算了 5 个数据集。

如果我想做一个 glm,我会建立 5 个模型(为每个估算的数据集),然后将它们汇集在一起​​。(最后意味着我有 1 个模型,我的参数的方差会更高)

现在我想做的是建立一个随机森林。但我只是找不到任何策略。由于 RF 没有参数估计,我无法将它们汇集在一起​​......

有没有人在这之前工作过?或任何建议我应该做什么?

最良好的祝愿,并在此先感谢您!我非常感谢任何帮助和答案

2个回答

中的combine函数randomForest可以组合多个randomForest对象。

准备数据:

set.seed(1234)

X1 <- rnorm(100, 120, 16)
X2 <- X1 + rnorm(100, 200, 10)
X3 <- 0.8*X2 + rnorm(100, 140, 12)
Y <- factor(as.numeric(X1 > 125))

dat.test <- data.frame(Y, X1, X2, X3)

# Impose missingness
Y[runif(100) < 0.5] <- NA
X1[runif(100) < 0.5] <- NA
X2[runif(100) < 0.5] <- NA
X3[runif(100) < 0.5] <- NA

dat <- data.frame(Y, X1, X2, X3)

估算缺失数据:

library(mice)
mice <- mice(dat, m = 10, method = "rf")

impdat <- NULL # allocate empty list of imputations

for (m in 1:10){impdat[[m]] <- complete(mice, m)} # export imputations

现在在m个完整的数据集上训练m个模型:

library(randomForest)
rf <- NULL
for (m in 1:10){rf[[m]] <- randomForest(Y ~ ., data = impdat[[m]])}

选项1

中的combine函数randomForest可以聚合相同大小的树:

body(combine)[[4]] <- substitute(rflist <- (...))
rf.all <- combine(rf)

rf.all您的“合并”模型在哪里。如果我们测试它:

predictions <- predict(rf.all, within(dat.test, rm("Y")))
table(dat.test$Y, predictions)

    0  1
  0 70  1
  1  2 27

我们发现预测非常准确。

选项 2

第二种选择是将每个模型的投票集中在一起:

votes <- list()
for (m in 1:10){votes[[m]] <- predict(rf[[m]], 
                             within(dat.test, rm("Y")), 
                             type = "vote")}
votes <- Reduce('+', votes)
predictions <- NULL
for (i in 1:nrow(votes))
{if (votes[i,1] < votes[i,2])
    {predictions[i] = 1} else {predictions[i] = 0}}

注意type = "vote"在 的参数中的选择predict其他功能可能需要type = "prob".

> table(dat.test$Y, predictions) # mostly accurate
   predictions
     0  1
  0 70  1
  1  2 27

混淆矩阵是一样的。

投票池是基于树的模型的一种通用方法,它应该满足ranger对象和gbm对象。

如果目标是回归而不是分类,则汇集投票非常相似,但设置type = "response"predict(默认)。

rf <- NULL
for (m in 1:10){rf[[m]] <- randomForest(X1 ~ ., data = impdat[[m]])}
predictions <- list()
for (m in 1:10){predictions[[m]] <- predict(rf[[m]], 
                                      within(dat.test, rm("X1")),
                                      type = "response")}

predictions <- Reduce('+', predictions)/10 # divide by m

计算均方误差:

> mean((predictions - dat.test$X1)^2)
[1] 64.78884

这不是您问题的直接答案,我没有足够的声誉来发表评论,但您可以做的一件事是使用R中的机器学习。那里有许多随机森林学习器实现可以使用缺失值的数据。您还可以根据您的数据集调整学习器。

包和文档的链接在主教程页面上,这里:

https://mlr-org.github.io/mlr-tutorial/release/html/index.html

此外,请考虑如果您提供数据集样本,回答您的问题会变得更加容易。

如果您需要直接的答案,在估算的数据集上循环一系列 RF 调用可能会起作用。例如,如果您有五个插补:

res = data.frame(matrix(0,nrow=nrow(test),ncol=5)
for (i in 1:5){
  data = complete(miceResult, 1)
  rf.res = cforest(data,formula ~ [which formula?])
  res[,i] = predict(rf.res, test)
}

然后,您可以根据您的数据集通过多数投票或平均来汇总结果。您还可以将 5 个插补分组在一起,并使用组合数据集训练学习器。然而,这两种方法都不是最理想的。

希望这可以帮助。