我阅读了前面关于LightGBM的文章以及挂起的GridSearchCV(),并相应地更正了我的代码。但是,代码似乎要挂在上面,比如>3个小时!
我有一个8GB内存,数据有29802行和13科尔。大部分的科尔都是被标记为数字的分类值。
请看下面的代码。等待您的宝贵建议!
最初,我在lgb.train()中获得了89%的AUC。
但是在使用LGBMClassifier()之后,我将无法接近它。因此,我选择了GridSearchCV()。
我需要LGBMClassifier(),因为我想要得分()和其他在使用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 ...............请帮帮忙!
问候谢林
发布于 2018-08-27 12:33:27
你的问题和前面提到的绞刑不同。你训练了很多(3456)分类器,每一个(1000)非常深(叶子13.80)树。因此,训练时间是很长的。解决方案要么是对树的深度更适度(最实际的方法是将深度固定为-1,并在网格搜索中改变叶子的数量,对于您的数据集大小可能在10到40叶之间?),或者减少网格点的数量(860个网格点是A很大的),或者通过有意义的早期停止来减少树的数量(=迭代),或者通过有意义的早期停止来减少树的数量(=迭代)。
一个明显的问题:使用训练数据(X,y)作为早期停止准则(eval_set=[[X,y]],early_stopping_rounds=10)是没有意义的,目标函数将被无限优化,您的训练只会达到最大迭代次数(在您的情况下为1000棵树)。
https://stackoverflow.com/questions/52025436
复制相似问题