R - 具有两个结果变量的随机森林

Posted

技术标签:

【中文标题】R - 具有两个结果变量的随机森林【英文标题】:R - RandomForest with two Outcome Variables 【发布时间】:2017-06-30 21:41:07 【问题描述】:

在这里使用randomForest 统计包相当新。

我正在尝试运行具有 2 个响应变量和 7 个预测变量的模型,但由于响应变量的长度和/或使用 2 个响应变量拟合模型的性质,我似乎无法运行。

假设这是我的数据和模型:

> table(data$y1)
 0  1  2  3  4 
23 43 75 47 21 

> length(data$y1)
0  4

> table(data$y2)
  0   2   3   4 
104  30  46  29

> length(data$y2)
0  4 

m1<-randomForest(cbind(y1,y2)~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)

当我运行这个模型时,我收到这个错误:

Error in randomForest.default(m, y, ...) : 
  length of response must be the same as predictors

我做了一些故障排除,发现cbind()这两个响应变量只是将它们的值放在一起,从而使原来的长度增加了一倍,并可能导致上述错误。例如,

length(cbind(y1,y2))
> 418
t(lapply(data, length()))
>  a   b   c   d   e   f   g   y1   y2
 209 209 209 209 209 209 209  209  209

然后我尝试通过在每个响应变量上单独运行 randomForest 来解决此问题,然后在回归模型上应用 combine(),但遇到了以下问题:

m2<-randomForest(y1~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)
m3<-randomForest(y2~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)
combine(m2,m3)

Warning message:
In randomForest.default(m, y, ...) :
The response has five or fewer unique values.  Are you sure you want to do regression?

然后我决定将randomForest 模型视为分类模型,并在运行randomForest 之前将as.factor() 应用于两个响应变量,但后来遇到了这个新问题:

m4<-randomForest(as.factor(y1)~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)
m5<-randomForest(as.factor(y2)~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)
combine(m4,m5)

Error in rf$votes + ifelse(is.na(rflist[[i]]$votes), 0, rflist[[i]]$votes) : 
  non-conformable arrays

我的猜测是我不能combine()分类模型。

我希望我对尝试运行多元随机森林模型的调查是有意义的。让我知道是否还有其他问题。我也可以回去做调整。

【问题讨论】:

当您说两个结果变量时,您的意思是二进制分类,例如A vs B,或者您的意思是响应变量一是 A vs B,响应变量二是 C vs D(并且基本上总共预测了四个结果)?因为我们看不到您的数据,所以有点棘手。 @zacdav 好问题。每个响应变量有 5 个不同的类别。我希望这回答了你的问题。我会在原帖中进行调整。 在这种情况下,您可能只需将两个响应列连接在一起就可以了 - 要记住的是,可能需要预测 25 个分类结果,如果样本数量较少,您将不太可能产生有效的模型。我不知道它是否会有所不同,但通过简单地创建两个模型,您可以独立评估每个响应的预测能力,然后运行两个模型并再次独立地连接每个样本的结果。这将达到你想要的combine @zacdav 但是连接响应变量不会将所有值放在一列中,并且响应变量长度与预测变量不匹配的问题再次出现? 您不会使用cbind,我建议事先处理数据并避免在randomForest 函数调用中进行任何操作。因此,data[["y3"]] &lt;- paste0(data$y1, data$y2) 然后randomForest(y3~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE) 【参考方案1】:

在 randomForest 公式之外组合您的列:

data[["y3"]] <- paste0(data$y1, data$y2)
randomForest(y3~a+b+c+d+e+f+g, data, mtry=7, importance=TRUE)

【讨论】:

刚刚运行模型,您说得对,样本量会影响整体模型拟合。 刚刚问了一个小问题:paste0() 不是假设这两个变量不是相互独立的吗? 数据的上下文确实可以提供有关如何指导适当方法的见解。我不认为将它们组合起来假设依赖,因为它并不意味着它们之间存在任何层次结构,只是它们在组合时是离散的。但我不太确定我在这里的答案。你想用这个模型回答什么。 那里有公平的回应。理想情况下,我想基于最佳模型进行预测(例如比较 Y-hat 和 Y,绘制 Y-hat 与 Y 等),该模型使用不同的度量(例如 MSE、方差解释等)进行评估。希望我的回答有意义。 重要的是要了解,您将得到的本质上是某个样本属于给定分类结果的概率(取决于设置,randomForest 只会返回分类结果)。这不是回归树。您的响应变量应编码为因素,以确保 randomForest 不会意外使用回归。您可以绘制每个样本已被分配用于其预测的确定性吗?

以上是关于R - 具有两个结果变量的随机森林的主要内容,如果未能解决你的问题,请参考以下文章

r语言随机森林结果规则怎么显示

R:如何使用随机森林来预测使用字符串变量的二进制结果?

机器学习:R语言实现随机森林

具有 NaN 值的随机森林

如何更改 R 中随机森林的分割标准?

如何使用 R 在随机森林中生成决策树图和变量重要性图?