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:
- 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. - 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. - 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:
- Jeśli wystarczy użyć
cv()
metody, czy jest tak, aby dostroić optymalny zestaw parametrów? - 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?
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
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. –
Czy kiedykolwiek rozumiesz, jak używać cv()? Albo jak przeprowadzić walidację krzyżową w LightGBM, bez GridSearchCV? – Alex