LightGBM 中的交叉验证

新手上路,请多包涵

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

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

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

我们如何使用从上述代码的最佳迭代中找到的参数来预测输出? In this case, cv_mod has no “predict” method like lightgbm.train , and the dictionary output from lightgbm.cv throws an error when used in lightgbm.train.predict(..., pred_parameters = cv_mod)

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

原文由 Nlind 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
1 个回答

通常,CV 的目的 不是 进行超参数优化。目的是 评估建模过程的性能

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

记住这个想法,一般情况下如何进行超参数估计(不仅在 LightGBM 中)?

  • 您想要使用某些数据的一组参数训练模型,并在独立(验证)集上评估模型的每个变体。然后,您打算通过选择提供您选择的最佳评估指标的变体来选择最佳参数。
  • 可以通过简单的训练/测试拆分来完成。但是评估的性能,以及最佳模型参数的选择,可能只是特定拆分的波动。
  • 因此,您 可以对这些模型中的每一个进行评估,这些模型在多个训练/测试拆分上更具统计稳健性,即 k-fold CV 平均评估

然后你可以更进一步,说你有一个额外的保留集,它在超参数优化开始之前被分开了。通过这种方式,您可以评估在该集合上选择的最佳模型,以衡量最终的泛化误差。但是,您甚至可以更进一步,您可以使用外部 CV 循环来代替单个测试样本,这将我们带到嵌套交叉验证。

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

原文由 Mischa Lisovyi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题