Введение:

XGBoost (Extreme Gradient Boosting) — популярный алгоритм машинного обучения, который обычно используется для задач регрессии и классификации. Алгоритм основан на алгоритме Gradient Boosting и использует ансамбль деревьев решений для прогнозирования. XGBoost широко известен своей высокой точностью, скоростью и способностью обрабатывать большие наборы данных.

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

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

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

Код:

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

import pandas as pd
import urllib
import xgboost as xgb
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score
from bayes_opt import BayesianOptimization
import time
from urllib.request import urlretrieve

В этот раздел импортируются необходимые библиотеки и модули. Pandas используется для манипулирования данными, urllib используется для загрузки набора данных, xgboost — это библиотека машинного обучения, которую мы будем использовать, sklearn — для перекрестной проверки и поиска по сетке, а библиотека bayes_opt — для байесовской оптимизации. Модули time и urllib.request также импортируются для различных целей.

start_time = time.time()

# Download and load the Adult dataset
print('Downloading and loading the dataset...')
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data'
filename = 'adult.csv'

# Download the dataset and save it to a file
urlretrieve(url, filename)

columns = ['age', 'workclass', 'fnlwgt', 'education', 'education-num', 'marital-status', 'occupation',
           'relationship', 'race', 'sex', 'capital-gain', 'capital-loss', 'hours-per-week', 'native-country', 'income']
data = pd.read_csv(filename, names=columns, skipinitialspace=True)

# Convert the target variable to binary (0 or 1)
data['income'] = (data['income'] == '>50K').astype(int)

# Separate the features and target variable
X = data.drop('income', axis=1)
y = data['income']

В этом разделе загружается и загружается набор данных для взрослых. Функция urlretrieve используется для загрузки набора данных с заданного URL-адреса и сохранения его в файл. Затем набор данных загружается в кадр данных pandas с указанными именами столбцов. Целевая переменная «доход» преобразуется в двоичную форму (0 или 1), чтобы сделать ее пригодной для классификации. Функции и целевая переменная разделены на две переменные, X и y.

