如何使用 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-mean 和 l1-stdv。为什么它没有返回平均绝对错误?如果我理解正确,l1 代表套索回归(正则化)?
@Marius,L1 norm 和 MAE 是一回事。请参阅LightGBM docs 或scikit-learn docs。以上是关于如何使用 lightgbm.cv 进行回归?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 pykalman filter_update 进行在线回归
如何使 Keras 神经网络在 Iris 数据上的表现优于 Logistic 回归