lightgbm gridsearchcv висит навсегда с n_jobs = 1 - PullRequest
0 голосов
/ 26 августа 2018

Я прочитал предыдущие посты на LightGBM, которые используются вместе с GridSearchCV (), которая зависает, и исправил мой код соответственно.Но все же код, кажется, висит как> 3 часа!

У меня 8 ГБ ОЗУ, у данных 29802 строки и 13 столбцов.Большинство столбцов являются категориальными значениями, которые были помечены как числа.

Пожалуйста, смотрите код ниже.В ожидании ваших ценных предложений!

Изначально я получил AUC 89% с lgb.train ().

Но после использования LGBMClassifier () я уже близко не подхожу.Поэтому я выбрал GridSearchCV ().

Мне был нужен LGBMClassifier (), так как я хотел Score () и другие простые обёртки, которые я не смог найти при использовании lgb.train ().

Я прокомментировал большинство своих настроекиз параметров сейчас.Но поиск по сетке, похоже, не заканчивается :(

X и y - мой полный набор данных для обучения:

params = {'boosting_type': 'gbdt',
      'max_depth' : 15,
      'objective': 'binary',
      #'nthread': 1, # Updated from nthread
      'num_leaves': 30,
      'learning_rate': 0.001,
      #'max_bin': 512,
      #'subsample_for_bin': 200,
      'subsample': 0.8,
      'subsample_freq': 500,
      #'colsample_bytree': 0.8,
      #'reg_alpha': 5,
      #'reg_lambda': 10,
      #'min_split_gain': 0.5,
      #'min_child_weight': 1,
      #'min_child_samples': 5,
      #'scale_pos_weight': 1,
      #'num_class' : 1,
      'metric' : 'roc_auc',
      'early_stopping' : 10,
      'n_jobs': 1,
     }

gridParams = {
'learning_rate': [0.001,0.01],
'n_estimators': [ 1000],
'num_leaves': [12, 30,80],
'boosting_type' : ['gbdt'],
'objective' : ['binary'],
'random_state' : [1], # Updated from 'seed'
'colsample_bytree' : [ 0.8, 1],
'subsample' : [0.5,0.7,0.75],
'reg_alpha' : [0.1, 1.2],
'reg_lambda' : [0.1, 1.2],
'subsample_freq' : [500,1000],
'max_depth' : [15, 30, 80]
}
    mdl = lgb.LGBMClassifier(**params) 
    grid = GridSearchCV(mdl, gridParams,return_train_score=True,
                verbose=1,
                cv=4,
                n_jobs=1, #only '1' will work 
                scoring='roc_auc'                    
               )
    grid.fit(X=X, y=y,eval_set=[[X,y]],early_stopping_rounds=10) # never ending code

    Output:

    Fitting 4 folds for each of 864 candidates, totalling 3456 fits
[1] valid_0's binary_logloss: 0.686044
Training until validation scores don't improve for 10 rounds.
[2] valid_0's binary_logloss: 0.685749
[3] valid_0's binary_logloss: 0.685433
[4] valid_0's binary_logloss: 0.685134
[5] valid_0's binary_logloss: 0.684831
[6] valid_0's binary_logloss: 0.684517
[7] valid_0's binary_logloss: 0.684218
[8] valid_0's binary_logloss: 0.683904
[9] valid_0's binary_logloss: 0.683608
[10]    valid_0's binary_logloss: 0.683308
[11]    valid_0's binary_logloss: 0.683009
[12]    valid_0's binary_logloss: 0.68271
[13]    valid_0's binary_logloss: 0.682416
[14]    valid_0's binary_logloss: 0.682123
[15]    valid_0's binary_logloss: 0.681814
[16]    valid_0's binary_logloss: 0.681522
[17]    valid_0's binary_logloss: 0.681217
[18]    valid_0's binary_logloss: 0.680922
[19]    valid_0's binary_logloss: 0.680628
[20]    valid_0's binary_logloss: 0.680322
[21]    valid_0's binary_logloss: 0.680029
[22]    valid_0's binary_logloss: 0.679736
[23]    valid_0's binary_logloss: 0.679443
[24]    valid_0's binary_logloss: 0.679151
[25]    valid_0's binary_logloss: 0.678848
[26]    valid_0's binary_logloss: 0.678546
[27]    valid_0's binary_logloss: 0.678262
[28]    valid_0's binary_logloss: 0.677974
[29]    valid_0's binary_logloss: 0.677675
[30]    valid_0's binary_logloss: 0.677393
[31]    valid_0's binary_logloss: 0.677093........................
.....................
[997]   valid_0's binary_logloss: 0.537612
[998]   valid_0's binary_logloss: 0.537544
[999]   valid_0's binary_logloss: 0.537481
[1000]  valid_0's binary_logloss: 0.53741
Did not meet early stopping. Best iteration is:
[1000]  valid_0's binary_logloss: 0.53741

................................ and it goes on and on ...............

Пожалуйста, помогите!

С уважением, Шерин

1 Ответ

0 голосов
/ 27 августа 2018

Ваша проблема отличается от вышеупомянутого зависания.Вы тренируете очень много (3456) классификаторов, каждое из которых (1000) очень глубоких (оставляет 13 ... 80) деревьев.Таким образом, время тренировки составляет очень долго.Решение состоит в том, чтобы либо быть более скромным с глубиной дерева (наиболее практичным является фиксирование глубины до -1 и изменение числа листьев в поиске по сетке, для вашего размера набора данных это может быть от 10 до 40 листьев, может быть?),или уменьшить количество точек сетки (860 точек сетки - A LOT ), или уменьшить количество деревьев (= итераций), уменьшив с 1000 до 100 (случайный выбор) или лучше, имея значимый раннийостановка.

Одна очевидная проблема: нет смысла использовать тренировочные данные (X,y) для критерия ранней остановки (eval_set=[[X,y]],early_stopping_rounds=10), целевая функция будет оптимизирована бесконечно, и ваша тренировка будет остановленадостижение максимального количества только итераций (1000 деревьев в вашем случае).

...