2017-07-11 9 views
5

Niedawno robię wiele eksperymentów, aby porównać Python XgBoost i LightGBM. Wygląda na to, że LightGBM to nowy algorytm, który według ludzi działa lepiej niż XGBoost, zarówno pod względem prędkości, jak i dokładności.Python - LightGBM z GridSearchCV, działa wiecznie

To jest LightGBM GitHub. To jest LightGBM python API documents, tutaj znajdziesz funkcje Pythona, które możesz wywołać. Można go wywołać bezpośrednio z modelu LightGBM, a także można go nazwać metodą uczenia się LightGBM.

To jest XGBoost Python API Używam. Jak widać, ma bardzo podobną strukturę danych jak API python LightGBM powyżej.

Oto, co starałem:

  1. Jeśli używasz train() metody zarówno XGBoost i LightGBM, tak lightGBM działa szybciej i ma większą dokładność. Ale ta metoda nie ma walidacji krzyżowej.
  2. Jeśli spróbujesz użyć metody cv() w obu algorytmach, będzie ona sprawdzana krzyżowo. Jednak nie znalazłem sposobu, aby go użyć, zwracając zestaw optymalnych parametrów.
  3. jeśli spróbujesz scikit-learn GridSearchCV() z LGBMClassifier i XGBClassifer. Działa dla XGBClassifer, ale dla LGBClassifier działa na zawsze.

Oto moje przykłady kodu przy użyciu GridSearchCV() z obu klasyfikatorów:

XGBClassifier z 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_ 

Działa to bardzo dobrze dla XGBoost i tylko narzędzie w ciągu kilku sekund.

LightGBM z 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_ 

Jednak stosując tę ​​metodę LightGBM, został uruchomiony cały ranek dzisiaj jeszcze nic wygenerowany.

Używam tego samego zestawu danych, zbiór danych zawiera 30000 rekordów.

mam 2 pytania:

  1. Jeśli wystarczy użyć cv() metody, czy jest tak, aby dostroić optymalny zestaw parametrów?
  2. Czy wiesz, dlaczego GridSearchCV() nie działa dobrze z LightGBM? Zastanawiam się, czy to się dzieje tylko u mnie, na wszystkim, co się stało z innymi?
+1

To wydaje się być znanym problemem. Możesz zobaczyć [tutaj] (https://github.com/Microsoft/LightGBM/issues/246). Czy możesz spróbować uruchomić skrypt, redukując n_jobs? – Sriram

+1

Nie mogę w to uwierzyć ... Tylko jeśli ustawię 'n_jobs = 1', to działa, nawet jeśli są to 2 zadania działające równolegle, to zawiesza się. Dziękuję Ci bardzo! Myślałem, że więcej zleceń pracuje szybciej, więc nigdy nie próbowałem zmieniać numerów zleceń i nie znalazłem takiego rozwiązania. Możesz ustawić to jako rozwiązanie, dzięki czemu mogę zamknąć to pytanie. –

+0

Czy kiedykolwiek rozumiesz, jak używać cv()? Albo jak przeprowadzić walidację krzyżową w LightGBM, bez GridSearchCV? – Alex

Odpowiedz

0

Spróbuj użyć n_jobs = 1 i sprawdź, czy działa.

W ogóle, jeśli używasz n_jobs = -1 lub n_jobs > 1 następnie należy chronić swój skrypt używając if __name__=='__main__'::

Prosty przykład:

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) 

Wreszcie, można spróbować uruchomić swój kod za pomocą n_jobs = -1 i włączając if __name__=='__main__':, jak wyjaśniłem i zobacz, czy to działa?

+0

Dla LightGBM, tylko 'n_jobs = 1' pracował dla mnie. –

+0

@CherryWu Przetestuję to na moim laptopie i dam znać, czy mogę odtworzyć problem, gdy n_jobs = -1 – sera

Powiązane problemy