Как использовать lightgbm.cv для регрессии?

Я хочу провести перекрестную проверку модели LightGBM с lgb.Dataset и использовать Early_stopping_rounds. Следующий подход работает без проблем с xgboost.cv XGBoost. Я предпочитаю не использовать подход Scikit Learn с GridSearchCV, потому что он не поддерживает раннюю остановку или 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 регрессию, или я указал неверные параметры?

22
0
24 104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По умолчанию параметр стратификации в lightgbm.cv - True. Согласно документация:

stratified (bool, optional (default=True)) – Whether to perform stratified sampling.

Но стратификация работает только с задачами классификации. Итак, чтобы работать с регрессией, вам нужно сделать это 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 здесь. Об одном нужно помнить на будущее! OP - также похоже, что shuffle=True по умолчанию, поэтому будьте осторожны, сравнивая с scikit-learn, где shuffle=False по умолчанию для CV!

Stev 11.04.2018 14:50

Спасибо, очень странно, что по умолчанию stratified True, потому что вы не можете запустить регрессию. Но теперь это работает! Другой вопрос, если я укажу метрики = 'mae', то xgb.cv вернет следующее: test-mae-mean, test-mae-std, train-mae-mean, train-mae-std. Но если я сделаю это с lgb.cv, тогда он вернет только l1-среднее и l1-stdv. Почему он не вернул среднюю абсолютную ошибку? Если я правильно понял, l1 означает регрессию лассо (регуляризацию)?

Marius 11.04.2018 14:56

@Marius, L1 norm и MAE - это одно и то же. См. Документы LightGBM или scikit-learn документы.

Stev 11.04.2018 16:38

Другие вопросы по теме