如果我有一个包含 500 个观察值的数据集,我是否应该将其划分为一个训练集和测试集,例如 375 个(75%)训练观察和 125 个(25%)测试观察,并对训练集执行交叉验证?
是的,无论情况如何,您都应该将其作为初始步骤(test_size=0.2
在 中也是合理的默认值sklearn
)。
还是应该对整个数据集进行交叉验证?
尽量避免它并坚持传统的指导方针,但大多数指南和书籍没有告诉你的是你可能必须这样做。
有理论,然后有实践……如果标注的数据集很小,如果没有实用的方法来增加它,训练集在很大程度上不具有代表性的风险很高,你可能不得不放弃单独的测试集。
但是,在开始使用非标准分析路径之前,您需要确保了解与它们相关的风险以及对结论的影响。最终,该决定是基于与项目相关的需求和风险的务实决定。在金融或医疗保健等受监管的领域,您需要谨慎,但如果所有结果都是将“购买”按钮涂成绿色还是蓝色,那么风险就会降低。
遵循这种非标准的分析路径,您将失去什么:
- 您将放弃第二轮“泛化测试”(第一轮用于模型选择/调整的训练集上的 CV)
- 由于无法检查模型在应用于新数据时是否稳定,您将面临过度拟合数据的风险
- 您将执行更多假设检验,从而导致做出错误发现的风险更高(与第 2 点相关)
- 您将利用更多的研究人员自由度(分叉路径的花园) - 另一个过度拟合的途径
您将获得什么:
- 您将获得信心,即您的模型是在更具代表性的样本上进行训练的
- 您将对数据集有更深入的了解,希望包括偏差、错误和所需的数据生成过程
- 如果有机会重做整个事情,您将更有能力推荐改进的计划
那么,在了解了上述风险和收益之后,如何决定放弃单独的测试集呢?
这是一个建议的工作流程:
1) 使用标准方法选择和调整算法后(训练 CV + 拟合整个训练集 + 测试单独的测试集),回到训练/测试拆分,对数据集进行不同的拆分几次(例如在 scikit-learn 中使用不同的random_state
参数值),每次重新执行“训练 CV + 训练集拟合 + 测试”循环并观察分数。
2)如果训练CV分数和测试分数之间的差异是相对一致的 - 太好了!无需做任何其他事情。
3) 但是,如果平均训练 CV 分数和测试分数之间的差异不一致,特别是如果在这些随机数据集拆分迭代之间哪个更大的事实有所不同 - 你有一个抽样问题。
潜在的解决方案:
a)找到另一种算法,无论训练/测试拆分如何,都能很好地推广到测试集(这可能非常具有挑战性,因为您可能开始使用一个小的标记数据集)。
b) 系统地识别和消除分裂偏差(这也可能不切实际)。
c) 继续获取更多有代表性的标记数据,直到这个问题消失。
d) 宣布这是“失败的分析”并推迟/取消模型发布,因为摆脱单独的一轮泛化测试具有与之相关的高分析风险。
e)只有当所有其他方法都失败时,放弃一个单独的测试数据集(即从过程中删除单独的泛化测试步骤)并通过对整个标记数据集的交叉验证来选择模型。
在做出模型选择/调整决策时,不仅要观察平均 CV 测试分数(这是折叠平均值的平均值),还要观察个体折叠的平均测试分数的最小/最大/标准。