首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分类树可能过拟合,但具有稳定的预测误差

分类树可能过拟合,但具有稳定的预测误差
EN

Stack Overflow用户
提问于 2018-01-10 20:27:58
回答 1查看 343关注 0票数 0

我有一个关于rpart和overfitting的问题。我的目标只是在预测上做得好。我的数据集很大,几乎有20000个点。使用这些点中的大约2.5%作为训练,我得到了大约50%的预测误差。但是使用97.5%的数据作为训练,我得到了大约30%。由于我使用了如此多的数据进行训练,我想可能存在过度拟合的风险。

我用随机训练/测试数据+修剪树1000次,如果我理解正确的话,这是某种交叉验证,我得到了非常稳定的结果(相同的预测误差和变量的重要性)。

即使我已经运行了1000次,并且预测误差是稳定的,过拟合仍然是一个问题吗?

我还有一个关于我的解释变量之间的相关性的问题。这在CART中会有问题吗(就像回归一样)?在回归中,我可能会使用Lasso来尝试修复相关性。如何修复与分类树的相关性?

当我绘制cptree时,我得到了这个图:

cptree plot

这是我正在运行的代码(我已经重复了1000次,每次都有不同的随机分割)。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2018-01-11 01:53:25

这个问题相当复杂,很难全面回答。我将尝试提供一些见解和参考,以供进一步阅读。

  • 相关特征不会像使用超平面作为分类边界的模型那样对基于树的方法造成严重问题。当有多个相关特征时,树将只选择一个,其余的将被忽略。然而,相关特征通常会遮蔽此类模型的可解释性、掩码交互等。基于树的模型也可以从删除这些变量中受益,因为它们将不得不搜索较小的空间。Here是一个关于树的不错的资源。还可以看看这些视频123以及ISLR的书。基于一棵树的
  • 模型往往不如基于超平面的方法好。因此,如果您主要对预测的质量感兴趣,那么您应该探索基于一堆树的模型,例如baggingboosting模型。在R中流行的打包和提升实现是randomForestxgboost。两者都可以在几乎没有经验的情况下使用,并且可以产生良好的预测。Here是一个关于如何使用流行的R机器学习库caret来调优随机森林的资源。另一个资源是R mlr库,它为许多与ML相关的伟大事物提供了很好的包装器,例如基于模型的xgboost.
  • Re-sampling优化的here is a short blog post模型验证策略因任务和可用数据而异。对于20k行,我可能会使用超过50 -60%的训练,20%的验证和20 -30%的测试集。通过重复K折交叉验证(2-3次重复4-5折或类似),我将使用50%的测试集来选择合适的ML方法、特征、超参数等。我会使用20%的验证集来微调东西,并感受一下我在训练集上的交叉验证有多好。当我对所有事情都感到满意时,我会使用测试集作为最终的证明,我有一个很好的模型。以下是有关重新采样的一些资源:123nested resampling.

在你的情况下我会用

代码语言:javascript
复制
z <- caret::createDataPartition(data$y, p = 0.6, list = FALSE)
train <- data[z,]
test <- data[-z,]

为了将数据拆分成训练集和测试集,我将重复这个过程,用p = 0.5再次拆分测试集。

在训练数据上,我将使用随机森林上的this教程来调优mtryntree参数(扩展插入符号部分),使用插入符号和网格搜索中的5次重复交叉验证。

代码语言:javascript
复制
control <- trainControl(method = "repeatedcv", number = 5, repeats = 3)

tunegrid <- expand.grid(.mtry = c(1:15), .ntree = c(200, 500, 700, 1000, 1200, 1500))

以此类推,如所提到的链接中所述。

最后,需要训练的数据越多,过度拟合的可能性就越小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48187512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档