在 R 中查看随机森林的预测值与实际值

Posted

技术标签:

【中文标题】在 R 中查看随机森林的预测值与实际值【英文标题】:Viewing your predicted to actual values in R for random Forest 【发布时间】:2013-12-26 04:51:56 【问题描述】:

所以我有一个 162 x 151 的数据集:-

RT (seconds)    76_TI2  114_DECC    120_Lop 212_PCD
38  4.086   1.2 2.322   0
40  2.732   0.815   1.837   1.113
41  4.049   1.153   2.117   2.354
41  4.049   1.153   2.117   3.838
42  4.56    1.224   2.128   2.38
42  2.96    0.909   1.686   0.972
42  3.237   0.96    1.922   1.202
44  2.989   0.8 1.761   2.034

我想使用 10 折交叉验证在其上构建一个随机森林模型,然后查看每个折叠的预测值和实际值。我正在使用 randomForest 包。我做到了:-

> set.seed(1500)
> model <- rfcv(x,y, cv.fold=10)

但我无法找到一种方法来简单地查看从每个折叠中获得的所有预测值以及与之对应的实际值。我该怎么做?

谢谢

【问题讨论】:

【参考方案1】:

为交叉验证获得的预测值存储在model$predicted[[1]],观测值是y。如果要分别查看每个折叠的预测值,则需要获取有关折叠拆分的信息。为此,您可以:

1) 手动拆分折叠并自己进行交叉验证

2) 使用caret

3) 稍微修改cvrf 以输出此信息 - 将idx 添加到输出列表中

rfcv2 <- function (trainx, trainy, cv.fold = 5, scale = "log", step = 0.5, 
          mtry = function(p) max(1, floor(sqrt(p))), recursive = FALSE, 
          ...) 

  classRF <- is.factor(trainy)
  n <- nrow(trainx)
  p <- ncol(trainx)
  if (scale == "log") 
    k <- floor(log(p, base = 1/step))
    n.var <- round(p * step^(0:(k - 1)))
    same <- diff(n.var) == 0
    if (any(same)) 
      n.var <- n.var[-which(same)]
    if (!1 %in% n.var) 
      n.var <- c(n.var, 1)
  
  else 
    n.var <- seq(from = p, to = 1, by = step)
  
  k <- length(n.var)
  cv.pred <- vector(k, mode = "list")
  for (i in 1:k) cv.pred[[i]] <- trainy
  if (classRF) 
    f <- trainy
  
  else 
    f <- factor(rep(1:5, length = length(trainy))[order(order(trainy))])
  
  nlvl <- table(f)
  idx <- numeric(n)
  for (i in 1:length(nlvl)) 
    idx[which(f == levels(f)[i])] <- sample(rep(1:cv.fold, 
                                                length = nlvl[i]))
  
  for (i in 1:cv.fold) 
    all.rf <- randomForest(trainx[idx != i, , drop = FALSE], 
                           trainy[idx != i], trainx[idx == i, , drop = FALSE], 
                           trainy[idx == i], mtry = mtry(p), importance = TRUE, 
                           ...)
    cv.pred[[1]][idx == i] <- all.rf$test$predicted
    impvar <- (1:p)[order(all.rf$importance[, 1], decreasing = TRUE)]
    for (j in 2:k) 
      imp.idx <- impvar[1:n.var[j]]
      sub.rf <- randomForest(trainx[idx != i, imp.idx, 
                                    drop = FALSE], trainy[idx != i], trainx[idx == 
                                                                              i, imp.idx, drop = FALSE], trainy[idx == i], 
                             mtry = mtry(n.var[j]), importance = recursive, 
                             ...)
      cv.pred[[j]][idx == i] <- sub.rf$test$predicted
      if (recursive) 
        impvar <- (1:length(imp.idx))[order(sub.rf$importance[, 
                                                              1], decreasing = TRUE)]
      
      NULL
    
    NULL
  
  if (classRF) 
    error.cv <- sapply(cv.pred, function(x) mean(trainy != 
                                                   x))
  
  else 
    error.cv <- sapply(cv.pred, function(x) mean((trainy - 
                                                    x)^2))
  
  names(error.cv) <- names(cv.pred) <- n.var
  list(n.var = n.var, error.cv = error.cv, predicted = cv.pred, idx = idx)

现在你可以打电话了

model <- rfcv2(x,y, cv.fold=10)
model$idx  # returns the folds split.

请注意,cvrf 函数不是为纯粹的交叉验证而设计的,而是为变量选择而设计的。因此,您执行了大量冗余计算。

【讨论】:

我做了所有这些,但由于某种原因,当我执行 'model$idx' 时,我只是得到 NULL 你需要调用修改后的函数cvrf2,而不是原来的。请参阅答案末尾的编辑。 哦,我明白了。有什么方法可以返回结果,使其具有预测结果和实际结果?因为我现在得到的回报是:-'[1] 6 2 1 5 2 3 7 10 9 6 1 7 7 9 5 2 3 7 4 10 7 1 8 2 4 [26] 1 6 4 5 8 4 5 9 4 4 6 10 3 6 3 5 9 9 1 3 5 2 3 2 10' 除非这是预测结果与实际结果,在这种情况下,我不知道它在说什么,因为我习惯于处理结果,例如:-'fold 1 Observations in test set: 16 7 11 12 24 33 38 52 67 72 预测 49.6 44.1 26.4 39.8 53.3 40.33 47.8 56.7 58.5 cvpred 575.0 -113.2 640.7 -1045.8 876.7 -5.93 2183.0 -.129.7 42.0 44.0 44.0 45.0 45.0 46.00 49.0 56.0 58.0' 这些是每个观察所属的折叠数。因此字符串“[1] 6 2 1 5 2 3 7 10 9 6 1 7 7 9 5 2 3 7 4 10 7 1 8 2 4 ...”表示第一种情况属于第6折,第二种情况属于第6折第二折,以此类推。然后只需要手动从model$predicted[[1]] 输出中收集预测并计算每个折叠的统计信息。

以上是关于在 R 中查看随机森林的预测值与实际值的主要内容,如果未能解决你的问题,请参考以下文章

分类算法 - 随机森林

随机森林中每棵树的平均绝对误差

随机森林中的R - 19个预测变量,1个因变量

在 R 中使用随机森林预测的不同结果

笔记+R︱风控模型中变量粗筛(随机森林party包)+细筛(woe包)

R 中的随机森林 - 19 个预测变量,1 个因变量