在拆分成折叠之前打乱数据

数据挖掘 机器学习 交叉验证 超参数 超参数调整
2021-10-14 05:45:14

我正在使用 sklearn 的“cross_validate”和“KFold”函数运行 4 折交叉验证超参数调整。假设我的训练数据集已经被打乱,那么我是否应该在每次超参数调整迭代之前重新打乱数据,然后再分成批次/折叠(即,KFold 函数中的 shuffle 参数)?我注意到超参数调整过程的结果会有所不同,具体取决于我是否在将数据拆分为折叠之前对其进行了洗牌。

我假设如果结果取决于改组,那么该模型并不稳健。这个对吗?但是,这对模型也可能不“公平”,因为结果不可重现,因为每次我运行交叉验证时每个折叠的数据都是不同的(即,每个超参数组合都是在完全不同的折叠上评估的。例如,第 1 次调整迭代的第 1 折中的训练/验证数据集与第 2 次调整迭代的第 1 折数据集不同。)

2个回答

我正在使用 sklearn 的“cross_validate”和“KFold”函数运行 4 折交叉验证超参数调整。假设我的训练数据集已经被打乱,那么我是否应该在每次超参数调整迭代之前重新打乱数据,然后再分成批次/折叠(即,KFold 函数中的 shuffle 参数)?

不,不需要,拆分前需要洗牌。

我假设如果结果取决于改组,那么该模型并不稳健。这个对吗?

你是对的,好的模型在每种数据组合上都有很好的表现。

但是,这对模型也可能不“公平”,因为结果不可重现,因为每次我运行交叉验证时每个折叠的数据都是不同的(即,每个超参数组合都在完全不同的折叠上进行评估。例如,第一次调整迭代的折叠 #1 中的训练/验证数据集与第二次调整迭代的折叠 #1 数据集不同。)

您进行交叉验证以检查每个数据块的性能。你的任务是实现最慷慨的模式。

这是一个很好的问题。对每个超参数点使用相同的折叠分割可以使超参数过度拟合到数据分割。然而,对每个超参数点使用不同的折叠拆分使得它们之间的比较不是(完全)苹果对苹果。

我认为为每个超参数设置相同的折叠更好。作为参考,请注意 sklearn 的 xyzSearchCV 函数以这种方式执行:它们采用折叠搜索点的乘积并适合这些组合中的每一个。您可以通过重复 k 折来缓解过度拟合拆分问题。