LightGBM中的交叉验证

Nli*_*ind 13 python machine-learning cross-validation kaggle lightgbm

在阅读了LightGBM关于交叉验证的文档之后,我希望这个社区能够阐明交叉验证结果并改进我们使用LightGBM的预测.我们如何使用字典输出lightgbm.cv来改进我们的预测?

这是一个例子 - 我们使用下面的代码训练我们的cv模型:

cv_mod = lgb.cv(params, 
                d_train, 
                500, 
                nfold = 10, 
                early_stopping_rounds = 25,
                stratified = True)
Run Code Online (Sandbox Code Playgroud)

我们如何使用从上面代码的最佳迭代中找到的参数来预测输出?在这种情况下,cv_mod没有类似的"预测"方法lightgbm.train,并且字典输出lightgbm.cv在使用时会抛出错误lightgbm.train.predict(..., pred_parameters = cv_mod).

我错过了一个重要的转型步骤吗?

Myk*_*vyi 18

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

基本的训练/测试分裂在概念上与1倍CV相同(具有分割的自定义大小,与k倍CV中的1/K训练大小相反).做更多分裂(即k> 1 CV)的优点是获得有关泛化误差估计的更多信息.在获得错误+统计不确定性的意义上有更多信息.关于CrossValidated有一个很好的讨论(从问题中添加的链接开始,这些链接涵盖相同的问题,但以不同的方式制定).它涵盖了嵌套交叉验证,绝对不是直截了当的.但是如果你总体上围绕这个概念,这将有助于你在各种非平凡的情况下.您必须要带走的想法是:CV的目的是评估模型构建过程的性能.

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

  • 您希望在某些数据上使用一组参数训练模型,并在独立(验证)集上评估模型的每个变体.然后,您打算通过选择提供所选最佳评估指标的变量来选择最佳参数.
  • 可以通过简单的训练/测试分割来完成.但是评估的性能以及最佳模型参数的选择可能只是特定分裂的波动.
  • 因此,您可以评估这些模型中的每一个在几个列车/测试分裂上的统计上稳健的平均评估,即k倍CV.

然后,您可以更进一步,并说您有一个额外的保留集,在超参数优化开始之前已分离.这样,您可以评估该集合上选择的最佳模型,以测量最终的泛化误差.但是,您可以更进一步,而不是只有一个测试样本,您可以有一个外部CV循环,这使我们进行嵌套交叉验证.

从技术上讲,lightbgm.cv()只允许您使用固定模型参数评估k折分割的性能.对于超参数调整,您需要在提供不同参数的循环中运行它并重新编码平均性能以选择最佳参数集.循环完成后.此接口不同于sklearn,它为您提供了在CV循环中执行超参数优化的完整功能.就个人而言,我建议使用lightgbm的sklearn-API.它只是本机lightgbm.train()功能的包装,因此它并不慢.但它允许您使用完整的sklearn工具包,这使您的生活更轻松.


pho*_*pho 0

您应该使用 CV 进行参数优化。

如果您的模型在所有折叠上都表现良好,请使用这些参数在整个训练集上进行训练。然后在外部测试集上评估该模型。