我有一个数据集,其中列对应于特征(预测变量),行对应于数据点。这些数据点是以结构化的方式提取的,即它们是有序的。我将使用Matlab中的crossvalind或cvpartition来进行分层交叉验证。
如果我使用上述函数,是否还需要先随机重排数据点(行)?
回答:
这些函数会在内部对数据进行洗牌,正如你在文档中所见
Indices = crossvalind(‘Kfold’, N, K) 返回用于N个观测值的K折交叉验证的随机生成索引。Indices包含等量(或大致等量)的从1到K的整数,这些整数定义了将N个观测值划分为K个不相交子集的分区。重复调用会返回不同的随机生成分区。如果省略,K默认为5。在K折交叉验证中,使用K-1折进行训练,最后一折用于评估。这个过程重复K次,每次留下不同的折用于评估。
然而,如果你的数据在这种意义上是结构化的,即第i个对象包含关于第i+1个对象的一些信息,那么你应该考虑不同的分割方式。例如,如果你的数据实际上是(局部)时间序列,典型的随机交叉验证不是有效的估计技术。为什么?因为如果你的数据实际上包含了群集,其中知道至少一个元素的值,就有很高的概率估计出其余元素的值,那么在应用交叉验证后你最终得到的实际上是预测这些群集内部能力的估计。因此,如果在实际使用你的模型时,你期望得到一个全新的群集——你选择的模型在那里可能是完全随机的。换句话说,如果你的数据具有某种内部群集结构(或时间序列),你的分割应该覆盖这一特征,通过在群集上进行分割(因此你不是进行K个随机点的分割,而是进行K个随机群集的分割,等等)。