✨ 欢迎关注 ✨
本节介绍: 贝叶斯优化XGBoost模型结合Early Stopping提高模型泛化能力减少过拟合 ,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。 获取 前请咨询,避免不必要的问题。文末点赞、推荐参与免费书籍包邮赠送!
✨ 流程信息 ✨
使用Optuna对XGBoost回归模型的超参数(如决策树数量、最大深度、学习率等)进行优化,结合早停机制(early stopping)避免过拟合,并根据优化结果重新训练模型,设置最佳迭代轮数,确保模型在训练集和验证集上的最佳性能
通过直接划分训练集和测试集的方法简化使用K折交叉验证时的早停问题,因为在K折交叉验证中,每个折的验证集会产生不同的早停轮数,这使得每次训练的模型有所不同,从而增加了模型的复杂性和计算成本。而使用固定的训练集和验证集时,只需要一个早停机制来确定最佳迭代次数,从而简化模型训练和优化过程,避免因不同折的验证集导致的早停结果不一致的问题,参考往期文章——期刊复现:XGBoost模型采用Early Stopping策略提高模型的泛化能力减少过拟合,当然为了说明模型稳定性,也可以在后续单独利用k折返回每折成绩及平均成绩,但是不参与早停机制
✨ 代码实现 ✨
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
import warnings
# 忽略所有警告
warnings.filterwarnings("ignore")
path = r"2025-8-2公众号Python机器学习AI.xlsx"
df = pd.read_excel(path)
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df.drop(['SR', 'salinity', 'T', 'infpro'], axis=1) # 特征 https://mp.weixin.qq.com/s/V6tBbYxm157oZhtU7Dn4vg 多重共线性剔除
y = df['SR'] # 目标变量
# 划分训练集和测试集,测试集占 20%
X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 然后将训练集进一步划分为训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.125, random_state=42) # 0.125 x 0.8 = 0.1
将数据集划分为训练集(80%)、验证集(10%)和测试集(10%),其中训练集用于模型的训练,验证集用于超参数调优和早停,测试集用于评估最终模型的性能
import optuna # 导入Optuna库,用于超参数优化
from xgboost import XGBRegressor
from sklearn.metrics import mean_squared_error
import numpy as np
from optuna.visualization import plot_optimization_history, plot_contour, plot_param_importances, plot_parallel_coordinate, plot_edf # 导入Optuna的可视化工具,用于绘制优化历史、参数重要性等
# 设置全局随机种子
np.random.seed(1313)
# 定义目标函数,用于Optuna的优化
def objective(trial):
# 定义模型的超参数搜索空间,Optuna会在此范围内进行参数采样
params = {
'n_estimators': trial.suggest_int('n_estimators', 50, 500, step=50),
'max_depth': trial.suggest_int('max_depth', 3, 15, step=1),
'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.3),
'subsample': trial.suggest_uniform('subsample', 0.5, 1.0),
'colsample_bytree': trial.suggest_uniform('colsample_bytree', 0.5, 1.0),
'gamma': trial.suggest_uniform('gamma', 0, 5)
}
# 使用采样的参数创建XGBRegressor模型
model = XGBRegressor(**params, random_state=42)
# 使用训练数据拟合模型
model.fit(X_train, y_train)
# 使用验证集进行预测
y_pred = model.predict(X_val)
# 计算并返回均方误差(MSE),作为优化的目标
return mean_squared_error(y_val, y_pred)
# 创建Optuna的Study对象,并设置优化方向为“minimize”表示最小化均方误差
study = optuna.create_study(direction="minimize", sampler=optuna.samplers.TPESampler(seed=42)) # 设置Optuna的采样器种子
# 运行优化,进行100次试验
study.optimize(objective, n_trials=100)
print("Best parameters:", study.best_params)
# 使用最佳参数重新训练模型
best_model = XGBRegressor(**study.best_params, random_state=42)
best_model.fit(X_train, y_train)
使用Optuna 对XGBoost回归模型的超参数进行优化,通过最小化验证集的均方误差(MSE)来找到最佳的超参数组合,并使用这些最佳参数重新训练模型
# 从已训练的模型中获取超参数
best_model_params = best_model.get_params()
# 使用从 best_model 提取的超参数来初始化一个新的 XGBRegressor 模型
xgboost_model = XGBRegressor(**best_model_params)
print("\nBest Parameters Found:")
print(best_model_params)
从已训练的best_model中提取超参数,并使用这些超参数初始化一个新的XGBRegressor模型,确保新模型具有相同的设置
import xgboost as xgb
# 假设你的训练数据为 X_train, X_val, y_train, y_val
# 使用 XGBoost 的早停处理
xgboost_model.fit(
X_train, y_train, # 使用训练集进行训练
eval_set=[(X_val, y_val)], # 使用验证集进行监控
early_stopping_rounds=50, # 设置早停轮数
verbose=True # 设置为True显示训练过程中的信息
)
# 获取最佳迭代轮数
best_iteration = xgboost_model.best_iteration
print(f"Early Stopping Best Iteration: {best_iteration}")
# 设置最佳迭代轮数
xgboost_model.n_estimators = best_iteration
# 重新训练
xgboost_model.fit(X_train, y_train)
使用XGBoost的早停机制进行训练,找到最佳迭代轮数,并根据该轮数调整n_estimators,然后重新训练模型
from sklearn.metrics import mean_squared_error, r2_score
# 在训练集和测试集上进行预测
xgboost_train_pred = xgboost_model.predict(X_train)
xgboost_test_pred = xgboost_model.predict(X_test)
# 计算训练集的 R² 和 RMSE
xgboost_r2_train = r2_score(y_train, xgboost_train_pred)
xgboost_rmse_train = np.sqrt(mean_squared_error(y_train, xgboost_train_pred))
# 计算测试集的 R² 和 RMSE
xgboost_r2_test = r2_score(y_test, xgboost_test_pred)
xgboost_rmse_test = np.sqrt(mean_squared_error(y_test, xgboost_test_pred))
# 输出结果
print(f"xgboost 训练集结果: R² = {xgboost_r2_train:.4f}, RMSE = {xgboost_rmse_train:.4f}")
print(f"xgboost 测试集结果: R² = {xgboost_r2_test:.4f}, RMSE = {xgboost_rmse_test:.4f}")
使用训练好的 xgboost_model 对训练集和测试集进行预测,计算并输出训练集和测试集上的R²(决定系数)和RMSE(均方根误差)作为模型性能的评估指标
xgboost 训练集结果: R² = 0.9706, RMSE = 4.9498
xgboost 测试集结果: R² = 0.8910, RMSE = 9.4885
# 在训练集和测试集上进行预测
best_model_train_pred = best_model.predict(X_train)
best_model_test_pred = best_model.predict(X_test)
# 计算训练集的 R² 和 RMSE
best_model_r2_train = r2_score(y_train, best_model_train_pred)
best_model_rmse_train = np.sqrt(mean_squared_error(y_train, best_model_train_pred))
# 计算测试集的 R² 和 RMSE
best_model_r2_test = r2_score(y_test, best_model_test_pred)
best_model_rmse_test = np.sqrt(mean_squared_error(y_test, best_model_test_pred))
# 输出结果
print(f"best_model 训练集结果: R² = {best_model_r2_train:.4f}, RMSE = {best_model_rmse_train:.4f}")
print(f"best_model 测试集结果: R² = {best_model_r2_test:.4f}, RMSE = {best_model_rmse_test:.4f}")
计算输出在贝叶斯调参优化后的best_model(一个 XGBoost 模型)在训练集和测试集上的R²和RMSE,模型在优化过程中进行调参,但没有使用早停机制
best_model 训练集结果: R² = 0.9809, RMSE = 3.9904
best_model 测试集结果: R² = 0.8948, RMSE = 9.3217
贝叶斯优化在调整超参数方面提供一些改进,尤其是对训练集的拟合,但对测试集过拟合的缓解效果较为有限,但是早停有助于防止模型过度拟合训练集,但并没有完全消除过拟合的情况,当然和数据质量也相关
当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息
✨ 该文章案例 ✨
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!
✨ 免费赠书 ✨
支持知识分享,畅享学习乐趣!特别感谢清华大学出版社 对本次赠书活动的鼎力支持!即日起,只需点赞、推荐、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《SPSS统计学与案例应用精解》这本精彩书籍📚!
💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!
往期推荐
期刊复现:连续数据与分类数据共存的SHAP可视化散点图与箱形图组合形式
期刊复现:多分类任务如何拆分为二分类任务并进行堆叠预测提高模型预测性能
期刊配图:SHAP值分析模型可解释性在柱状图与蜂窝图中的进阶组合展示
期刊配图:通过堆叠Mean|SHAP|展示不同区间对模型贡献度的可视化分析
期刊复现:利用UMAP降维算法可视化深度学习随着训练次数的增加模型区分能力的变化
期刊配图:PCA、t-SNE与UMAP三种降维方法简化高维数据的展示应用对比
Science期刊复现:分类、回归与Shap分析多角度揭示同一数据集变量对目标的影响
多模型SHAP+PDP解读Stacking集成模型:从基学习器到元学习器的可解释性与模型调参实现
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考