在阅读LightGBM关于交叉验证的文档后,我希望这个社区能够阐明交叉验证结果并改进我们使用LightGBM的预测。我们如何使用lightgbm.cv
的字典输出来改进我们的预测?
这是一个例子 - 我们使用下面的代码训练我们的cv模型:
cv_mod = lgb.cv(params,
d_train,
500,
nfold = 10,
early_stopping_rounds = 25,
stratified = True)
我们如何使用从上述代码的最佳迭代中找到的参数来预测输出?在这种情况下,cv_mod
没有lightgbm.train
之类的“预测”方法,lightgbm.cv
中的字典输出在lightgbm.train.predict(..., pred_parameters = cv_mod)
中使用时会引发错误。
我错过了一个重要的转型步骤吗?
答案 0 :(得分:12)
一般来说,CV的目的是 NOT 来进行超参数优化。目的是评估模型构建过程的性能。
基本训练/测试分裂在概念上与1倍CV相同(具有分割的自定义大小,与k倍CV中的1 / K训练大小相反)。进行更多分裂(即k> 1 CV)的优点是获得关于泛化误差估计的更多信息。在获得错误+统计不确定性的意义上有更多信息。有一个很好的discussion on CrossValidated(从问题中添加的链接开始,它涵盖了相同的问题,但以不同的方式制定)。它涵盖了嵌套交叉验证,绝对不是直截了当的。但是如果你总体上围绕这个概念,这将有助于你在各种非平凡的情况下。您必须带走的想法是: CV的目的是评估模型构建过程的性能。
记住这个想法,一般如何处理超参数估计(不仅仅是LightGBM)?
然后你可以更进一步,说你有一个额外的保留集,在超参数优化开始之前就已经分开了。这样,您可以评估该集合上选择的最佳模型,以测量最终的泛化误差。但是,您可以更进一步,而不是只有一个测试样本,您可以有一个外部CV循环,这将我们带到嵌套交叉验证。
从技术上讲,lightbgm.cv()
仅允许您使用固定模型参数评估k倍分割的性能。对于超参数调整,您需要在提供不同参数的循环中运行它并重新编码平均性能以选择最佳参数集。循环完成后。此接口与sklearn
不同,后者为您提供了在CV循环中执行超参数优化的完整功能。就个人而言,我建议使用lightgbm的sklearn-API 。它只是本机lightgbm.train()
功能的包装器,因此它并不慢。但它允许您使用完整的sklearn
工具包,这样可以让您的生活变得更轻松。
答案 1 :(得分:1)
如果您对简历结果感到满意,只需使用这些参数调用'lightgbm.train'方法即可。就像@pho所说的那样,CV通常仅用于参数调整。您不使用实际的CV对象进行预测。
答案 2 :(得分:0)
您应该使用CV进行参数优化。
如果您的模型在所有折叠上表现良好,请使用这些参数在整个训练集上进行训练。 然后在外部测试集上评估该模型。