利用Optuna TPE算法优化RF模型及3D曲面图展示调参过程

机器学习算法数据库

picture.image

背景

在机器学习中,模型的调参往往是提升性能的关键步骤,然而手动调整超参数不仅耗时繁琐,而且难以找到最佳组合,本篇文章将介绍如何利用Optuna中的TPE(Tree-structured Parzen Estimator)算法,自动化调节随机森林(Random Forest, RF)模型的超参数,以实现最优性能

通过精心设计的目标函数,将搜索多个超参数空间,最终确定使模型性能最优的参数组合。为了更直观地展示调参过程,最后利用3D曲面图对调参效果进行可视化,帮助更好地理解超参数对模型表现的影响,尽管Optuna本身提供了可视化工具,但其展示效果并不美观,本文将展示如何通过自定义可视化方式,提升调参过程的表现力和易读性

代码实现

数据读取整理


          
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-9-公众号Python机器学习AI.xlsx')
          
from sklearn.model_selection import train_test_split, KFold
          

          
X = df.drop(['Y'],axis=1)
          
y = df['Y']
          

          
# 划分训练集和测试集
          
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%,测试集占20%,以便用于模型训练和评估

相关系数气泡热力图:可视化变量间关系


          
# 计算相关系数矩阵
          
corr = df.corr()
          
fig, ax = plt.subplots(figsize=(10, 8), dpi=1200)
          
cmap = plt.cm.viridis
          
norm = plt.Normalize(vmin=-1, vmax=1)
          
scatter_handles = []
          
# 循环绘制气泡图和数值
          
for i in range(len(corr.columns)):
          
    for j in range(len(corr.columns)):
          
        if i > j:  # 对角线左下部分,只显示气泡
          
            color = cmap(norm(corr.iloc[i, j]))  # 根据相关系数获取颜色
          
            scatter = ax.scatter(i, j, s=np.abs(corr.iloc[i, j]) * 1000, color=color, alpha=0.75)
          
            scatter_handles.append(scatter)  # 保存scatter对象用于颜色条
          
        elif i < j:  # 对角线右上部分,只显示数值
          
            color = cmap(norm(corr.iloc[i, j]))  # 数值的颜色同样基于相关系数
          
            ax.text(i, j, f'{corr.iloc[i, j]:.2f}', ha='center', va='center', color=color, fontsize=10)
          
        else:  # 对角线部分,显示空白
          
            ax.scatter(i, j, s=1, color='white')
          
ax.set_xticks(range(len(corr.columns)))
          
ax.set_xticklabels(corr.columns, rotation=45, ha='right', fontsize=10)
          
ax.set_yticks(range(len(corr.columns)))
          
ax.set_yticklabels(corr.columns, fontsize=10)
          
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
          
sm.set_array([])  
          
fig.colorbar(sm, ax=ax, label='Correlation Coefficient')
          
plt.tight_layout()
          
plt.savefig("Bubble Heatmap with Color Mapping for Bubbles and Numbers.pdf", format='pdf', bbox_inches='tight')
          
plt.show()
      

picture.image

通过绘制气泡图和数值标签,展示了数据集各个变量之间的相关系数,气泡的大小表示相关系数的绝对值,颜色反映相关性强弱,同时在图的上半部分显示了相关系数的数值,结果是一个具有色彩映射和气泡大小差异的相关系数矩阵热力图,便于直观地理解变量间的相关性

使用Optuna优化随机森林模型超参数


          
import optuna
          
from sklearn.ensemble import RandomForestRegressor
          
from sklearn.metrics import mean_squared_error
          
def objective(trial):
          
    # 超参数搜索空间
          
    n_estimators = trial.suggest_int('n_estimators', 10, 200)  # 决策树的数量
          
    max_depth = trial.suggest_int('max_depth', 2, 40)         # 最大深度
          
    min_samples_split = trial.suggest_int('min_samples_split', 2, 10)  # 最小分裂样本数
          
    min_samples_leaf = trial.suggest_int('min_samples_leaf', 1, 10)    # 最小叶子节点样本数
          
    
          
    # 定义随机森林模型
          
    model = RandomForestRegressor(
          
        n_estimators=n_estimators,
          
        max_depth=max_depth,
          
        min_samples_split=min_samples_split,
          
        min_samples_leaf=min_samples_leaf,
          
        random_state=42
          
    )
          
    
          
    # 模型训练
          
    model.fit(X_train, y_train)
          
    # 验证集上的预测
          
    y_pred = model.predict(X_val)
          
    # 计算 RMSE
          
    rmse = mean_squared_error(y_val, y_pred, squared=False)
          
    return rmse
          

          
