Настройка гиперпараметра XGBoost: PR-AU C изменен после оптимизации и нестабилен - PullRequest
1 голос
/ 29 апреля 2020

Обновление: я увеличиваю резюме до 5, и все еще существуют те же проблемы.

Любое предложение приветствуется. Спасибо.

Я хотел бы выполнить настройку гиперпараметра XGBoost. Из-за дисбаланса класса я использовал PR-AU C (average_precision) в качестве оценки для оценки производительности модели. Также я выполнил оптимизацию для одного / двух параметров каждый раз (RandomizedSearchCV), чтобы уменьшить номер комбинации параметров.

Шаги, которые я делаю:

1-й фрагмент кода ниже оптимизирует подвыборку, и результаты показывают лучше всего subample составляет 0,8.

Затем я использовал subsample = 0,8 и оптимизировал colsample_bytree и max_depth. Тем не менее, окончательная производительность немного ниже, чем у 1-й модели. (Примечания: хотя я использовал randomizedsearchCV, я выполняю поиск во всем пространстве параметров, настраивая param_comb.)

Я ожидаю, что оптимизация во 2-й модели увеличит PR-AU C. (Гиперпараметр наилучшей модели из 1-й оптимизации фактически содержится в пространстве гиперпараметров 2-й оптимизации.) Я обдумывал следующие возможности:

1) перекрестная проверка = 3 может быть достаточно большой? это может вызвать изменение результатов

2) random_state настроено неправильно?

# import libraries
from sklearn.model_selection import RandomizedSearchCV, GridSearchCV
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import StratifiedKFold
from xgboost import XGBClassifier
1st optimization: 
params = {
        'min_child_weight': [1],
        'gamma': [0],
        'subsample': [0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
        'colsample_bytree': [0.8],
        'max_depth': [5],
        'n_estimators': [600]
        }
model1 = XGBClassifier(learning_rate=0.1, objective='binary:logistic', scale_pos_weight=1, seed=27,
                    silent=True, nthread=4)

param_comb = 7
skf = StratifiedKFold(n_splits=folds, shuffle=True, random_state=1001)
# X,Y Both refer to training datasets.
model1_rs = RandomizedSearchCV(model1, param_distributions=params, n_iter=param_comb, scoring='average_precision', n_jobs=-1, cv=skf.split(X,Y), verbose=3, random_state=1001)
model1_rs.fit(X, Y)
print(average_precision_score(y_test, model1_rs.best_estimator_.predict_proba(X_test)[:,1], average="micro"))
# 0.7302823843908489
print(average_precision_score(y_train, model1_rs.predict_proba(X_train)[:,1], average="micro"))
# 0.7827743151047564

# 2nd optimization
params = {
        'min_child_weight': [1],
        'gamma': [0],
        'subsample': [0.8], # model 1 suggest 0.8 is the best as shown model1_rs.best_params_
        'colsample_bytree': [0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
        'max_depth': [3, 4, 5, 6],
        'n_estimators': [600]
        }
model2= XGBClassifier(learning_rate=0.1, objective='binary:logistic', scale_pos_weight=1, seed=27,
                    silent=True, nthread=4)

param_comb = 32 # there are 8*4 combination in the paramater space.
skf = StratifiedKFold(n_splits=folds, shuffle=True, random_state=1001)

model2_rs = RandomizedSearchCV(model2, param_distributions=params, n_iter=param_comb, scoring='average_precision', n_jobs=-1, cv=skf.split(X,Y), verbose=3, random_state=1001)

model2_rs.fit(X, Y)

print(average_precision_score(y_test, model2_rs.best_estimator_.predict_proba(X_test)[:,1], average="micro"))
# 0.7302083383917825
print(average_precision_score(y_train, model2_rs.predict_proba(X_train)[:,1], average="micro"))
# 0.7741629881312448
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...