Spark中CrossValidator交叉验证疑问:是否必须额外拆分训练测试集
两个拆分的作用差异
CrossValidator会先将数据集拆分为多组折,分别作为独立训练集和测试集使用。例如当k=3 folds时,CrossValidator会生成3组(训练集、测试集)数据对,每组均使用2/3数据训练、1/3数据测试。
你看到的文档里提到的k折拆分,和示例中额外做的训练/测试集拆分,作用完全独立:
CrossValidator内部的k折拆分仅作用于你传入的训练集,核心目的是超参数调优:它会在每折的验证集上评估不同参数组合的效果,选出表现最优的超参数组合。选完最优参数后,CrossValidator会用你传入的整份训练集重新训练一个最终模型,也就是你调用fit后得到的cvModel。- 示例中单独拆分的测试集是完全独立的未见过的数据,全程没有参与调优过程,作用是客观评估最终最优模型的真实泛化能力,避免调优阶段过拟合到k折的验证集,得到的效果评估结果更可信。
能不能不拆分数据集直接用交叉验证得到预测结果?
分场景判断:
- 如果你已经不需要评估模型泛化效果,确定要输出最终上线的模型,可以直接把全量带标签数据传给
CrossValidator做fit,拿到最优模型后直接对要预测的无标签数据做推理。这种场景下你节省了拆分测试集的样本量,最终模型的训练数据更多,上线效果通常会更好。 - 如果你需要得到可靠的模型效果评估结果,不建议跳过拆分:没有独立测试集的情况下,你只能拿到k折验证的平均指标,这个指标因为调参过程已经“见过”验证集数据,通常会比真实泛化效果偏高,参考价值有限。
- 如果你想要得到全量带标签数据的交叉验证预测结果(比如做堆叠集成的输入特征),Spark的
CrossValidator默认不直接输出该结果,你需要手动实现k折拆分逻辑,逐折训练模型、对当前折的验证样本做预测,最后把所有折的预测结果合并即可。
内容的提问来源于stack exchange,提问作者rayqz
相关产品推荐
相关产品推荐

