代码之家  ›  专栏  ›  技术社区  ›  Cherry Wu

带有GridSearchCV的Python-LightGBM将永远运行

  •  6
  • Cherry Wu  · 技术社区  · 9 年前

    最近,我做了多个实验来比较Python XgBoost和LightGBM。似乎LightGBM是一种新算法,人们说它在速度和准确性方面都优于XGBoost。

    LightGBM GitHub . 这是 LightGBM python API documents

    XGBoost Python API 我使用。如您所见,它的数据结构与上面的LightGBM python API非常相似。

    以下是我尝试的内容:

    1. 如果您使用 train()
    2. cv() 方法在两种算法中,都是用于交叉验证。然而,我没有找到使用它返回一组最佳参数的方法。
    3. GridSearchCV() 使用LGBMClassifier和XGBClassifier。它适用于XGBClassifier,但对于LGBClassizer,它将永远运行。

    下面是我使用时的代码示例 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非常有效,只需几秒钟。

    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_
    

    我使用的是同一个数据集,一个数据集包含30000条记录。

    1. 如果我们只是使用 cv() 方法,是否有优化参数集的方法?
    2. 你知道为什么吗 LightGBM不能很好地工作?我想知道这是否只发生在我身上,而其他人身上发生的一切?
    2 回复  |  直到 9 年前
        1
  •  3
  •   seralouk    9 年前

    尝试使用 n_jobs = 1 看看它是否有效。

    n_jobs = -1 n_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\u作业=-1 如果\uu name\uu=='\ uu main\uuu': 正如我解释的那样,看看它是否有效?

        2
  •  0
  •   Mischa Lisovyi    8 年前

    最初的问题是由于 lightgbm 和 GridSearchCV 实现),然后它将运行。如果有太多的线程冲突和 lightgbm 停止执行的原因我不清楚,但开发者知道。

    推荐文章