R包party中的随机森林在随机数据上过拟合。

9

我正在研究随机森林分类。

我发现“party”包中的cforest通常比“randomForest”表现更好。
但是,似乎cforest容易过拟合。

一个玩具例子

这是一个随机数据集,包含来自rnorm()生成的二元因子响应和10个数值变量。

# Sorry for redundant preparation.
data <- data.frame(response=rnorm(100))
data$response <- factor(data$response < 0)
data <- cbind(data, matrix(rnorm(1000), ncol=10))
colnames(data)[-1] <- paste("V",1:10,sep="")

执行cforest,使用无偏参数集(可能建议使用)。

cf <- cforest(response ~ ., data=data, controls=cforest_unbiased())
table(predict(cf), data$response)
#       FALSE TRUE
# FALSE    45    7
# TRUE      6   42

在没有意义的数据上,预测表现相当不错。

另一方面,随机森林算法是诚实的。

rf <- randomForest(response ~., data=data)
table(predict(rf),data$response)
#       FALSE TRUE
# FALSE    25   27
# TRUE     26   22

这些差异是从哪里来的?
恐怕我使用cforest的方式不对。

让我在cforest中添加一些额外的观察:

  1. 变量数量并没有对结果产生太大影响。
  2. 与使用一些现实的解释变量相比,变量重要性值(由varimp(cf)计算)相当低。
  3. ROC曲线的AUC接近1。

我将感激您的建议。

附加说明

有人想知道为什么要将训练数据集应用于predict()。
我没有准备任何测试数据集,因为预测是针对OOB样本进行的,这对于cforest来说并不正确。
参见 http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm


1
为什么要使用训练模型的数据来评估模型呢? - David
2个回答

9
你无法通过研究分类器在训练集上的表现来了解其真实性能。此外,由于没有真正的模式可供发现,你无法确定像这样过度拟合,还是像那样随机猜测更糟。你只能说这两种算法遵循了不同的策略,但如果你在新的未见过的数据上测试它们,两者都可能失败。
估计分类器性能的唯一方法是在外部数据上进行测试,在这种情况下你知道有一个模式需要找到。
一些评论如下: 1. 如果没有任何有用的信息,则变量的数量不应该有影响。 2. 看到对于毫无意义的数据,变量重要性较低是好事。这可以作为该方法的健全性检查,但可能并不重要。 3. AUC(或任何其他性能指标)在训练集上并不重要,因为获得完美的分类结果是微不足道的。

4
请注意,对于正常的randomForestpredict方法返回袋外预测结果。虽然这种方法可能不如使用完全不同的测试集,但也不像在实际训练集上返回预测结果。我认为,cforest的predict方法默认情况下不是这样的,但我认为有一个OOB参数可以改变它。 - joran
那是我本应该知道的事情。可惜我一直以为cforest处理OOB估计与randomForest相同。 - dytori

3

predict方法在cforestrandomForest模型中有不同的默认值。分别使用party:::predict.RandomForest来获取预测结果。

function (object, OOB = FALSE, ...) 
    {
        RandomForest@predict(object, OOB = OOB, ...)
    }

so

table(predict(cf), data$response)

理解我

        FALSE TRUE
  FALSE    45   13
  TRUE      7   35

相反地

table(predict(cf, OOB=TRUE), data$response)

理解我

        FALSE TRUE
  FALSE    31   24
  TRUE     21   24

这是一个相当令人失望的结果。

请注意,尽管OOB误差可以作为一种简单的重复保留测试方法,但最好还是进行真正的测试(因为真正测试中的模型更类似于您将在所有数据上拟合的最终模型)。 - Backlin
@Backlin同意。OOB不应该被用作良好实践的替代品。 - Noah
感谢您提醒我忽略了OOB参数。然而,我认为对于RF来说,使用外部数据集进行估计是很自然的,因为这会引起交叉验证的需求。 - dytori
在我的书中,拥有大量的外部数据集是估计性能的最佳方式。如果你没有很多数据,你可以进行重复保留或(重复)交叉验证来更好地利用你所拥有的有限数据。OOB错误是一个不错的想法,可能会给你类似于保留或CV的结果,但我不完全确定它的行为如何,更喜欢坚持我知道有效的方法。 - Backlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接