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"]] <- 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 - 具有两个结果变量的随机森林的主要内容,如果未能解决你的问题,请参考以下文章