我们应该如何使用 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 许可协议
通常,CV 的目的 不是 进行超参数优化。目的是 评估建模过程的性能。
基本训练/测试拆分在概念上与 1 折 CV 相同(具有自定义拆分大小,与 k 折 CV 中的 1/K 训练大小形成对比)。进行更多拆分(即 k>1 CV)的好处是可以获得更多关于泛化误差估计的信息。在获取错误+统计不确定性的意义上有更多信息。 关于 CrossValidated 有一个很好的讨论(从添加到问题的链接开始,它涵盖了相同的问题,但以不同的方式制定)。它涵盖了嵌套交叉验证,绝对不是直截了当的。但是,如果您总体上围绕这个概念,这将在各种重要情况下为您提供帮助。您必须带走的想法是: CV 的目的是评估模型构建过程的性能。
记住这个想法,一般情况下如何进行超参数估计(不仅在 LightGBM 中)?
然后你可以更进一步,说你有一个额外的保留集,它在超参数优化开始之前被分开了。通过这种方式,您可以评估在该集合上选择的最佳模型,以衡量最终的泛化误差。但是,您甚至可以更进一步,您可以使用外部 CV 循环来代替单个测试样本,这将我们带到嵌套交叉验证。
从技术上讲,
lightbgm.cv()
只允许您评估具有固定模型参数的 k 倍拆分的性能。对于超参数调整,您需要在一个循环中运行它,提供不同的参数并重新编码平均性能以选择最佳参数集。循环完成后。此接口不同于sklearn
,后者为您提供在 CV 循环中进行超参数优化的完整功能。就个人而言, 我建议使用 lightgbm 的 sklearn-API 。它只是本机lightgbm.train()
功能的包装器,因此它并不慢。但它允许您使用sklearn
工具包的完整堆栈,这让您的生活变得更加轻松。