lightgbm gridsearchcv 永远挂在n_jobs=1

lightgbm gridsearchcv hanging forever with n_jobs=1

我阅读了关于 LightGBM 与 GridSearchCV() 一起使用的先前帖子,该帖子挂起并相应地更正了我的代码。但代码似乎仍然挂起 > 3 小时!

我有一个 8 GB RAM,数据有 29802 行和 13 列。大多数 cols 是已标记为数字的分类值。

请看下面的代码。期待您的宝贵建议!

最初我用 lgb.train() 得到了 89% 的 AUC。

但是在使用 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 ...............

请帮忙!

问候 谢林

您的问题与上述挂机不同。您训练了很多 (3456) 个分类器,每个分类器都有许多 (1000) 个非常深的树(叶子 13..80)。因此,训练时间非常长。解决方案是在树深度上更适度(最实用的是将深度固定为 -1 并改变网格搜索中的叶子数量,对于您的数据集大小,它可能在 10 到 40 个叶子之间?),或者减少网格点的数量(860 个网格点是 很多),或者通过从 1000 减少到 100(随机选择)或更好来减少树的数量(=迭代)通过有意义的提前停止。

一个明显的问题:没有必要将训练数据 (X,y) 用于早停标准 (eval_set=[[X,y]],early_stopping_rounds=10) objective 函数将被无限优化并且你的仅达到最大迭代次数(在您的情况下为 1000 棵树)将停止训练。