Введение:
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