2017-07-11 219 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