我正在研究随机森林分类。
我发现“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中添加一些额外的观察:
- 变量数量并没有对结果产生太大影响。
- 与使用一些现实的解释变量相比,变量重要性值(由varimp(cf)计算)相当低。
- ROC曲线的AUC接近1。
我将感激您的建议。
附加说明
有人想知道为什么要将训练数据集应用于predict()。
我没有准备任何测试数据集,因为预测是针对OOB样本进行的,这对于cforest来说并不正确。
参见 http://www.stat.berkeley.edu/~breiman/RandomForests/cc_home.htm