Поиск по сетке с регрессией LightGBM

Я хочу обучить регрессионную модель с помощью Light GBM, и следующий код отлично работает:

import lightgbm as lgb

d_train = lgb.Dataset(X_train, label=y_train)
params = {}
params['learning_rate'] = 0.1
params['boosting_type'] = 'gbdt'
params['objective'] = 'gamma'
params['metric'] = 'l1'
params['sub_feature'] = 0.5
params['num_leaves'] = 40
params['min_data'] = 50
params['max_depth'] = 30

lgb_model = lgb.train(params, d_train, 1000)

#Prediction
y_pred=lgb_model.predict(X_test)
mae_error = mean_absolute_error(y_test,y_pred)

print(mae_error)

Но когда я перехожу к использованию GridSearchCV, я сталкиваюсь с проблемами. Я не совсем уверен, как это правильно настроить. Я нашел полезные источники, например здесь, но похоже, что они работают с классификатором.

1-я попытка:

from sklearn.metrics import make_scorer
score_func = make_scorer(mean_absolute_error, greater_is_better=False)

model = lgb.LGBMClassifier( 
    boosting_type="gbdt",
    objective='regression',
    is_unbalance=True, 
    random_state=10, 
    n_estimators=50,
    num_leaves=30, 
    max_depth=8,
    feature_fraction=0.5,  
    bagging_fraction=0.8, 
    bagging_freq=15, 
    learning_rate=0.01,    
)

params_opt = {'n_estimators':range(200, 600, 80), 'num_leaves':range(20,60,10)}
gridSearchCV = GridSearchCV(estimator = model, 
    param_grid = params_opt, 
    scoring=score_func)
gridSearchCV.fit(X_train,y_train)
gridSearchCV.grid_scores_, gridSearchCV.best_params_, gridSearchCV.best_score_

, раньше выдает кучу ошибок:

"ValueError: Неизвестный тип ярлыка: 'непрерывный'"

ОБНОВЛЕНИЕ: я выполнил запуск кода, переключив LGBMClassifier на LGBMModel. Стоит ли мне попробовать использовать LGBMRegressor или это не имеет значения? (источник: https://lightgbm.readthedocs.io/en/latest/_modules/lightgbm/sklearn.html)


person Helen    schedule 06.10.2018    source источник
comment
Вы использовали LGBMClassifier, но определили objective: 'regression'. Попробуйте либо LGBMRegressor, если ваше предварительное значение является непрерывным, ИЛИ objective: binary, если ваша задача - классификация.   -  person ipramusinto    schedule 06.10.2018
comment
Да, спасибо, я только что понял это :) Не могли бы вы подсказать, в каких диапазонах должны быть разные параметры, если у меня много данных?   -  person Helen    schedule 06.10.2018


Ответы (1)


Прежде всего, неясно, какова природа ваших данных и, следовательно, какой тип модели подходит лучше. Вы используете метрику L1, поэтому я предполагаю, что у вас какая-то проблема регрессии. Если нет, поправьте меня и поясните, почему тогда вы используете метрику L1. Если да, то непонятно, зачем вы вообще используете LGBMClassifier, поскольку он служит задачам классификации (как уже указывал @bakka).

Обратите внимание, что на практике LGBMModel совпадает с LGBMRegressor (вы можете увидеть это в коде). Однако нет никаких гарантий, что так будет и дальше в долгосрочной перспективе. Поэтому, если вы хотите написать хороший и поддерживаемый код - не используйте базовый класс LGBMModel, если вы не очень хорошо знаете, что делаете, почему и каковы последствия.

Что касается диапазонов параметров: см. этот ответ на github

person Mischa Lisovyi    schedule 01.12.2018