Python - LightGBM with GridSearchCV,一直运行不停

8

最近,我正在进行多个实验来比较Python的XgBoost和LightGBM。似乎这个LightGBM是一种新的算法,人们说它在速度和准确性方面比XGBoost表现更好。

这是LightGBM GitHub。 这是LightGBM python API documents,这里你会找到可以调用的Python函数。它可以直接从LightGBM模型中调用,也可以通过LightGBM scikit-learn调用。

这是我使用的XGBoost Python API。正如你所看到的,它与上面的LightGBM Python API具有非常相似的数据结构。

下面是我尝试过的内容:

  1. 如果您在XGBoost和LightGBM中都使用了train()方法,那么是的,lightGBM的速度更快、准确率更高。但是这种方法没有交叉验证。
  2. 如果您尝试在这两种算法中使用cv()方法,它就是用于交叉验证的。然而,我没有找到一种方法来使用它返回一组最优参数。
  3. 如果您尝试使用LGBMClassifier和XGBClassifer的scikit-learn GridSearchCV(),它对于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非常有效,仅用了几秒钟的时间。 使用GridSearchCV的LightGBM
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不兼容吗? 我想知道这是否只发生在我身上还是其他人也遇到过类似情况?
2个回答

4

尝试使用n_jobs=1并查看其是否有效。

通常情况下,如果您使用n_jobs=-1n_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__':,正如我所解释的那样运行您的代码,看看它是否有效?


@CherryWu 我会在我的笔记本电脑上进行测试,并让您知道当n_jobs = -1时我是否能够复现问题。 - seralouk

0

原始问题是由于lightgbmGridSearchCV启动了太多的线程(即超过了机器可用的线程数)。如果这些线程的乘积(或者和?这取决于GridSearchCV的实现方式)仍然在机器的能力范围内,那么它将运行。如果有太多的线程,它们会发生冲突,lightgbm会因为某些对开发人员已知但对我不清楚的原因停止执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接