将数据集拆分为训练集、验证集和测试集时,优先考虑明确的数据角色划分并保持代表性。 一种常见的方法是根据数据集的大小将数据拆分为 60-20-20 或 80-10-10 的比例。 对于小型数据集(例如,1,000 个样本),较大的验证集 (20%) 有助于确保模型调整期间的可靠评估。 测试集应保持未触及状态,直到最终评估,以防止过度拟合。 始终在拆分之前对数据进行洗牌,以避免与顺序相关的偏差——例如,如果样本按类别排序,则非洗牌拆分可能会从训练中排除整个类别。
选择拆分方法时,请考虑数据的结构。 对于不平衡数据集(例如,罕见的医疗状况),使用分层抽样来保持跨拆分的类别分布。 Scikit-learn 的 train_test_split
有一个 stratify
参数用于此目的。 对于时间序列数据,避免随机拆分; 而是使用时间顺序(例如,前 70% 的天用于训练,接下来 20% 用于验证,最后 10% 用于测试)。 分组数据(例如,来自同一患者的多个样本)需要按组拆分,以防止数据泄漏——使用像 GroupShuffleSplit
这样的工具来确保来自同一组的所有样本都保留在一个集合中。 如果需要交叉验证,请仅将其应用于训练/验证部分,并使测试集保持隔离。
记录和版本化您的拆分以实现可重复性。 使用固定的随机种子(例如,Python 中的 random_state=42
)在实验期间重新创建相同的拆分。 保存拆分索引或文件名以跟踪哪些数据点属于每个集合。 对于大型数据集,使用脚本自动化拆分,以处理边缘情况,例如缺失值或重复项。 TensorFlow 的 tf.data.Dataset
或 PyTorch 的 SubsetRandomSampler
等工具可以简化此过程。 始终通过检查摘要统计信息(例如,类别分布、特征范围)来验证拆分,以确认它们是否代表完整数据集。