Python - LightGBM с GridSearchCV, работает вечно

Недавно я провожу несколько экспериментов по сравнению Python XgBoost и LightGBM. Кажется, что этот LightGBM - это новый алгоритм, который, как говорят, работает лучше, чем XGBoost, как по скорости, так и по точности.

Это LightGBM GitHub. Это документы API Python LightGBM, здесь вы найдете функции Python, которые вы можете может позвонить. Его можно вызвать напрямую из модели LightGBM, а также из Scikit-learn LightGBM.

Я использую XGBoost Python API. Как видите, он имеет очень похожую структуру данных, что и API Python LightGBM выше.

Вот что я пробовал:

  1. Если вы используете метод train() как в XGBoost, так и в LightGBM, да, lightGBM работает быстрее и имеет более высокую точность. Но у этого метода нет перекрестной проверки.
  2. Если вы попробуете использовать метод cv() в обоих алгоритмах, он предназначен для перекрестной проверки. Однако я не нашел способа использовать его для возврата набора оптимальных параметров.
  3. если вы попробуете scikit-learn GridSearchCV() с LGBMClassifier и XGBClassifer. Он работает для XGBClassifer, но для LGBClassifier он работает вечно.

Вот мои примеры кода при использовании GridSearchCV() с обоими классификаторами:

XGBClassifier с GridSearchCV

param_set = {
 'n_estimators':[50, 100, 500, 1000]
}
gsearch = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, 
n_estimators=100, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8, 
nthread=7,
objective= 'binary:logistic', scale_pos_weight=1, seed=410), 
param_grid = param_set, scoring='roc_auc',n_jobs=7,iid=False, cv=10)

xgb_model2 = gsearch.fit(features_train, label_train)
xgb_model2.grid_scores_, xgb_model2.best_params_, xgb_model2.best_score_

Это очень хорошо работает для XGBoost и занимает всего несколько секунд.

LightGBM с GridSearchCV

param_set = {
 'n_estimators':[20, 50]
}

gsearch = GridSearchCV(estimator = LGBMClassifier( boosting_type='gbdt', num_leaves=30, max_depth=5, learning_rate=0.1, n_estimators=50, max_bin=225, 
 subsample_for_bin=0.8, objective=None, min_split_gain=0, 
 min_child_weight=5, 
 min_child_samples=10, subsample=1, subsample_freq=1, 
colsample_bytree=1, 
reg_alpha=1, reg_lambda=0, seed=410, nthread=7, silent=True), 
param_grid = param_set, scoring='roc_auc',n_jobs=7,iid=False, cv=10)

lgb_model2 = gsearch.fit(features_train, label_train)
lgb_model2.grid_scores_, lgb_model2.best_params_, lgb_model2.best_score_

Однако, используя этот метод для LightGBM, он работал все утро сегодня, но ничего не сгенерировал.

Я использую тот же набор данных, набор данных содержит 30000 записей.

У меня 2 вопроса:

  1. Если мы просто используем метод cv(), есть ли способ настроить оптимальный набор параметров?
  2. Вы знаете, почему GridSearchCV() плохо работает с LightGBM? Мне интересно, происходит ли это только со мной так, как с другими?

person Cherry Wu    schedule 11.07.2017    source источник


Ответы (2)


Попробуйте использовать n_jobs = 1 и посмотрите, работает ли он.

В общем, если вы используете n_jobs = -1 или n_jobs > 1, вам следует защитить свой скрипт с помощью if __name__=='__main__'::

Простой пример:

import ...

if __name__=='__main__':

    data= pd.read_csv('Prior Decompo2.csv', header=None)
    X, y = data.iloc[0:, 0:26].values, data.iloc[0:,26].values
    param_grid = {'C' : [0.01, 0.1, 1, 10], 'kernel': ('rbf', 'linear')}
    classifier = SVC()
    grid_search = GridSearchCV(estimator=classifier, param_grid=param_grid, scoring='accuracy', n_jobs=-1, verbose=42)
    grid_search.fit(X,y)

Наконец, можете ли вы попробовать запустить свой код, используя n_jobs = -1 и включая if __name__=='__main__':, как я объяснил, и посмотреть, работает ли он?

person seralouk    schedule 12.07.2017
comment
@CherryWu Я протестирую его на своем ноутбуке и дам вам знать, смогу ли я воспроизвести проблему, когда n_jobs = -1 - person seralouk; 12.07.2017

Исходная проблема связана с тем, что lightgbm и GridSearchCV запускают слишком много потоков (т.е. больше, чем доступно на машине). Если продукт (или сумма? Это зависит от того, как GridSearchCV реализован) из них все еще находится в пределах возможностей машины, то он будет запущен. Если слишком много потоков, они конфликтуют, и lightgbm останавливает выполнение по какой-то непонятной мне, но известной разработчикам причине.

person Mischa Lisovyi    schedule 13.05.2018