Байесовская оптимизация применяется в CatBoost - PullRequest
0 голосов
/ 25 октября 2018

Это моя попытка применить BayesSearch в CatBoost:

from catboost import CatBoostClassifier
from skopt import BayesSearchCV
from sklearn.model_selection import StratifiedKFold


# Classifier
bayes_cv_tuner = BayesSearchCV(
estimator = CatBoostClassifier(
silent=True
),
search_spaces = {
'depth':(2,16),
'l2_leaf_reg':(1, 500),
'bagging_temperature':(1e-9, 1000, 'log-uniform'),
'border_count':(1,255),
'rsm':(0.01, 1.0, 'uniform'),
'random_strength':(1e-9, 10, 'log-uniform'),
'scale_pos_weight':(0.01, 1.0, 'uniform'),
},
scoring = 'roc_auc',
cv = StratifiedKFold(
n_splits=2,
shuffle=True,
random_state=72
),
n_jobs = 1,
n_iter = 100,
verbose = 1,
refit = True,
random_state = 72
)

Отслеживать результаты:

def status_print(optim_result):
"""Status callback durring bayesian hyperparameter search"""

# Get all the models tested so far in DataFrame format
all_models = pd.DataFrame(bayes_cv_tuner.cv_results_)    

# Get current parameters and the best parameters    
best_params = pd.Series(bayes_cv_tuner.best_params_)
print('Model #{}\nBest ROC-AUC: {}\nBest params: {}\n'.format(
    len(all_models),
    np.round(bayes_cv_tuner.best_score_, 4),
    bayes_cv_tuner.best_params_
))

Fit BayesCV

resultCAT = bayes_cv_tuner.fit(X_train, y_train, callback=status_print)

Results

Первые 3 итерации работают нормально, но затем я получаю непрерывную строку:

Iteration with suspicious time 7.55 sec ignored in overall statistics.

Iteration with suspicious time 739 sec ignored in overall statistics.

(...)

Любые идеи о том, где я ошибся / Как можноЯ улучшаю это?

Салют,

1 Ответ

0 голосов
/ 20 января 2019

Одна из итераций в серии экспериментов, которые устраивает Скопт, на самом деле занимает слишком много времени, чтобы завершиться, исходя из времени, которое CatBoost уже записал.

Если вы исследуете, когда это происходит, устанавливая многословие классификатора, и используете обратный вызов, чтобы выяснить, какую комбинацию параметров исследует Скопт, вы можете обнаружить, что виновником, скорее всего, являются параметры глубины: Скопт будет медленнымвниз, когда CatBoost пытается проверить более глубокие деревья.

Вы также можете попробовать отладить, используя этот пользовательский обратный вызов:

counter = 0
def onstep(res):
    global counter
    args = res.x
    x0 = res.x_iters
    y0 = res.func_vals
    print('Last eval: ', x0[-1], 
          ' - Score ', y0[-1])
    print('Current iter: ', counter, 
          ' - Score ', res.fun, 
          ' - Args: ', args)
    joblib.dump((x0, y0), 'checkpoint.pkl')
    counter = counter+1

Вы можете вызвать его по:

resultCAT = bayes_cv_tuner.fit(X_train, y_train, callback=[onstep, status_print])

На самом деле я заметил ту же проблему, что иВ моих экспериментах сложность возрастает нелинейно по мере увеличения глубины, и, следовательно, CatBoost требует больше времени для выполнения своих итераций.Простое решение - попытаться найти более простое пространство:

'depth':(2, 8)

Обычно глубины 8 достаточно, во всяком случае, вы можете сначала запустить skopt с максимальной глубиной, равной 8, а затем повторить итерацию, увеличив максимум.

...