LightGBM中的交叉验证

23

我们应该如何使用lightgbm.cv的字典输出来改进我们的预测?

这里有一个例子- 我们使用以下代码训练我们的交叉验证模型:

cv_mod = lgb.cv(params, 
                d_train, 
                500, 
                nfold = 10, 
                early_stopping_rounds = 25,
                stratified = True)

我们如何使用上述代码的最佳迭代中发现的参数来预测输出?在这种情况下,cv_mod没有像lightgbm.train那样的“predict”方法,并且从lightgbm.cv返回的字典在使用lightgbm.train.predict(..., pred_parameters = cv_mod)时会抛出错误。

我是否忽略了一个重要的转换步骤?

3个回答

31

一般来说,CV的目的不是进行超参数优化。其目的是评估模型构建过程的性能

基本的训练/测试拆分在概念上与1折CV相同(与k折CV中的1/K训练大小相比,具有自定义拆分大小)。做更多的拆分(即k>1个CV)的优点是获得有关泛化误差估计的更多信息。从某种意义上讲,可以获得误差+统计不确定性的更多信息。有一个很好的CrossValidated上的讨论(从添加到问题的链接开始,这些链接涵盖了相同的问题,但用不同的方式表述)。它涵盖了嵌套交叉验证,绝对不是直截了当的。但是,如果你能够掌握这个概念,这将有助于你应对各种非平凡的情况。你必须掌握的想法是:CV的目的是评估模型构建过程的性能

记住这个想法后,如何处理超参数估计问题(不仅仅是在LightGBM中)呢?

  • 您想在一些数据上使用一组参数训练模型,并在独立(验证)集上评估每个模型变体。然后,您打算选择最佳参数,通过选择给出您选择的最佳评估指标的变异体。
  • 可以使用简单的训练/测试拆分来完成此操作。但是,评估性能以及选择最佳模型参数可能只是特定拆分上的波动。
  • 因此,您可以通过对几个训练/测试拆分进行平均评估来更具统计鲁棒性地评估每个模型,即k-fold交叉验证
  • 然后,您可以进一步说,您还有一个额外的保留集,在超参数优化开始之前就已经分开了。这样,您可以评估所选的最佳模型在该集合上的性能以测量最终的泛化误差。但是,您甚至可以更进一步,并且不仅有一个单一的测试样本,而是可以有一个外部CV循环,这将带我们到嵌套交叉验证。

    从技术上讲,lightbgm.cv() 只允许您使用固定的模型参数在k-fold分割上评估性能。对于超参数调整,您需要在循环中运行它并提供不同的参数,并记录平均性能以选择最佳的参数集。循环结束后。这种接口与 sklearn 不同,后者为您提供了完整的功能,在CV循环中进行超参数优化。个人而言,我建议使用 lightgbm 的 sklearn-API。它只是一个围绕本地 lightgbm.train() 功能的包装器,因此它不会更慢。但它允许您使用全套的 sklearn 工具包,这使得您的生活更加轻松。


1
如果您对CV的结果满意,只需使用这些参数调用'lightgbm.train'方法即可。就像@pho所说的那样,CV通常只用于参数调整。您不会使用实际的CV对象进行预测。

0

你应该使用交叉验证来进行参数优化。

如果你的模型在所有交叉验证中表现良好,那么使用这些参数来训练整个训练集。 然后在外部测试集上评估该模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接