XGBoost - 超参数调优



在本章中,我们将讨论 XGBoost 模型超参数调整这一至关重要的问题。超参数是控制算法学习方式的特定数字或权重。正如我们在上一章中已经看到的,XGBoost 提供了广泛的超参数。通过修改 XGBoost 的超参数,我们可以最大化其效率。XGBoost 以其能够自动调整数千个可学习参数的能力而闻名,以便在数据中找到模式和规律。

在每个节点上选择的决策变量是基于树的模型(如 XGBoost)的可学习参数。设计决策数量的增加会导致较大的超参数。这些是算法训练使用的参数,并且保持不变。

基于树的模型中的超参数包括最大树深度、要生长的树的数量、构建每棵树时要考虑的变量数量、最小叶子样本数量以及用于构建树的观测值的分数。但本章的重点是最大化 XGBoost 超参数,这里介绍的技术适用于任何其他高级 ML 方法。

使用超参数调优 XGBoost

现在我们将了解如何借助超参数来调整我们的 XGBoost 模型 -

1. 导入库

首先,您需要根据以下代码导入所有必要的库 -

# Import pandas for handling data
import pandas as pd

# Import numpy for scientific calculations
import numpy as np

# Import XGBoost for machine learning
import xgboost as xgb
from sklearn.metrics import accuracy_score

# Import libraries for tuning hyperparameters
from hyperopt import STATUS_OK, Trials, fmin, hp, tpe

2. 读取数据集

现在我们将读取我们的数据集。这里我们使用 Wholesale-customers-data.csv 数据集。

data = '/Python/Wholesale customers data.csv'

df = pd.read_csv(data)

3. 声明特征向量和目标变量

这里我们需要声明特征向量和目标变量 -

X = df.drop('Channel', axis=1)

y = df['Channel']

现在让我们看一下特征向量 (X) 和目标变量 (y)。

X.head()
y.head()

输出

以下是上述步骤的结果 -

0    2
1    2
2    2
3    1
4    2
Name: Channel, dtype: int64

我们可以看到 y 标签的值为 1 和 2。我们需要将其转换为 0 和 1 以进行进一步分析。所以我们将按如下方式进行 -

# Change labels into binary values

y[y == 2] = 0

y[y == 1] = 1

然后我们将再次检查 y 标签 -

# Now again see the y label

y.head()

以下是上述部分的结果 -

0    0
1    0
2    0
3    1
4    0
Name: Channel, dtype: int64

因此,您可以在这里看到我们的目标变量 (y) 已转换为 0 和 1。

4. 将数据拆分为单独的训练集和测试集

现在我们将把上述数据拆分为单独的训练集和测试集。按如下方式进行 -

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)

使用 HYPEROPT 进行贝叶斯优化

贝叶斯优化是找到机器学习或深度学习算法的最佳参数的过程。优化是确定最低成本函数的过程,该函数导致模型在训练集和测试集上的整体性能更好。

在这种方法中,我们将使用各种参数范围训练模型,直到找到最佳拟合。超参数调整有助于找到最佳调整的参数并返回最佳拟合模型,这是构建 ML 或 DL 算法时应遵循的最佳方法。

本章讨论了一种最精确和成功的超参数调整方法,即使用 HYPEROPT 进行贝叶斯优化。

什么是 HYPEROPT?

HYPEROPT 是一个高级 Python 包,它搜索超参数值的超参数空间以找到能够最小化损失函数的最佳选项。

贝叶斯优化方法使用 Hyperopt 来调整模型超参数。Hyperopt 是一个用于调整模型超参数的 Python 库。

贝叶斯优化实现

优化过程分为 4 个部分:初始化域空间、定义目标函数、优化算法和结果。所以让我们在这里逐一讨论这些部分 -

1. 初始化域空间

域空间是指我们要搜索的输入值。以下是您可以看到的代码 -

# Set up hyperparameters for tuning using Hyperopt
space = {
    'max_depth': hp.quniform('max_depth', 3, 10, 1),
    'learning_rate': hp.uniform('learning_rate', 0.01, 0.2),
    'n_estimators': hp.quniform('n_estimators', 50, 300, 50),
    'subsample': hp.uniform('subsample', 0.5, 1),
    'colsample_bytree': hp.uniform('colsample_bytree', 0.5, 1),
    'gamma': hp.uniform('gamma', 0, 0.5),
    'lambda': hp.uniform('lambda', 0, 1),
    'alpha': hp.uniform('alpha', 0, 1)
}

2. 定义目标函数

目标函数是任何生成我们要最小化的实值的函数。在本例中,我们专注于相对于其超参数减少 ML 模型的验证误差。如果准确性确实有价值,我们需要将其最大化。然后代码应返回度量的负值。

# Define objective function for hyperparameter tuning
def objective(space):
    clf=xgb.XGBClassifier(
                    n_estimators =space['n_estimators'], max_depth = int(space['max_depth']), gamma = space['gamma'],
                    reg_alpha = int(space['reg_alpha']),min_child_weight=int(space['min_child_weight']),
                    colsample_bytree=int(space['colsample_bytree']))
    
    evaluation = [( X_train, y_train), ( X_test, y_test)]
    
    clf.fit(X_train, y_train,
            eval_set=evaluation, eval_metric="auc",
            early_stopping_rounds=10,verbose=False)
    

    pred = clf.predict(X_test)
    accuracy = accuracy_score(y_test, pred>0.5)
    print ("SCORE:", accuracy)
    return {'loss': -accuracy, 'status': STATUS_OK }

3. 优化算法

它是构建代理目标函数和选择下一个要评估的值的过程。

# Run Hyperopt to find the best hyperparameters
trials = Trials()
best = fmin(
   fn=objective, 
   space=space, 
   algo=tpe.suggest, 
   max_evals=50, 
   trials=trials
)

4. 打印结果

结果是算法用来构建模型的分数或值对。

# Print the best hyperparameters
print("Best Hyperparameters:", best)

输出

Best Hyperparameters: {'alpha': 0.221612523499914, 'colsample_bytree': 0.7560822278126258, 'gamma': 0.05019667254058424, 'lambda': 0.3047164013099425, 'learning_rate': 0.019578072539274467, 'max_depth': 9.0, 'n_estimators': 150.0, 'subsample': 0.7674996723810256}
广告

© . All rights reserved.