机器学习数据集划分训练集和验证集的经验法则
机器学习数据集划分训练集和验证集的经验法则
技术背景
在机器学习中,将数据集划分为训练集和验证集是一个关键步骤。训练集用于训练模型的参数,而验证集则用于评估模型的性能,帮助我们选择合适的模型和调整超参数。然而,如何合理地划分数据集并没有一个固定的标准,这需要综合考虑多种因素。
实现步骤
1. 基本考虑因素
划分数据集时存在两个相互竞争的因素:训练数据较少会使参数估计的方差增大;验证数据较少会使性能统计的方差增大。一般来说,应确保两者的方差都不过高,这更多地与每个类别中的实例绝对数量有关,而非比例。
2. 数据量较少的情况
如果数据总量较少(如100个实例),可能需要采用交叉验证的方法,因为单一的划分方式难以使估计的方差达到满意的程度。
3. 数据量充足的情况
若有足够的数据进行独立的验证集划分(而非交叉验证),可以采用以下方法来处理方差问题:
- 初步划分:将数据按80/20的比例划分为训练集和测试集,这是一个不错的起点。
- 再次划分:将训练集再按80/20的比例划分为训练集和验证集。
- 训练数据子采样:从训练数据中随机抽取子样本,用这些子样本训练分类器,并记录在验证集上的性能。
- 不同训练数据量测试:尝试不同数量的训练数据,例如分别随机抽取20%、40%、60%、80%的训练数据进行多次训练,观察在验证集上的性能。通常会发现,数据量越多,性能越好,且不同随机样本之间的方差越低。
- 验证数据子采样:为了了解验证数据大小对方差的影响,可以反过来进行操作。用所有训练数据训练模型,然后多次随机抽取一定比例的验证数据,观察性能。会发现小样本验证数据的平均性能与所有验证数据的性能大致相同,但样本数量越少,方差越大。
4. 考虑其他方法和比例
- 帕累托原则:80/20的比例较为常见,通常是一个安全的选择。但根据所采用的训练/验证方法,比例可能会有所变化,例如10折交叉验证中,每一折的验证集比例为10%。
- 研究得出的公式:有研究表明,验证集与训练集的大小比例 $v/t$ 与 $\ln(N/h - max)$ 成比例,其中 $N$ 是识别器族的数量,$h - max$ 是这些族的最大复杂度。也有规则指出,验证集的比例应与自由可调参数数量的平方根成反比。
- Andrew Ng的建议:训练集占60%,交叉验证集占20%,测试集占20%。但在大数据时代,如拥有一百万个示例,验证集和测试集的比例可以更小,如99.5:0.25:0.25。
- 特殊比例:63.2% / 36.8% 也是一种合理的选择,其原理与统计自助法中的随机有放回抽样有关。
核心代码
在Python中,使用Scikit - learn库可以方便地进行数据集划分,以下是一个简单的示例:
1 |
|
最佳实践
- 数据量充足时:可以按照上述步骤进行多次试验,找到适合特定问题的数据集划分比例。
- 数据量较小时:优先考虑交叉验证方法,以充分利用有限的数据。
- 考虑数据分布:确保训练集、验证集和测试集的数据分布相似,避免因数据分布差异导致模型性能评估不准确。
常见问题
1. 固定比例划分是否总是适用?
不是。不同的问题和数据量可能需要不同的划分比例,应根据实际情况进行调整。
2. 验证集和测试集的作用有何不同?
验证集主要用于在模型训练过程中选择合适的模型和调整超参数;测试集则用于在模型最终确定后,评估模型在未见过数据上的真实性能。
3. 如何判断划分的比例是否合适?
可以通过观察模型在验证集和测试集上的性能指标(如准确率、召回率等)以及性能的稳定性来判断。如果性能波动较大,可能需要调整划分比例。
机器学习数据集划分训练集和验证集的经验法则
https://119291.xyz/posts/2025-04-22.machine-learning-dataset-split-rule-of-thumb/