LightGBM 中的交叉验证

Posted

技术标签:

【中文标题】LightGBM 中的交叉验证【英文标题】:Cross-validation in LightGBM 【发布时间】:2018-03-09 10:39:11 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

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

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

【讨论】:

以上是关于LightGBM 中的交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

线性回归中的交叉验证

Weka 中的交叉验证

5倍交叉验证如何理解

sklearn中的交叉验证+决策树

pyspark中的交叉验证

神经网络中啥是交叉验证,为啥要进行交叉验证?