2017-07-11 20 views
5

Gần đây, tôi đang thực hiện nhiều thử nghiệm để so sánh Python XgBoost và LightGBM. Dường như LightGBM này là một thuật toán mới mà mọi người nói nó hoạt động tốt hơn XGBoost ở cả tốc độ lẫn độ chính xác.Python - LightGBM với GridSearchCV, đang chạy mãi mãi

Đây là LightGBM GitHub. Đây là LightGBM python API documents, tại đây bạn sẽ tìm thấy các hàm python mà bạn có thể gọi. Nó có thể được gọi trực tiếp từ mô hình LightGBM và cũng có thể được gọi bởi LightGBM scikit-learn.

Đây là số XGBoost Python API tôi sử dụng. Như bạn có thể thấy, nó có cấu trúc dữ liệu rất giống với API python LightGBM ở trên.

Dưới đây là những gì tôi đã cố gắng:

  1. Nếu bạn sử dụng train() phương pháp trong cả XGBoost và LightGBM, vâng lightGBM hoạt động nhanh hơn và có độ chính xác cao hơn. Nhưng phương pháp này, không có xác thực chéo.
  2. Nếu bạn thử phương pháp cv() trong cả hai thuật toán, đó là để xác thực chéo. Tuy nhiên, tôi không tìm cách sử dụng nó để trả về một tập hợp các tham số tối ưu.
  3. nếu bạn thử scikit-learn GridSearchCV() với LGBMClassifier và XGBClassifer. Nó hoạt động cho XGBClassifer, nhưng đối với LGBClassifier, nó đang chạy mãi mãi.

Dưới đây là những ví dụ mã của tôi khi sử dụng GridSearchCV() với cả phân loại:

XGBClassifier với 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_ 

này hoạt động rất tốt cho XGBoost, và chỉ có công cụ một vài giây.

LightGBM với 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_ 

Tuy nhiên, bằng cách sử dụng phương pháp này cho LightGBM, nó đã được chạy cả buổi sáng nay vẫn không có gì được tạo ra.

Tôi đang sử dụng cùng một tập dữ liệu, tập dữ liệu chứa 30000 bản ghi.

Tôi có 2 câu hỏi:

  1. Nếu chúng ta chỉ cần sử dụng cv() phương pháp, là có anyway để điều chỉnh thiết lập tối ưu các thông số?
  2. Bạn có biết tại sao GridSearchCV() không hoạt động tốt với LightGBM không? Tôi tự hỏi liệu điều này chỉ xảy ra với tôi tất cả những gì đã xảy ra với người khác?
+1

Điều này có vẻ là một vấn đề đã biết. Bạn có thể xem [tại đây] (https://github.com/Microsoft/LightGBM/issues/246). Bạn có thể thử chạy kịch bản bằng cách giảm n_jobs không? – Sriram

+1

Tôi không thể tin được ... Chỉ khi tôi đặt 'n_jobs = 1', nó hoạt động, thậm chí là 2 công việc chạy song song, nó bị đóng băng. Cảm ơn nhiều! Tôi nghĩ nhiều việc làm chạy nhanh hơn nên không bao giờ cố thay đổi số công việc và không tìm ra giải pháp đó. Bạn có thể đặt nó như là giải pháp, để tôi có thể đóng câu hỏi này. –

+0

Bạn đã bao giờ hiểu cách sử dụng cv() chưa? Hoặc làm cách nào để thực hiện xác thực chéo trong chính LightGBM mà không có GridSearchCV? – Alex

Trả lời

0

Hãy thử sử dụng n_jobs = 1 và xem nó có hoạt động hay không.

Nói chung, nếu bạn sử dụng n_jobs = -1 hoặc n_jobs > 1 thì bạn nên bảo vệ kịch bản của bạn bằng cách sử dụng if __name__=='__main__'::

Ví dụ đơn giản:

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) 

Cuối cùng, bạn có thể thử để chạy mã của bạn sử dụng n_jobs = -1 và bao gồm if __name__=='__main__': như tôi đã giải thích và xem nó có hoạt động không?

+0

Đối với LightGBM, chỉ 'n_jobs = 1' làm việc cho tôi. –

+0

@CherryWu Tôi sẽ kiểm tra nó trên máy tính xách tay của tôi và cho bạn biết nếu tôi có thể tái tạo vấn đề khi n_jobs = -1 – sera

Các vấn đề liên quan