我有一个关于rpart和overfitting的问题。我的目标只是在预测上做得好。我的数据集很大,几乎有20000个点。使用这些点中的大约2.5%作为训练,我得到了大约50%的预测误差。但是使用97.5%的数据作为训练,我得到了大约30%。由于我使用了如此多的数据进行训练,我想可能存在过度拟合的风险。
我用随机训练/测试数据+修剪树1000次,如果我理解正确的话,这是某种交叉验证,我得到了非常稳定的结果(相同的预测误差和变量的重要性)。
即使我已经运行了1000次,并且预测误差是稳定的,过拟合仍然是一个问题吗?
我还有一个关于我的解释变量之间的相关性的问题。这在CART中会有问题吗(就像回归一样)?在回归中,我可能会使用Lasso来尝试修复相关性。如何修复与分类树的相关性?
当我绘制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
发布于 2018-01-11 01:53:25
这个问题相当复杂,很难全面回答。我将尝试提供一些见解和参考,以供进一步阅读。
在你的情况下我会用
z <- caret::createDataPartition(data$y, p = 0.6, list = FALSE)
train <- data[z,]
test <- data[-z,]为了将数据拆分成训练集和测试集,我将重复这个过程,用p = 0.5再次拆分测试集。
在训练数据上,我将使用随机森林上的this教程来调优mtry和ntree参数(扩展插入符号部分),使用插入符号和网格搜索中的5次重复交叉验证。
control <- trainControl(method = "repeatedcv", number = 5, repeats = 3)
tunegrid <- expand.grid(.mtry = c(1:15), .ntree = c(200, 500, 700, 1000, 1200, 1500))以此类推,如所提到的链接中所述。
最后,需要训练的数据越多,过度拟合的可能性就越小。
https://stackoverflow.com/questions/48187512
复制相似问题