背景
在机器学习中,模型的调参往往是提升性能的关键步骤,然而手动调整超参数不仅耗时繁琐,而且难以找到最佳组合,本篇文章将介绍如何利用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()
通过绘制气泡图和数值标签,展示了数据集各个变量之间的相关系数,气泡的大小表示相关系数的绝对值,颜色反映相关性强弱,同时在图的上半部分显示了相关系数的数值,结果是一个具有色彩映射和气泡大小差异的相关系数矩阵热力图,便于直观地理解变量间的相关性
使用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)
使用Optuna的TPE算法优化随机森林回归模型的超参数,通过最小化验证集上的RMSE来寻找最佳的超参数组合
基于Optuna优化结果的光滑3D曲面图展示RMSE变化
对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
在最佳超参数下训练模型,并对其在训练集和测试集上的表现进行评估
训练集与测试集预测值对比及置信区间可视化
最后通过绘制带有95%置信区间的散点图,展示了训练集和测试集的预测值与真实值之间的关系,并通过附加的直方图可视化了训练集和测试集的分布,帮助分析模型的拟合效果及其预测性能,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
往期推荐
SHAP模型解释保姆级教程:回归、分类、基础到期刊配图全覆盖
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
如何用SHAP解读集成学习Stacking中的基学习器和元学习器以及整体模型贡献
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考