【问题标题】:How to use lightgbm.cv for regression?如何使用 lightgbm.cv 进行回归?
【发布时间】: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 是否支持回归,还是我提供了错误的参数?

【问题讨论】:

    标签: python regression cross-validation 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 docsscikit-learn docs
    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 2014-05-10
    • 2016-04-22
    • 2017-04-19
    • 2020-07-30
    • 2018-05-30
    • 2016-08-28
    • 1970-01-01
    相关资源
    最近更新 更多