# 创建Optuna研究对象
          
study = optuna.create_study(direction='minimize', sampler=optuna.samplers.TPESampler(seed=42))  # 使用TPE优化
          
study.optimize(objective, n_trials=1000)  
          

          
# 输出优化结果
          
print("最佳参数:", study.best_params)
          
print("最佳RMSE:", study.best_value)
      

picture.image

使用Optuna的TPE算法优化随机森林回归模型的超参数,通过最小化验证集上的RMSE来寻找最佳的超参数组合

基于Optuna优化结果的光滑3D曲面图展示RMSE变化

picture.image

对Optuna优化结果绘制3D曲面图,展示不同超参数组合(max_depth和n_estimators)对随机森林模型性能(RMSE)的影响,帮助直观理解调参过程和超参数对模型效果的关系,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系

使用最佳超参数训练最终模型并评估性能(训练集与测试集)


          
# 使用最佳超参数训练最终模型
          
best_params = study.best_params
          
best_model = RandomForestRegressor(
          
    n_estimators=best_params['n_estimators'],
          
    max_depth=best_params['max_depth'],
          
    min_samples_split=best_params['min_samples_split'],
          
    min_samples_leaf=best_params['min_samples_leaf'],
          
    random_state=42
          
)
          

          
# 在训练集上训练最终模型
          
best_model.fit(X_train, y_train)
          

          
from sklearn import metrics
          
y_pred_train = best_model.predict(X_train)
          
y_pred_test = best_model.predict(X_test)
          
mse_train = metrics.mean_squared_error(y_train, y_pred_train)
          
rmse_train = np.sqrt(mse_train)
          
mae_train = metrics.mean_absolute_error(y_train, y_pred_train)
          
r2_train = metrics.r2_score(y_train, y_pred_train)
          
mse_test = metrics.mean_squared_error(y_test, y_pred_test)
          
rmse_test = np.sqrt(mse_test)
          
mae_test = metrics.mean_absolute_error(y_test, y_pred_test)
          
r2_test = metrics.r2_score(y_test, y_pred_test)
          
metrics_df = pd.DataFrame({
          
    'Metric': ['MSE', 'RMSE', 'MAE', 'R-squared'],
          
    'Train': [mse_train, rmse_train, mae_train, r2_train],
          
    'Test': [mse_test, rmse_test, mae_test, r2_test]
          
})
          
metrics_df
      

picture.image

在最佳超参数下训练模型,并对其在训练集和测试集上的表现进行评估

训练集与测试集预测值对比及置信区间可视化

picture.image

最后通过绘制带有95%置信区间的散点图,展示了训练集和测试集的预测值与真实值之间的关系,并通过附加的直方图可视化了训练集和测试集的分布,帮助分析模型的拟合效果及其预测性能,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系

往期推荐

SCI图表复现:整合数据分布与相关系数的高级可视化策略

期刊配图:如何有效呈现回归、分类模型的评价指标

SHAP模型解释保姆级教程:回归、分类、基础到期刊配图全覆盖

复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性

SCI图表复现:优化SHAP特征贡献图展示更多模型细节

复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展

复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化

整合数据分布+拟合线+置信区间+相关系数的皮尔逊相关可视化

如何用SHAP解读集成学习Stacking中的基学习器和元学习器以及整体模型贡献

期刊配图:分类变量SHAP值的箱线图及可视化优化展示

期刊文章配图:基于雷达图的多机器学习模型表现评估对比

期刊文章配图:斯皮尔曼相关系数热图反应非线性变量相关性

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
相关资源
字节跳动 XR 技术的探索与实践
火山引擎开发者社区技术大讲堂第二期邀请到了火山引擎 XR 技术负责人和火山引擎创作 CV 技术负责人,为大家分享字节跳动积累的前沿视觉技术及内外部的应用实践,揭秘现代炫酷的视觉效果背后的技术实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论