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


10

我正在R中使用randomForest包来开发随机森林模型,以试图解释“宽”数据集中的连续结果,其预测因子比样本多。

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

我正在使用先前在此处发布方法,测试该模型对保留测试集的实际结果的预测效果如何,即

...或在R中:

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

但是现在我可以添加大约25个预测变量。当使用〜100个预测变量集时,R²较高。我要统计测试,换句话说,使用set〜100预测的时候,做了模型试验显著更好比使用〜75个预测模型拟合测试数据。即,测试射频模型在整个数据集上的拟合度所产生的R²明显高于测试射频模型在缩减后的数据集上进行拟合所产生的R²。

这对我来说很重要,因为这是试验数据,要获得额外的25个预测指标非常昂贵,而且我需要知道是否应该在较大的后续研究中为这些预测指标进行测量。

我正在尝试考虑某种重采样/置换方法,但是什么也没想到。

Answers:


8

交叉验证!在插入符号中使用火车功能以适合您的2个模型。使用一个mtry值(两个模型都相同)。插入符号将返回RMSE和的重新采样估计值。R2

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


我同意,除了您忽略了OP应该使用R平方调整,因为这是设计的目的。这些模型的Y相同,但预测变量集不同,因此需要对R平方进行调整,以补偿所花费的自由度/模型复杂度方面的差异。我看到的另一个问题可能是样本量问题。OP会需要大量的样本,才能真正寄希望于这不仅仅是过拟合,即使使用简历也是如此。
LSC

@LSC我要说的是,如果of支持额外的数据集(不用于选择),他们可以不经调整就使用R2,因为它只是标准化的RMSE。我同意他们需要一个相当大的数据集来执行此操作。
扎克

与25个预测变量模型中的R平方相比,将新数据或旧数据(所有其他常量保持不变)将100个项与25个模型进行比较时,未调整的R平方将更高。在计算两者之间的平方误差总和时,这很容易看出(更多的项是较低的SSE,其他所有条件都相同)。我认为人们常常会忘记,更多的项永远不会降低R平方,但是如果相对于其值而言,它们会发臭,则可以降低调整后的R平方,这是一种更好的衡量方法。
LSC

“更多的项将永远不会减小R平方” <-当从样本中计算R2时,此陈述是错误的。
扎克

正如我所提到的,我指出这一点是因为许多人问这些问题最初并不记得这个想法。我认为,了解为什么这在样本中是正确的,而可能无法保留新数据对于了解原始方程式中优化的内容和方式非常重要。
LSC

4

我同意Zach的观点,最好的办法是对两个模型进行交叉验证,然后比较,例如,通过收集每个折叠的值并将所得向量与Wilcoxon检验进行比较(成对为k倍,成对为随机,简历)。R2

侧面选项是使用所有相关的特征选择,这将告诉您哪些属性有机会显着用于分类-因此,这些昂贵的属性值得其价格。例如,可以使用RF包装器Boruta完成此操作


对于配对测试,我假设2个模型在相同的折痕上合适吗?因此,矩阵的k行是折叠,两列是模型1和模型2?
B_Miner

@B_Miner精确地。

1

您可能想从实际意义而非统计意义(或两者)上进行思考。有了足够的数据,您可以发现统计上有意义的事物,这些变化不会对您的使用产生实际影响。我记得曾经分析过一次模型,其中五向相互作用在统计上是显着的,但是当将模型(包括直到五向相互作用的所有事物)的预测与仅包含两向相互作用和主要效应的模型的预测进行比较时, ,最大的差异是少于1人(响应是人数,所有有趣的值都远离0)。因此增加的复杂性是不值得的。因此,请查看您的预测中的差异,看看差异是否足以证明额外费用合理,如果不是,那为什么还要找统计意义呢?如果差异足够大,足以证明成本是真实的话,那么我会建议使用交叉验证。


1

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

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))

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


0

由于randomForest在交叉验证后已经在使用,您可能会发出所选拟合度的预测因子重要性值计算。

> require(randomForest)
> rf.fit = randomForest(Species~.,data=iris,importance=TRUE)
> rf.fit$importance
                  setosa   versicolor   virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length 0.036340893  0.021013369 0.032345037          0.030708732         9.444598
Sepal.Width  0.005399468 -0.002131412 0.007499143          0.003577089         2.046650
Petal.Length 0.319872296  0.297426025 0.290278930          0.299795555        42.494972
Petal.Width  0.343995456  0.309455331 0.277644128          0.307843300        45.286720

0

我看到这个问题已经很久以前问过了。但是,尚无答案指出该问题中的重大缺陷和误解。

请注意:

  1. 您声明R ^ 2 = ESS / TSS = 1-RSS / TSS。这仅在线性情况下正确。TSS = RSS + ESS等式仅在具有截距的线性回归中成立。因此,您不能将这些定义用于随机森林。这就是为什么RMSE和类似物是更典型的损失函数。

  2. 更重要的是出于统计目的:R ^ 2遵循未知分布(也在线性设置中)。这意味着使用R ^ 2检验具有统计意义的假设不是那么简单。正如Zach提到的,交叉验证是一个不错的选择。

对于user88响应:使用Wilcoxon测试进行交叉验证是一种有效的方法。最近的一篇论文使用Wilcoxon符号秩检验和Friedman检验来比较不同的方法和算法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.