Làm cách nào để sử dụng XGboost.cv với tối ưu hóa siêu đường kính?


11

Tôi muốn tối ưu hóa siêu đường kính của XGboost bằng cách sử dụng giá trị chéo. Tuy nhiên, không rõ làm thế nào để có được mô hình từ xgb.cv. Ví dụ tôi gọi objective(params)từ fmin. Sau đó mô hình được trang bị trên dtrainvà xác nhận trên dvalid. Điều gì sẽ xảy ra nếu tôi muốn sử dụng phương pháp xác định giá trị KFold thay vì đào tạo dtrain?

from hyperopt import fmin, tpe
import xgboost as xgb

params = {
             'n_estimators' : hp.quniform('n_estimators', 100, 1000, 1),
             'eta' : hp.quniform('eta', 0.025, 0.5, 0.025),
             'max_depth' : hp.quniform('max_depth', 1, 13, 1)
             #...
         }
best = fmin(objective, space=params, algo=tpe.suggest)

def objective(params):
    dtrain = xgb.DMatrix(X_train, label=y_train)
    dvalid = xgb.DMatrix(X_valid, label=y_valid)
    watchlist = [(dtrain, 'train'), (dvalid, 'eval')]
    model = xgb.train(params, dtrain, num_boost_round, 
                      evals=watchlist, feval=myFunc)
    # xgb.cv(param, dtrain, num_boost_round, nfold = 5, seed = 0,
    #        feval=myFunc)

Câu trả lời:


19

Đây là cách tôi đã đào tạo một trình xgboostphân loại với xác thực chéo 5 lần để tối ưu hóa điểm F1 bằng cách sử dụng tìm kiếm ngẫu nhiên để tối ưu hóa siêu tham số. Lưu ý rằng Xyở đây nên là dataframes gấu trúc.

from scipy import stats
from xgboost import XGBClassifier
from sklearn.model_selection import RandomizedSearchCV, KFold
from sklearn.metrics import f1_score

clf_xgb = XGBClassifier(objective = 'binary:logistic')
param_dist = {'n_estimators': stats.randint(150, 500),
              'learning_rate': stats.uniform(0.01, 0.07),
              'subsample': stats.uniform(0.3, 0.7),
              'max_depth': [3, 4, 5, 6, 7, 8, 9],
              'colsample_bytree': stats.uniform(0.5, 0.45),
              'min_child_weight': [1, 2, 3]
             }
clf = RandomizedSearchCV(clf_xgb, param_distributions = param_dist, n_iter = 25, scoring = 'f1', error_score = 0, verbose = 3, n_jobs = -1)

numFolds = 5
folds = KFold(n_splits = numFolds, shuffle = True)

estimators = []
results = np.zeros(len(X))
score = 0.0
for train_index, test_index in folds.split(X):
    X_train, X_test = X.iloc[train_index,:], X.iloc[test_index,:]
    y_train, y_test = y.iloc[train_index].values.ravel(), y.iloc[test_index].values.ravel()
    clf.fit(X_train, y_train)

    estimators.append(clf.best_estimator_)
    results[test_index] = clf.predict(X_test)
    score += f1_score(y_test, results[test_index])
score /= numFolds

Cuối cùng, bạn sẽ có được một danh sách các phân loại đào tạo estimators, một dự đoán cho toàn bộ dữ liệu trong resultsxây dựng từ out-of-lần dự đoán, và một ước tính cho các điểm trong .F1score


1
Làm thế nào để mã này quản lý num_boost_round và Early_stopping_rounds?
mfaieghi

3

Tôi không đủ uy tín để bình luận về câu trả lời của @ darXider. Vì vậy, tôi thêm một "câu trả lời" để bình luận.

Tại sao bạn cần for train_index, test_index in folds:từ clfđã được làm cross-validation để chọn các thiết lập tốt nhất của các giá trị siêu tham số?

Trong mã của bạn, có vẻ như bạn thực hiện CV cho mỗi năm lần (một CV "lồng") để chọn mô hình tốt nhất cho lần gấp cụ thể đó. Vì vậy, cuối cùng, bạn sẽ có năm ước tính "tốt nhất". Rất có thể, chúng không có cùng giá trị siêu tham số.

Đúng nếu tôi đã sai lầm.


Có, theo mặc định RandomizedSearchCV sử dụng CV 3 lần để xác định tham số. Nó có thể được thay đổi thành bất kỳ số lần gấp khác nếu cần.
Satwik Bhattamishra

1
Như bạn đã nhận thấy, đây là một lược đồ xác thực chéo được lồng vào nhau và bạn có quyền rằng năm mô hình "tốt nhất" không có cùng tham số siêu. Tuy nhiên, cuối cùng, bạn nhận được 5 mô hình "tốt nhất" tương đương (và bạn có thể sử dụng chúng trong một nhóm, chẳng hạn) để thực hiện dự đoán của mình. Hơn nữa, những gì lược đồ này thực hiện là nó cung cấp cho bạn các dự đoán cho toàn bộ tập dữ liệu (như tôi đã đề cập trong câu trả lời của mình, bằng cách kết hợp các dự đoán ngoài luồng của mỗi mô hình). Ngoài ra, nó cũng cung cấp cho bạn một ước tính cho mức chênh lệch trong điểm số (trái ngược với chỉ một giá trị).
darXider
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.