Python - 带有GridSearchCV的LightGBM,正在永远运行

时间:2017-07-11 23:20:15

标签: python cross-validation xgboost grid-search lightgbm

最近,我正在做多个实验来比较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,它永远运行。
  4. 以下是将GridSearchCV()与两个分类器一起使用时的代码示例:

    使用GridSearchCV的XGBC分类器

    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条记录。

    我有两个问题:

    1. 如果我们只使用cv()方法,无论如何都要调整最佳参数集?
    2. 您知道为什么GridSearchCV()与LightGBM不兼容吗?我想知道这是否只发生在我身上其他人身上发生的事情?

1 个答案:

答案 0 :(得分:1)

尝试使用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__':,看看它是否有效?