背景
在机器学习项目中,XGBoost被广泛应用于各类回归和分类任务,尤其因其高效的性能和优秀的预测效果而备受推崇,但在面对大量超参数时,手动调参不仅费时费力,效果也往往不尽如人意,接下来将介绍如何利用贝叶斯优化自动化地调整XGBoost的超参数,从而实现性能的提升
XGBoost模型参数详解
XGBoost的参数主要分为三类:通用参数、增强参数和任务参数,在这里,聚焦于调节与模型复杂度、学习率和正则化相关的关键参数,比如决策树的数量、树的最大深度、学习率、采样比例等,这些参数在不同任务中有着不同的最优组合,通过手动调参找到最优值并不容易,因此使用贝叶斯优化自动调参
超参数优化的基本流程
首先将数据划分为训练集和测试集,确保模型的泛化性能。然后,定义贝叶斯优化的搜索空间和目标函数。在这里,目标函数定义为在测试集上的均方误差(MSE)或准确率,目的是找到使误差最小化或准确率最大化的参数组合。贝叶斯优化通过更新先验分布,不断探索和利用搜索空间,最终在有限的评估次数内找到最优解
代码实现
回归模型
数据读取处理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('2024-11-6-公众号Python机器学习AI—regression.xlsx')
from sklearn.model_selection import train_test_split, KFold
X = df.drop(['待预测变量Y'],axis=1)
y = df['待预测变量Y']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
从文件中加载数据,分离出特征和目标变量“待预测变量Y”,并将数据集划分为训练集(80%)和测试集(20%),为后续的机器学习建模做准备
利用贝叶斯优化提升XGBoost(回归)模型性能
from hyperopt import fmin, tpe, hp
from xgboost import XGBRegressor
from sklearn.metrics import mean_squared_error
# 定义超参数搜索空间
parameter_space_xgb = {
'n_estimators': hp.choice('n_estimators', [50, 100, 200, 300]), # 决策树数量
'max_depth': hp.choice('max_depth', [3, 5, 10, 15]), # 树的最大深度
'learning_rate': hp.uniform('learning_rate', 0.01, 0.3), # 学习率
'subsample': hp.uniform('subsample', 0.5, 1.0), # 每棵树的样本采样比例
'colsample_bytree': hp.uniform('colsample_bytree', 0.5, 1.0), # 每棵树的特征采样比例
'gamma': hp.uniform('gamma', 0, 5) # 剪枝所需的最小损失减少量
}
# 定义目标函数
def objective(params):
# 使用超参数创建XGBoost回归模型
model = XGBRegressor(
n_estimators=params['n_estimators'],
max_depth=params['max_depth'],
learning_rate=params['learning_rate'],
subsample=params['subsample'],
colsample_bytree=params['colsample_bytree'],
gamma=params['gamma'],
random_state=42
)
# 在训练集上拟合模型
model.fit(X_train, y_train)
# 在测试集上预测
y_pred = model.predict(X_test)
# 计算均方误差(MSE)
mse = mean_squared_error(y_test, y_pred)
# 返回MSE,Hyperopt会最小化该目标值
return mse
# 运行超参数优化
best_params = fmin(
fn=objective, # 优化的目标函数
space=parameter_space_xgb, # 搜索空间
algo=tpe.suggest, # 贝叶斯优化算法
max_evals=100 # 最大评估次数
)
# 显示最优超参数组合
print("Best hyperparameters:", best_params)
# 使用最佳超参数组合重新训练模型
best_model_regression = XGBRegressor(
n_estimators=[50, 100, 200, 300][best_params['n_estimators']],
max_depth=[3, 5, 10, 15][best_params['max_depth']],
learning_rate=best_params['learning_rate'],
subsample=best_params['subsample'],
colsample_bytree=best_params['colsample_bytree'],
gamma=best_params['gamma'],
random_state=42
)
# 在训练集上训练模型
best_model_regression.fit(X_train, y_train)
使用Hyperopt库中的贝叶斯优化方法,对XGBoost回归模型的超参数进行自动化调优,目标是最小化模型在测试集上的均方误差(MSE),首先,定义超参数搜索空间,包括决策树的数量、最大深度、学习率、采样比例、特征采样比例和剪枝阈值等关键参数。然后,编写目标函数,该函数使用给定参数组合构建XGBoost模型,在训练集上拟合并在测试集上进行预测,最后返回测试误差MSE。通过Hyperopt的 fmin 函数,在100次评估内找到能最小化MSE的最佳参数组合。找到最佳参数后,代码会重新构建并训练XGBoost模型,以确保最终模型能够在最佳参数下实现最优的预测性能。这种优化流程不仅节省了手动调参的时间,还提高了模型的准确性,为后续的预测任务打下了坚实基础
评估模型性能:训练集与测试集的回归指标对比
from sklearn import metrics
# 预测
y_pred_train = best_model_regression.predict(X_train)
y_pred_test = best_model_regression.predict(X_test)
y_pred_train_list = y_pred_train.tolist()
y_pred_test_list = y_pred_test.tolist()
# 计算训练集的指标
mse_train = metrics.mean_squared_error(y_train, y_pred_train_list)
rmse_train = np.sqrt(mse_train)
mae_train = metrics.mean_absolute_error(y_train, y_pred_train_list)
r2_train = metrics.r2_score(y_train, y_pred_train_list)
# 计算测试集的指标
mse_test = metrics.mean_squared_error(y_test, y_pred_test_list)
rmse_test = np.sqrt(mse_test)
mae_test = metrics.mean_absolute_error(y_test, y_pred_test_list)
r2_test = metrics.r2_score(y_test, y_pred_test_list)
print("训练集评价指标:")
print("均方误差 (MSE):", mse_train)
print("均方根误差 (RMSE):", rmse_train)
print("平均绝对误差 (MAE):", mae_train)
print("拟合优度 (R-squared):", r2_train)
print("\n测试集评价指标:")
print("均方误差 (MSE):", mse_test)
print("均方根误差 (RMSE):", rmse_test)
print("平均绝对误差 (MAE):", mae_test)
print("拟合优度 (R-squared):", r2_test)
计算并输出XGBoost回归模型在训练集和测试集上的性能指标,包括均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)和拟合优度(R-squared),以评估模型在训练集和测试集上的预测准确度和拟合效果,从而帮助判断模型的泛化能力
模型预测可视化
通过计算置信区间来可视化XGBoost回归模型的预测效果,展示预测值与真实值之间的拟合关系,首先,计算模型的拟合线,并使用残差和样本量估计出预测的均方误差,进而基于95%置信水平和t分布计算出置信区间,在绘图部分,生成一个包含以下元素的图表:实际观测值与预测值的散点图、一条理想的1:1对角线、预测值的拟合线(包括模型的R²和MAE值),以及带有扩展置信区间的阴影区域,最终,这个图不仅展示了模型的拟合效果,还直观地表明模型预测的可靠性和不确定性, 代码获取:如果您希望获取本文展示的改进版代码,请添加作者微信联系获取
分类
模型
利用贝叶斯优化提升XGBoost(分类)模型性能
import pandas as pd
import numpy as np
from hyperopt import fmin, tpe, hp
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score
# 读取数据
df = pd.read_excel('2024-11-6-公众号Python机器学习AI—class.xlsx')
# 划分特征和目标变量
X = df.drop(['目标'], axis=1)
y = df['目标']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=df['目标'])
# 定义超参数空间
parameter_space_xgb = {
'n_estimators': hp.choice('n_estimators', [50, 100, 200, 300]), # 决策树数量
'max_depth': hp.choice('max_depth', [3, 5, 10, 15]), # 最大深度
'learning_rate': hp.uniform('learning_rate', 0.01, 0.3), # 学习率
'subsample': hp.uniform('subsample', 0.5, 1.0), # 每棵树的样本采样比例
'colsample_bytree': hp.uniform('colsample_bytree', 0.5, 1.0), # 每棵树的特征采样比例
'gamma': hp.uniform('gamma', 0, 5) # 剪枝所需的最小损失减少量
}
# 定义目标函数
def objective(params):
# 初始化XGBoost分类模型并传入超参数
model = XGBClassifier(
n_estimators=params['n_estimators'],
max_depth=params['max_depth'],
learning_rate=params['learning_rate'],
subsample=params['subsample'],
colsample_bytree=params['colsample_bytree'],
gamma=params['gamma'],
random_state=42,
use_label_encoder=False,
eval_metric='logloss'
)
# 模型拟合
model.fit(X_train, y_train)
# 测试集上的预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
# 返回负的准确率(因为Hyperopt默认最小化目标函数)
return -accuracy
# 运行贝叶斯优化
best_params = fmin(
fn=objective, # 目标函数
space=parameter_space_xgb, # 搜索空间
algo=tpe.suggest, # 贝叶斯优化算法
max_evals=100 # 最大评估次数
)
# 显示最优参数
print("Best hyperparameters:", best_params)
# 使用最佳参数创建最终模型
best_model_class = XGBClassifier(
n_estimators=[50, 100, 200, 300][best_params['n_estimators']],
max_depth=[3, 5, 10, 15][best_params['max_depth']],
learning_rate=best_params['learning_rate'],
subsample=best_params['subsample'],
colsample_bytree=best_params['colsample_bytree'],
gamma=best_params['gamma'],
random_state=42,
use_label_encoder=False,
eval_metric='logloss'
)
# 在训练集上拟合模型
best_model_class.fit(X_train, y_train)
使用贝叶斯优化(Hyperopt库)对XGBoost分类模型的超参数进行自动调优,以最大化分类模型在测试集上的准确率。首先,从Excel中加载数据并将其分为特征和目标变量,再划分为训练集和测试集。然后,定义超参数搜索空间,涵盖决策树数量、树的最大深度、学习率、样本和特征采样比例,以及剪枝所需的损失减少量等关键参数,定义的目标函数会根据每组超参数组合训练模型,并返回测试集上的负准确率,以便Hyperopt最小化该值来寻找到最佳超参数组合,完成优化后,代码构建并训练一个包含最佳超参数的最终XGBoost分类模型,以确保模型在最佳条件下达到最高的分类准确率,这种自动化调参方法不仅显著提高模型性能,减少手动调参的时间和工作量
模型性能评估:多维度分类指标分析
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, classification_report
# 计算各项指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
# 如果是二分类且有预测概率值
try:
y_pred_proba = best_model_class.predict_proba(X_test)[:, 1] # 仅适用于二分类
auc = roc_auc_score(y_test, y_pred_proba)
except AttributeError:
auc = None # 对于多分类或无 predict_proba 时不适用
metrics_df = pd.DataFrame({
'Metric': [ 'AUC', 'Precision', 'Recall', 'F1 Score','Accuracy'],
'Value': [auc, precision, recall, f1, accuracy]
})
metrics_df
计算XGBoost分类模型在测试集上的多个评估指标,包括准确率(accuracy)、精确率(precision)、召回率(recall)、F1分数(F1 Score)和AUC(仅适用于二分类),这些指标各自反映模型不同方面的性能:准确率表示整体预测的准确程度,精确率关注正类预测的准确性,召回率衡量模型找到所有正类的能力,F1分数则平衡了精确率和召回率的权重。AUC则进一步评估了模型在不同阈值下区分正负类的能力。因此,使用多个指标能够更全面地了解模型的表现,从而帮助我们避免因单一指标误导而造成的模型优化偏差
模型预测可视化
绘制模型各评估指标的雷达图,将不同性能指标如准确率、精确率、召回率等在极坐标上可视化,方便直观对比模型在多个维度上的表现,从而帮助识别模型的优势和改进方向, 代码获取:如果您希望获取本文展示的改进版代码,请添加作者微信联系获取
🎁 赠书活动来啦! 🎁
支持知识分享,畅享学习乐趣!特别感谢清华出版社 对本次赠书活动的鼎力支持!即日起,只需
点赞、在看、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《ggplot2科技绘图:基于R语言的数据可视化》这本精彩书籍📚!
💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!
往期推荐
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
SCI图表复现:如何直观展示机器学习模型预测结果的准确性和一致性
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考