R / caret:训练和测试集与交叉验证?


9

这可能是一个愚蠢的问题,但是当使用插入符号生成模型并使用诸如LOOCV或(甚至更重要)时LGOCV,如果这实际上是交叉验证步骤的话,将数据分为训练集和测试集有什么好处?反正吗?

我阅读了一些相关的问题,他们建议一些交叉验证方法(例如,在插入符号处描述的方法)是出于特征选择的目的。但就我而言,我使用的是randomForestmethod = "rf")和kernlabmethod = svmRadial),它们在试图清除预测变量的组中未列出。

所以,我的问题是,如果我使用类似的方法cross_val <- trainControl(method = "LGOCV", p = 0.8),那与对80%的数据进行训练,对其余20%的数据进行测试所得模型并反复进行以了解模型是否有效?

如果是这样,是否有必要将我的数据分为训练/测试集?

PS:我在根据经验生成的DOE原型进行模型处理时会提出一些要求(想想一些硬货,我们会调整输入,然后使用测试方法来测量该原型的各种属性)。

因此,我没有庞大的数据集,可以使用许多重叠的预测变量级别进行建模-我们经常在每个DOE兴趣点进行一次试验,因为在这种情况下,数据生成非常昂贵。因此,我想使用所有可能的数据建立一个准确的模型,但我想在这里检查一下,我没有遗漏明显的东西,也没有通过拆分来制作一个不好的模型。


编辑:针对@topepo的问题,我正在根据调整配方的化学输入来对化合物的物理测量属性进行建模。我无法讨论我的实际应用,但是我将基于配制内部乳胶​​漆组成一个示例。我正在运行设计的实验,我们将4-5种化学物质混合在一起,也许与%的固体混合,并花费一定的时间加热聚合物溶液以调节聚合度。

然后,我们可以测量流变性,分子量,油漆涂层的硬度,耐水性等。

我们有几个变量的不错的复制品,但是从每个DOE级别完全相同的意义上讲,真正复制品很少。总数据集为〜80个观察值,也许4-5是精确重复。我们已经进行了15种不同的测试,也许对每个观察都进行了5-6次测试。对于25-50%的数据,存在一些响应。

从这里开始,我们想对输出的属性上的7个预测变量的效果进行建模,然后进行优化以定位最有可能提供所需属性的新设计空间。

(因此,请在这里提出我的问题。一旦我拥有训练有素的模型,最好进行“反向”操作并输入所需的响应,以在可能的输入水平上获得最佳的猜测,然后再尝试)。



@sashkello谢谢你。可以将其作为副本关闭,以某种方式我完全错过了这个问题。可能有一个遗漏的地方:如果与一起训练data_set1,我如何看待LGOCV交叉验证执行的步骤?从我的阅读中,我假设1)caret遍历调整参数data_set1,然后2)固定这些参数,然后3)使用#1的参数为每个p = 0.8样本创建一个“子模型” ,data_set1并测试其余0.2的预测以衡量准确性。这是一个合理的总结吗?
亨迪

另一个遗漏的地方:遗漏测试集是否完全有助于模型准确性?听起来它为将来的测试提供了公正的条件。如果数据有限并且没有太多重叠的设计点,我是否最好进行全套培训并依靠交叉验证来进行准确性评估?
亨迪

使用更好的搜索策略,这将是非常有用的一种:stats.stackexchange.com/questions/9357/…。特别是这样的“我认为这里的一个限制因素是您拥有多少数据。在大多数情况下,我们甚至根本不想将数据拆分为固定的分区,因此是CV。” 我认为这是我的问题(可能特定于我的数据的有限性质(仅80个观测值)。似乎在这种情况下不投票赞成投票?
亨迪

Answers:


7

我的一般想法:

因此,当您评估不同的模型时,您可能需要对其进行调整,尝试不同类型的预处理等,直到找到您认为好的模型为止。重采样可以帮助您在此过程中朝正确的方向发展。

但是,仍然存在过度拟合的机会,这种情况发生的几率很大程度上受到您拥有的数据(和预测变量)的影响。如果您有少量数据,可以考虑以下几种方法:

  • 使用所有数据进行训练,因为每个数据点都会大大提高模型的效果。
  • 保留一个小的测试集,以最终检查由于过度拟合导致的总体错误。小样本量过拟合的机会并不小,并且随着样本数量的增加而增加。

我属于第二个阵营,但第一个根本没有错。

如果您有大量的数据,那实际上并没有多大关系(除非您的事件率很小)。

为了你:

您有一个DOE。设计类型将有助于回答问题。您是要在设计点之间插值还是要预测到目前为止尚未测试的设计点?

您有一个副本。我跌倒了,就像随机森林正在用大铁锤砸钉子,可能会导致过度拟合。我会尝试更平滑的东西,例如SVM或(gasp)神经网络。

最高


我在上面为您添加了一个更新。我的曲线非常好(我想那是主观的)method = "svmRadial"。我希望评估其他一些,包括method = neuralnet,尽管在过去的尝试中我发现神经网络对set.seed()非常敏感。简而言之,我们正在尝试1)更好地理解输入/多个响应之间的关系,以及2)在最可能的设计空间做出最佳猜测以产生所需的属性,以便我们可以运行新的,更专注的DOE,而不是更典型的DOE。尝试使用输入最小/最大级别的扩展/ shot弹枪方法。
亨迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.