比较两个不同随机森林模型的 R 平方

机器算法验证 r 机器学习 假设检验 模型选择 随机森林
2022-03-06 12:24:55

我正在使用 R 中的 randomForest 包来开发一个随机森林模型,以尝试解释具有比样本更多的预测变量的“宽”数据集中的连续结果。

具体来说,我正在拟合一个 RF 模型,该模型允许该过程从一组 ~75 个我认为很重要的预测变量中进行选择。

我正在测试该模型预测保留测试集的实际结果的能力,使用之前发布的方法,即,

...或在 R 中:

1 - sum((y-predicted)^2)/sum((y-mean(y))^2)

但现在我可以添加额外的约 25 个预测变量。当使用约 100 个预测变量的集合时,R² 更高。我想在统计上对此进行测试,换句话说,当使用约 100 个预测变量的集合时,模型在测试数据中的测试是否明显优于使用约 75 个预测变量的模型拟合。即,在完整数据集上测试 RF 模型拟合的 R² 是否显着高于在缩减数据集上测试 RF 模型的 R²。

这对我来说很重要,因为这是试验数据,获得额外的 25 个预测变量很昂贵,我需要知道我是否应该付费在更大的后续研究中测量这些预测变量。

我正在尝试考虑某种重采样/排列方法,但什么都没有想到。

4个回答

交叉验证!使用插入符号中的train函数来拟合您的 2 个模型。使用一个 mtry 值(两种模型相同)。Caret 将返回重新采样的 RMSE 估计值和R2.

请参阅插入符号插图的第 3 页(也在完整的参考手册中)

我同意 Zach的观点,最好的办法是交叉验证两个模型,然后比较R2s,例如通过从每个折叠中收集值并将结果向量与 Wilcoxon 检验进行比较(k 折叠配对,随机 CV 不配对)。

另一个选项是使用所有相关的特征选择,这会告诉你哪些属性有可能对分类非常有用——因此,那些昂贵的属性是物有所值的。例如,可以使用 RF 包装器Boruta来完成。

您可能需要考虑实际意义而不是统计意义(或两者兼而有之)。有了足够的数据,您就可以找到对您的使用没有实际影响的统计意义重大的事情。我记得曾经分析过一个模型,其中 5 向交互作用在统计上显着,但是当模型的预测(包括直到 5 向交互作用的所有内容)与仅包括 2 向交互作用和主效应的模型的预测值进行比较时,最大的差异小于 1 人(响应为人数,所有有趣的值都远离 0)。所以增加的复杂性是不值得的。所以看看你的预测中的差异,看看这些差异是否足以证明额外成本是合理的,如果不是,那么为什么还要费心寻找统计意义呢?如果差异大到足以证明成本是真实的,那么我支持使用交叉验证的其他建议。

一种选择是为均方误差创建置信区间。我会使用均方误差而不是R2因为两个模型的分母相同。Dudoit 和 van der Laan 的论文(文章工作论文)为构建任何风险估计器的置信区间提供了一般定理。使用 iris 数据中的示例,这里是一些使用该方法创建 95% 置信区间的 R 代码:

library(randomForest)
data(iris)
set.seed(42)

# split the data into training and testing sets
index <- 1:nrow(iris)
trainindex <- sample(index, trunc(length(index)/2))
trainset <- iris[trainindex, ]
testset <- iris[-trainindex, ]

# with species
model1 <- randomForest(Sepal.Length ~ Sepal.Width + Petal.Length +
   Petal.Width + Species, data = trainset)
# without species
model2 <- randomForest(Sepal.Length ~ Sepal.Width + Petal.Length + 
   Petal.Width, data = trainset)

pred1 <- predict(model1, testset[, -1])
pred2 <- predict(model2, testset[, -1])

y <- testset[, 1]
n <- length(y)

# psi is the mean squared prediction error (MSPE) estimate
# sigma2 is the estimate of the variance of the MSPE
psi1 <- mean((y - pred1)^2)
sigma21 <- 1/n * var((y - pred1)^2) 
# 95% CI:
c(psi1 - 1.96 * sqrt(sigma21), psi1, psi1 + 1.96 * sqrt(sigma21))

psi2 <- mean((y - pred2)^2)
sigma22 <- 1/n * var((y - pred2)^2) 
# 95% CI:
c(psi2 - 1.96 * sqrt(sigma22), psi2, psi2 + 1.96 * sqrt(sigma22))

该方法还可以扩展为在交叉验证中工作(不仅仅是如上所示的样本拆分)。