Что такое тюнинг?

Деревья с градиентным усилением (и многие другие модели) используют набор параметров для управления процессом обучения. Эти параметры обычно называются гиперпараметрами и включают в себя такие вещи, как скорость обучения и глубина дерева. Настройка — это процесс корректировки их в рамках нашей модели.

Зачем настраивать?

Модели имеют набор параметров по умолчанию, которые, как правило, дают разумный результат, но не дают наилучшую возможную модель. Путем настройки гиперпараметров мы можем увеличить прогностическую силу нашей модели. Однако, поскольку он включает в себя запуск многих версий модели, для его завершения требуется много вычислительной мощности, и, как правило, достигаются лишь скромные улучшения.

Как настроить свою модель

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

import xgboost as XGB
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score

xgb = XGB.XGBClassifier()

Первый шаг — решить, какой из гиперпараметров мы хотим настроить. Метод get_params выведет список всех гиперпараметров и их значений по умолчанию. Исходя из этого, мы можем решить, что настроить. Двумя общими параметрами для настройки являются max_depth (глубина дерева) и learning_rate (управляет пошаговым изменением между итерациями дерева).

print(xgb.get_params())


{'objective': 'binary:logistic', 'use_label_encoder': True, 'base_score': None, 'booster': None, 'colsample_bylevel': None, 'colsample_bynode': None, 'colsample_bytree': None, 'enable_categorical': False, 'gamma': None, 'gpu_id': None, 'importance_type': None, 'interaction_constraints': None, 'learning_rate': None, 'max_delta_step': None, 'max_depth': None, 'min_child_weight': None, 'missing': nan, 'monotone_constraints': None, 'n_estimators': 100, 'n_jobs': None, 'num_parallel_tree': None, 'predictor': None, 'random_state': None, 'reg_alpha': None, 'reg_lambda': None, 'scale_pos_weight': None, 'subsample': None, 'tree_method': None, 'validate_parameters': None, 'verbosity': None}

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

scores_baseline = cross_val_score(xgb, X_train, y_train, scoring = 'accuracy')

print('The baseline accuracy score is', round(scores_baseline.mean(),4))

The baseline accuracy score is 0.9794

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

grid = {
        'max_depth': [1,2,3,4,5,6,7,8],
        'learning_rate': [0.1,0.2,0.3,0.4,0.5,0.6]
       }

Затем мы можем сравнить базовую оценку с лучшей оценкой из набора введенных нами параметров. В моем примере мы можем увидеть небольшой прирост точности.

search = GridSearchCV(xgb, param_grid = grid)
search.fit(X_train, y_train)
y_pred = search.predict(X_test)
print('The revised accuracy_score is', round(accuracy_score(y_test, y_pred),4))

The revised accuracy_score is 0.9808

Затем можно использовать атрибут best_estimator_, чтобы сообщить нам, какая комбинация параметров дает нам эту оценку.

search2.best_estimator_

XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,
              colsample_bynode=1, colsample_bytree=1, enable_categorical=False,
              gamma=0, gpu_id=-1, importance_type=None,
              interaction_constraints='', learning_rate=0.1, max_delta_step=0,
              max_depth=2, min_child_weight=1, missing=nan,
              monotone_constraints='()', n_estimators=100, n_jobs=8,
              num_parallel_tree=1, predictor='auto', random_state=0,
              reg_alpha=0, reg_lambda=1, scale_pos_weight=1, subsample=1,
              tree_method='exact', validate_parameters=1, verbosity=None)

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

refined_grid = {
        'max_depth': [1,2,3],
        'learning_rate': [0.01, 0.05, 0.1, 0.15]
       }
search2 = GridSearchCV(xgb, param_grid = refined_grid)
search2.fit(X_train, y_train)
y_pred = search2.predict(X_test)
print('The refined accuracy_score is', round(accuracy_score(y_test, y_pred),4))

The refined accuracy_score is 0.9808

После тонкой настройки мы получаем тот же показатель точности, что и в предыдущем раунде, так что не похоже, что мы можем сделать какую-либо дальнейшую настройку этих параметров. Если нам нужно, чтобы наша модель имела еще более высокую точность, мы могли бы начать учитывать дополнительные параметры, но я доволен, что для моей модели достаточно точности 98%.