r-为什么我的随机森林模型的结果没有捕捉到我的一个预测变量的变化



我正试图利用一个随机森林来创建一个模型,但我从这个模型中得到的预测似乎是相同的,即使我的";组";变量变化。这是我的代码:

test = randomForest(Preg.ended ~ Group*prop_score_b, data = train_prop)
perio_treat <- perio_cont <- test_prop
perio_treat$Group = "T"
perio_cont$Group = "C"
pred1_preg_b <- predict(test, newdata = perio_treat, type = "response")
pred0_preg_b <- predict(test, newdata = perio_cont, type = "response")
ATE_preg_b <- mean(pred1_preg_b - pred0_preg_b)
print(ATE_preg_b, digits = 3)

总之:我的模型是用二进制因变量Preg.ended(0或1(、预测变量Group(T或C的分类值(和prop_score_b(0和1之间的连续变量(建立的。我将数据划分为train_proptest_prop,它们具有等效的列,并对数据进行随机的2/3到1/3的划分。我想做的是看看如果我的所有测试数据都有Group=T,与Group=C相比,我会得到什么结果。这两者之间的差的平均值应该有意义,但我得到的结果是零,因为pred1_preg_bpred0_preg_b中的所有值彼此完全相同。因此,这会告诉我,Group值的变化在我的预测中毫无意义,我不明白为什么,因为它已经构建在我的模型中了。

我确实已经验证了我的train_prop数据集的Group值为C和T,因此它在结果中应该具有一定的预测价值。

有什么建议吗?

由于您的代码不可复制,很难猜测会发生什么。这可能是由数据的维度造成的。例如,如果你有一些观察结果,它可能会发生你所描述的事情。此外,在预测二元结果时,二元预测器可能是无用的。查看变量在模型中的重要性。您的Group变量的重要性可能很低。看看这个例子:

library(randomForest)
set.seed(4)
df <- data.frame(out=as.factor(sample(0:1,1000,replace = T)),group=sample(c("C","T"),100,replace = T),score=runif(100))
index <- sample(1:nrow(df),round(nrow(df)*2/3))
train <- df[index,]
test <- df[-index,]
rf <- randomForest(out ~ group*score, data = train,mtry=1)
varImpPlot(rf)
importance(rf)
test1 <- test2 <- test
test1$group = "T"
test2$group = "C"
pred <- predict(rf, newdata = test)
pred1_preg_b <- predict(rf, newdata = test1)
pred0_preg_b <- predict(rf, newdata = test2)
ATE_preg_a <- mean(as.numeric(pred) - as.numeric(pred1_preg_b))
ATE_preg_b <- mean(as.numeric(pred) - as.numeric(pred0_preg_b))
ATE_preg_c <- mean(as.numeric(pred1_preg_b) - as.numeric(pred0_preg_b))

这里,两个预测(pred1_preg_bpred0_preg_b(是不同的。但如果你试图改变种子,你可能会得到两个预测相同的结果。您可以通过运行此代码(例如10000次(来计算获得不同结果的概率。

result <- as.list(1:10000)
for (i in 1:10000) {
rf <- randomForest(out ~ group*score, data = train,mtry=1)
test1 <- test2 <- test
test1$group = "T"
test2$group = "C"
pred1_preg_b <- predict(rf, newdata = test1)
pred0_preg_b <- predict(rf, newdata = test2)
result[[i]] <- mean(as.numeric(pred1_preg_b) - as.numeric(pred0_preg_b))

}
sum(result==0)

在这个模拟中,我对test1test2~64%的时间获得了相同的预测。当然,这是一种需要更多研究的奇怪行为,但目前最可能的原因是结果和二进制预测器之间的低相关性,这导致RF模型的变量重要性非常低

最新更新