2017-07-11 217 views
5

最近,我正在做多个实验来比较Python XgBoost和LightGBM。看起来这个LightGBM是一种新的算法,人们说它在速度和准确性方面比XGBoost更好。Python - LightGBM与GridSearchCV,永远在运行

这是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

    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,只有工具数秒

    XGBClassifier:

这里使用时GridSearchCV()与两个分类是我的代码示例。

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不兼容吗?我想知道这是否只发生在我身上发生在别人身上?
+1

这似乎是一个已知问题。你可以看到[这里](https://github.com/Microsoft/LightGBM/issues/246)。你可以尝试通过减少n_jobs来运行脚本吗? – Sriram

+1

我不能相信它......只有当我设置'n_jobs = 1'时,它才能工作,即使它并行运行2个作业,它也会冻结。非常感谢你!我认为更多的工作运行得更快,因此从未试图改变工作数量,也没有找到解决方案。你可以把它作为解决方案,以便我可以关闭这个问题。 –

+0

你知道如何使用cv()吗?或者如何在没有GridSearchCV的LightGBM中进行交叉验证? – Alex

回答

0

尝试使用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__':,正如我解释过的,看看它是否有效?

+0

对于LightGBM,只有'n_jobs = 1'为我工作。 –

+0

@CherryWu我会在我的笔记本电脑上测试它,并让你知道我是否可以在n_jobs = -1时重现问题 – sera