如何使用 lightgbm.cv 进行回归?

Posted

技术标签:

【中文标题】如何使用 lightgbm.cv 进行回归?【英文标题】:How to use lightgbm.cv for regression? 【发布时间】:2018-09-21 07:46:55 【问题描述】:

我想用 lgb.Dataset 对 LightGBM 模型进行交叉验证并使用 early_stopping_rounds。以下方法适用于 XGBoost 的 xgboost.cv。我不喜欢在 GridSearchCV 中使用 Scikit Learn 的方法,因为它不支持提前停止或 lgb.Dataset。

import lightgbm as lgb
from sklearn.metrics import mean_absolute_error
dftrainLGB = lgb.Dataset(data = dftrain, label = ytrain, feature_name = list(dftrain))

params = 'objective': 'regression'
    
cv_results = lgb.cv(
        params,
        dftrainLGB,
        num_boost_round=100,
        nfold=3,
        metrics='mae',
        early_stopping_rounds=10
        )

任务是做回归,但是下面的代码会报错:

Supported target types are: ('binary', 'multiclass'). Got 'continuous' instead.

LightGBM 是否支持回归,还是我提供了错误的参数?

【问题讨论】:

【参考方案1】:

默认情况下,lightgbm.cv 中的stratify 参数为True。 根据the documentation:

stratified (bool, optional (default=True)) – 是否执行 分层抽样。

但分层仅适用于分类问题。因此,要使用回归,您需要将其设为 False。

cv_results = lgb.cv(
        params,
        dftrainLGB,
        num_boost_round=100,
        nfold=3,
        metrics='mae',
        early_stopping_rounds=10,

        # This is what I added
        stratified=False
        )

现在它的工作。

【讨论】:

有趣。看起来它已被交换为 True here。未来要记住的一件事! OP - 看起来 shuffle=True 也是默认值,所以要小心与 scikit-learn 比较,其中 shuffle=False 是 CV 的默认值! 谢谢,这很奇怪,默认分层是 True,因为你不能运行回归。但现在它起作用了!另一个问题,如果我指定 metrics = 'mae',那么 xgb.cv 返回以下内容:test-mae-mean, test-mae-std, train -mae-mean,train-mae-std。但是如果我用 lgb.cv 这样做,那么它只返回 l1-meanl1-stdv。为什么它没有返回平均绝对错误?如果我理解正确,l1 代表套索回归(正则化)? @Marius,L1 norm 和 MAE 是一回事。请参阅LightGBM docs 或scikit-learn docs。

以上是关于如何使用 lightgbm.cv 进行回归?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pykalman filter_update 进行在线回归

如何使 Keras 神经网络在 Iris 数据上的表现优于 Logistic 回归

如何使随机梯度回归器运行多达 1000 个 epoch 或产生更好的结果?

Logistic回归

如何使用线性回归模型进行预测?

如何在 R 中使用 XGBoost 算法进行回归?