# Convert categorical features to one-hot encoding
print('Performing one-hot encoding of categorical features...')
cat_features = ['workclass', 'education', 'marital-status', 'occupation', 'relationship', 'race', 'sex',

В этом разделе выполняется однократное кодирование категориальных признаков. Горячее кодирование — это процесс преобразования категориальных переменных в двоичное векторное представление. Это необходимо, потому что многие алгоритмы машинного обучения не могут напрямую обрабатывать категориальные данные. Функция get_dummies из pandas используется для выполнения быстрого кодирования указанных категориальных функций.

# Split the data into training and test sets
print('Splitting the data into training and test sets...')
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

В этом разделе данные разбиваются на обучающие и тестовые наборы с использованием функции train_test_split из sklearn. Функция принимает функции и целевую переменную и разбивает их на обучающий набор и тестовый набор. Параметр test_size указывает долю набора данных, включаемую в тестовый набор, а параметр random_state гарантирует, что данные разбиваются одинаково при каждом запуске кода.

# Define the objective function for Bayesian optimization
def xgb_cv(max_depth, learning_rate, subsample, colsample_bytree):
    params = {'objective': 'binary:logistic',
              'max_depth': int(max_depth),
              'learning_rate': learning_rate,
              'subsample': subsample,
              'colsample_bytree': colsample_bytree}
    dtrain = xgb.DMatrix(X_train, label=y_train)
    cv_result = xgb.cv(params, dtrain, num_boost_round=100, early_stopping_rounds=10, nfold=5, metrics='error')
    return -cv_result['test-error-mean'].iloc[-1]

В этом разделе определяется целевая функция для байесовской оптимизации. Функция принимает четыре гиперпараметра — max_depth, learning_rate, subsample и colsample_bytree — и возвращает отрицательное среднее значение ошибки теста из 5-кратной перекрестной проверки модели XGBoost. Функция xgb.cv используется для выполнения перекрестной проверки. Словарь params определяет гиперпараметры, которые будут использоваться в модели XGBoost, а объект DMatrix используется для преобразования обучающих данных в формат, подходящий для XGBoost.

# Define the search space for Bayesian optimization
pbounds = {'max_depth': (3, 9),
           'learning_rate': (0.01, 0.5),
           'subsample': (0.1, 1),
           'colsample_bytree': (0.1, 1)}

В этом разделе определяется пространство поиска для байесовской оптимизации с использованием словаря pbounds. Этот словарь содержит минимальное и максимальное значения для каждого гиперпараметра.

# Create a BayesianOptimization object and run the optimization
print('Performing hyperparameter tuning using Bayesian optimization...')
optimizer = BayesianOptimization(f=xgb_cv, pbounds=pbounds, random_state=1)
optimizer.maximize(init_points=5, n_iter=20)

В этом разделе создается объект BayesianOptimization и выполняется оптимизация с использованием метода maximize. Параметр init_points указывает количество случайных начальных точек для оценки, а параметр n_iter указывает количество итераций для запуска оптимизации.

# Train the XGBoost model with the best hyperparameters from Bayesian optimization
print('Training the XGBoost model with the best hyperparameters from Bayesian optimization...')
params = {'objective': 'binary:logistic',
          'max_depth': int(optimizer.max['params']['max_depth']),
          'learning_rate': optimizer.max['params']['learning_rate'],
          'subsample': optimizer

В этом разделе обучается модель XGBoost с использованием лучших гиперпараметров, полученных в результате байесовской оптимизации. Гиперпараметры извлекаются из объекта optimizer с помощью метода max. Словарь params определяет гиперпараметры для модели XGBoost, а функция train используется для обучения модели с использованием объекта DMatrix.

# Make predictions on the test set
print('Making predictions on the test set...')
dtest = xgb.DMatrix(X_test)
y_pred = model.predict(dtest)
y_pred = [int(round(value)) for value in y_pred]

# Evaluate the model's accuracy
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy: %.2f%%' % (accuracy * 100.0))

В этом разделе делаются прогнозы на тестовом наборе с использованием обученной модели XGBoost и оценивается точность модели. Функция predict используется для прогнозирования набора тестов, а функция accuracy_score из sklearn используется для расчета точности модели.

# Perform hyperparameter tuning using GridSearchCV
print('Performing hyperparameter tuning using GridSearchCV...')
params = {'max_depth': [3, 5, 7],
          'learning_rate': [0.1, 0.01, 0.001],
          'subsample': [0.7, 0.8, 0.9],
          'colsample_bytree': [0.7, 0.8, 0.9]}
xgb_model = xgb.XGBClassifier(objective='binary:logistic', n_estimators=100, random_state=42)
grid_search = GridSearchCV(estimator=xgb_model, param_grid=params, scoring='accuracy', n_jobs=-1, cv=5)
grid_search.fit(X_train, y_train)

В этом разделе выполняется настройка гиперпараметров с использованием поиска по сетке с перекрестной проверкой. Словарь params указывает гиперпараметры, которые необходимо настроить, а функция GridSearchCV из sklearn используется для выполнения поиска по сетке. Параметр estimator указывает модель для настройки, а параметр param_grid указывает гиперпараметры для настройки. Параметр scoring указывает используемую метрику оценки, а параметр cv указывает количество сгибов для перекрестной проверки.

# Train the XGBoost model with the best hyperparameters from GridSearchCV
print('Training the XGBoost model with the best hyperparameters from GridSearchCV...')
best_params = grid_search.best_params_
model = xgb.XGBClassifier(objective='binary:logistic', n_estimators=100, random_state=42, **best_params)
model.fit(X_train, y_train)

# Make predictions on the test set
print('Making predictions on the test set...')
y_pred = model.predict(X_test)

# Evaluate the model's accuracy
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy: %.2f%%' % (accuracy * 100.0))

print('Time taken:', time.time() - start_time)

В этом разделе обучается модель XGBoost с использованием лучших гиперпараметров, полученных в результате поиска по сетке. Лучшие гиперпараметры извлекаются из объекта grid_search с использованием атрибута best_params_. Класс XGBClassifier из xgboost используется для создания модели, а метод fit используется для обучения модели на обучающем наборе. Прогнозы делаются на тестовом наборе, а точность модели оценивается с помощью функции accuracy_score. Общее время, затраченное на запуск кода, также печатается.

Таким образом, этот код демонстрирует использование байесовской оптимизации и поиска по сетке с перекрестной проверкой для настройки гиперпараметров модели XGBoost. Набор данных, используемый в этом коде, — это набор данных для взрослых, который содержит информацию о людях и их доходах. Цель модели — предсказать, превышает ли доход человека 50 тысяч долларов или нет. Модель XGBoost обучается на наборе данных, а ее гиперпараметры настраиваются с помощью байесовской оптимизации и поиска по сетке с перекрестной проверкой. Точность модели оценивается на тестовом наборе, и лучшие гиперпараметры, полученные с помощью обоих методов оптимизации, используются для обучения окончательной модели XGBoost.

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

Подпишитесь на DDIntel Здесь.

Посетите наш сайт здесь: https://www.datadriveninvestor.com

Присоединяйтесь к нашей сети здесь: https://datadriveninvestor.com/collaborate