我们应该总是做简历吗?

机器算法验证 机器学习 交叉验证
2022-03-03 02:27:05

我的问题:即使是相对较大的数据集,我也应该做简历吗?

我有一个比较大的数据集,我会对数据集应用机器学习算法。

由于我的电脑速度不快,CV(和网格搜索)有时需要很长时间。特别是 SVM 永远不会因为大量的调整参数而结束。因此,如果我做一份简历,那么我需要选择一个相对较小的数据。

另一方面,验证集也应该很大,所以我认为使用与训练集大小相同(或更大)的验证集是个好主意。(也就是说,我使用大型验证集代替 CV 进行参数调整。)

所以我现在至少有两个选择。

  1. 在一个小数据集上做 CV。
  2. 使用相对较大的训练集和没有CV的验证集。
  3. 其他想法。

最好的主意是什么?欢迎提出理论或实践意见。

2个回答

通常,您不必一直使用交叉验证。CV 的重点是获得对分类器的泛化性的更稳定估计,而您仅使用一个测试集即可获得。如果您的数据集很大,您不必使用 CV,因此将数据添加到您的训练集不会大大改善您的模型,并且测试集中很少有错误分类只是偶然的机会,不会真正改变您的性能指标.

通过拥有一个小的训练集和一个大的测试集,你的估计将会有偏差。因此,它可能会比使用更多训练数据和最佳超参数获得的结果更糟糕,您发现对于更大的数据集可能会有所不同,这仅仅是因为更多的数据需要更少的正则化。

然而,获得最优的超参数无论如何都不是重要的部分,它不会显着提高性能。你应该集中精力去理解问题,创造好的特征,让数据得到良好的塑造。

您可以考虑以下几件事来加快速度:

  1. 用更少的特征训练它。使用特征选择和/或降维来减少问题的规模
  2. 为 SVM 使用预缓存内核
  3. 使用不需要在网格中选择超参数的算法。尤其是线性回归,如带有岭/套索/弹性净惩罚的逻辑回归,甚至线性 SVM。根据实现,这些分类器可以为选定路径中的所有超参数拟合模型,而代价是仅拟合一个
  4. 为您的问题类型使用更快的实现(您必须谷歌它)

即使使用速度较慢的计算机,您也可以:

  1. 使用更多内核
  2. 使用 GPU

交叉验证是一种工具,用于估计由于数据中的随机性(如果它不是确定性的,可能在学习算法中)导致的性能指标的方差。

因此,如果您只使用一个拆分,例如 80% 训练 + 20% 测试并从这个单一实验中报告您的性能指标,那么任何尝试使用完全相同的参数重现您的实验的人很有可能会发现不同的性能数据(有时非常不同的)。当然,除非您提供相同的精确拆分,这是毫无意义的。

回到你的问题,我认为你绝对应该使用 CV 来报告你的表现(例如,做一个 10 倍的 CV 并报告性能指标的平均值和标准偏差)。现在,为了调整您的算法,您可以使用从训练集中采样的更小的验证集(确保它不包含在测试集中)。

如果您担心使用小集合找不到最佳超参数,那么您可能过度拟合了您的算法以适应数据集的具体情况。如果您无法使用小样本找到在所有折叠中都能提供合理性能的配置,那么该算法在实践中可能不是很有用。

另请记住,某些算法太慢/在某些配置中不能很好地扩展。这也是实际选型的一部分。

既然您提到了 SVM,当然大多数实现在尝试通过网格搜索查找非线性内核的参数时都会很慢。网格搜索具有指数级复杂性,因此只需很少的参数即可使用它。还要记住,大多数库都提供了合理的默认参数(或者至少您设置了一个参数并且有启发式方法来设置其他参数)。