最近有人告诉我,我遵循的过程(MS论文的组成部分)可能被认为过拟合。我希望对此有更好的了解,看看其他人是否同意。
本文这一部分的目的是
在数据集上比较梯度提升回归树与随机森林的性能。
查看所选最终模型(GBM或RF)的性能。
正在使用R中的gbm
和randomForest
软件包以及
caret
。
遵循的过程如下:
- 数据的初步预处理(例如,将名义上的预测变量的缺失值插入称为“缺失”的不同类别)。没有考虑任何预处理的目标变量(这是非常小的)。
- 为每种算法的元参数创建值的网格(例如,GBM的迭代次数)。
- 创建数据集的25个随机分割(65%训练和35%测试)。
对GBM重复以下步骤25次(每次使用随机训练/测试分组之一。每次,训练和测试集都是课程更改的“当前”,这是重复的离开组交叉验证):
- 使用5倍交叉验证在网格搜索上找到算法的“最佳”参数设置。当前运行中没有使用先前运行中的任何东西。
- 确定后,将模型拟合到完整的“当前”训练集并预测“当前”测试集。保留此运行的性能指标。
一旦以这种方式获得了25个性能指标(实际上是特定于领域的指标,但将其视为准确性),请使用完全相同的过程,使用完全相同的独立训练和测试样本进行RF(相同过程,只是使用不同的方法)当然是网格搜索)。
现在,我从当时针对GBM和RF的“当前”测试集中获得了25种性能指标。我使用Wilcoxon符号秩检验和排列检验比较它们。我发现GBM更好。我还声称,GBM的这25次运行中的性能指标分布是最终GBM分类器的预期性能。
我没有做的是从一开始就抽取一个随机测试集,并将其放在一边,以便与根据所有训练数据构建的最终GBM模型进行比较。我认为我所做的实际上要好得多,因为我在保持过程中重复了拆分数据/调优模型/测试25次,而仅重复了一次。
这里有过度拟合吗?由于使用了25个运行来选择GBM与RF,这是否意味着从流程中获取的性能指标不能用作完整模型的性能估算?
编辑 为了回应韦恩的评论,这是在25次运行中的每一次运行的过程:
- 第i个训练集(i = 1,..,25)的采样数据分为5个大小相等的组。使用5组中的4组拟合模型,并将GBM参数(例如,迭代数)设置为等于第j个网格(j = 1,..,18)中的值。
- 使用此模型计算第五组的表现。
- 步骤1和步骤2再重复4次(常规旧k倍CV,k = 5)。该性能是从5个子运行中平均得出的,这用特定的一组参数值组成了GBM的预期性能。
- 对网格中的其他17个“行”重复执行步骤1-3。
一旦完成,就可以确定上述练习中的最佳参数值,并使用这些参数值和完整的第i个训练集拟合GBM。它的性能是在第i个测试集上估计的。
一旦整个过程完成25次,GBM就有25种性能指标。然后他们以完全相同的方式收集到RF。
在比较和选择GBM之后,我查看了这25个性能指标,并采用均值和标准差来确定该数据上GBM模型的置信区间。