确保这一点的一种方法是确保您已对所有适合模型的工作进行了编码,甚至是“修补”。这样,当您重复运行流程(例如通过交叉验证)时,可以使运行之间保持一致。这样可以确保通过交叉验证过程捕获所有潜在的变异源。
另一个至关重要的事情是确保两个数据集中都有代表性的样本。如果您的数据集不能代表您期望用来预测的数据类型,那么您将无能为力。所有建模都基于“归纳法”起作用的假设-我们未观察到的事物的行为类似于我们所观察到的事物。
一般来说,除非(i)您知道自己在做什么,并且(ii)您尝试过较简单的方法,发现它们不起作用,以及复杂方法如何解决问题,否则请远离复杂的模型拟合过程。简单方法的问题。“简单”和“复杂”是指对进行装配的人而言“简单”或“复杂”的意思。之所以如此重要,是因为它允许您将我喜欢的“嗅探测试”应用于结果。结果看起来正确吗?您无法“闻”到您不了解的过程的结果。
注意:我的答案的下一个相当长的部分是基于我的经验,该经验位于 区域,其中可能很大。我几乎可以肯定,下面接下来将不适用于或的情况下N>>p p N≈p N<p
当您有大量样本时,只要您的建模不太“局部”,使用和不使用给定观察值之间的差异就很小。这是因为给定数据点的影响通常是的顺序。因此,在大型数据集中,从“提供”测试数据集中获得的残差与在训练数据集中使用它获得的残差基本相同。您可以使用普通的最小二乘法来显示。从第个观察值中排除后得到的残差(即,如果将观察值放入测试集中将导致测试集错误)是,其中是训练残差,1Nietesti=(1−hii)−1etrainietrainihii是第个数据点的杠杆作用。现在我们有了,其中是回归中变量的数量。现在,如果,那么要使足够大而在测试集和训练集误差之间产生可观的差异是非常困难的。我们可以举一个简化的例子,假设(截距和变量),设计矩阵是(训练集和测试集),杠杆是i∑ihii=ppN>>phiip=21N×pX
hii=xTi(XTX)−1xi=1Ns2x(1xi)(x2¯¯¯¯¯−x¯¯¯−x¯¯¯1)(1xi)=1+x~2iN
其中,和。最后,是标准化的预测变量,它测量与平均值有多少标准偏差。因此,我们从一开始就知道测试集误差将比训练集“边缘”观察的训练集误差大得多。但这基本上又是代表问题了-“边缘”的观测比“中间”的观测更不具有代表性。另外,这是为了订购。因此,即使您有观测值,即使x¯¯¯=N−1∑ixix2¯¯¯¯¯=N−1∑ix2is2x=x2¯¯¯¯¯−x¯¯¯2x~i=xi−x¯¯¯sxxi1N100x~i=5(在大多数定义中x空间的离群值),这意味着,并且测试错误被低估了仅为。如果您有一个大数据集,例如,那么它甚至会更小,,小于。实际上,对于观测值,您将需要的观测值,以便使用训练集误差使测试集误差低估。hii=261001−26100=74100100001−26100001%10000x~=5025%
因此,对于大数据集,使用测试集不仅效率低下,而且只要也是没有必要的。这适用于OLS,也适用于GLM(GLM的详细信息不同,但总体结论是相同的)。在多于尺寸,“异常值”通过用大的“主成分”的分数的观察中定义。这可以通过写其中是的(正交)特征向量矩阵,特征值矩阵。我们得到其中N>>p2hii=xTiEET(XTX)−1EETxiEXTXΛhii=zTiΛ−1zi=∑pj=1z2jiΛjjzi=ETxi是的主成分分数。xi
如果您的测试集有观测值,则得到矩阵版本,其中和是测试集中设计矩阵的行。因此,对于OLS回归,您已经知道对于所有可能的将数据拆分为训练集和测试集的“测试集”错误。在这种情况下(),根本不需要拆分数据。您可以报告几乎所有大小的“最佳情况”和“最坏情况”测试集错误,而无需实际拆分数据。这样可以节省大量PC时间和资源。ketest{k}=(Ik−H{k})−1etrain{k}H{k}=X{k}(XTX)−1XT{k}X{k}N>>p
基本上,所有这些都简化为使用惩罚项,以解决训练和测试错误(例如BIC或AIC)之间的差异。这样可以有效地获得与使用测试集相同的结果,但是您不会被迫丢弃可能有用的信息。使用BIC,您可以近似模型的证据,数学上看起来像:
p(D|MiI)=p(y1y2…yN|MiI)
请注意,在此过程中,我们无法估计任何内部参数- 必须完全指定每个模型或集成其内部参数。但是,通过重复使用乘积规则,然后取结果日志,我们可以使它看起来像交叉验证(使用特定损失函数)。Mi
p(D|MiI)=p(y1|MiI)p(y2…yN|y1MiI)
=p(y1|MiI)p(y2|y1MiI)p(y3…yN|y1y2MiI)
=⋯=∏i=1Np(yi|y1…yi−1MiI)
⟹log[p(D|MiI)]=∑i=1Nlog[p(yi|y1…yi−1MiI)]
这暗示了一种交叉验证的形式,但是在不断更新训练集的情况下,一次从测试集中进行一次观察-与卡尔曼滤波器类似。我们使用当前训练集从测试集中预测下一个观察值,使用条件对数似然法测量与观察值的偏差,然后更新训练集以包括新观察值。但是请注意,此过程将完全消化所有可用数据,同时确保将每个观察结果均作为“样本外”情况进行测试。它也是不变的,因为您所说的“观测1”或“观测10”无关紧要;结果是相同的(某些排列的计算可能比其他排列更容易)。损失函数也是“自适应的”,因为如果我们定义大号我我Li=log[p(yi|y1…yi−1MiI)],则的清晰度取决于,因为损失函数会不断用新数据进行更新。Lii
我建议以这种方式评估预测模型会很好。