[英]Possibly overfitted classification tree but with stable prediction error
我对rpart和过度拟合有疑问。 我的目标只是在预测上做得好。 我的数据集很大,几乎是20000点。 使用约2.5%的点作为训练,我得到约50%的预测误差。 但是使用97.5%的数据作为训练,我得到了大约30%。 由于我在训练中使用了大量数据,因此我认为存在过度拟合的风险。
我使用随机训练/测试数据+修剪树运行了1000次,如果我正确理解它的话,这是一种交叉验证,并且我得到的结果非常稳定(相同的预测误差和变量的重要性)。
即使我已经运行1000次并且预测误差是稳定的,过度拟合仍然会是一个问题吗?
我还对我的解释变量之间的相关性有疑问。 这在CART中是否会成为问题(与回归一样)? 在回归中,我可能会使用套索尝试修正相关性。 如何修复与分类树的相关性?
当我绘制cptree时,我得到此图:
这是我正在运行的代码(我已经用不同的随机分割重复了1000次)。
set.seed(1) # For reproducability
train_frac = 0.975
n = dim(beijing_data)[1]
# Split into training and testing data
ii = sample(seq(1,dim(beijing_data)[1]),n*train_frac)
data_train = beijing_data[ii,]
data_test = beijing_data[-ii,]
fit = rpart(as.factor(PM_Dongsi_levels)~DEWP+HUMI+PRES+TEMP+Iws+
precipitation+Iprec+wind_dir+tod+pom+weekend+month+
season+year+day,
data = data_train, minsplit = 0, cp = 0)
plotcp(fit)
# Find the split with minimum CP and prune the tree
cp_fit = fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"]
pfit = prune(fit, cp = cp_fit)
pp <- predict(pfit, newdata = data_test, type = "class")
err = sum(data_test[,"PM_Dongsi_levels"] != pp)/length(pp)
print(err)
链接到beijing_data(作为RData文件,以便您可以重现我的示例) https://www.dropbox.com/s/6t3lcj7f7bqfjnt/beijing_data.RData?dl=0
这个问题非常复杂,很难全面回答。 我将尝试提供一些见识和参考,以供进一步阅读。
对于基于树的方法,相关特征不会像使用超平面作为分类边界的模型那样严重。 当有多个相关特征时,树将只选择一个,其余的将被忽略。 但是,相关的特征通常会模糊这种模型的解释性,蒙版交互作用等。 基于树的模型也可以从此类变量的删除中受益,因为它们将不得不搜索较小的空间。 这是树木上的体面资源。 还要检查这些视频1 , 2和3和ISLR书。
基于一棵树的模型的性能往往不如基于超平面的方法。 因此,如果您主要对预测质量感兴趣,则应基于一堆树探索模型,例如装袋模型和增强模型。 R中的套袋和增强的流行实现是randomForest和xgboost 。 两者都几乎没有经验就可以利用,并且可以带来良好的预测。 这是有关如何使用流行的R机器学习库插入符号来调整随机森林的资源。 另一个资源是R mlr库,它为与ML相关的许多重要事物提供了出色的包装,例如, 这是一篇有关基于模型的xgboost优化的简短博客文章 。
在您的情况下,我会使用
z <- caret::createDataPartition(data$y, p = 0.6, list = FALSE)
train <- data[z,]
test <- data[-z,]
分割数据以训练和测试集,然后我将重复此过程以p = 0.5
再次分割测试集。
在火车数据上,我将在随机森林上使用本教程,通过在插入符号和网格搜索中进行5次重复交叉验证来调整mtry
和ntree
参数(扩展插入符号部分)。
control <- trainControl(method = "repeatedcv", number = 5, repeats = 3)
tunegrid <- expand.grid(.mtry = c(1:15), .ntree = c(200, 500, 700, 1000, 1200, 1500))
等等,如上述链接中所述。
最后一点,您需要训练的数据越多,适合的可能性就越小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.