新闻动态
一图胜千言:回归预测模型训练集与测试集的进阶可视化
发布日期:2025-02-04 01:29:12 点击次数:89
背景
在前两篇文章中,已经深入探讨了回归预测模型的性能评估与数据可视化益处,第一篇文章中——用图表说话:如何有效呈现回归预测模型结果,讲解如何通过精美的图表(散点图+边缘柱状图)展现模型的训练和测试结果(针对于回归预测模型)
图片
第二篇文章中——SCI图表复现:如何直观展示机器学习模型预测结果的准确性和一致性,则通过散点图结合1:1线、最佳拟合线、置信区间及R²和MAE指标,全方位直观展示模型预测准确性、趋势拟合程度和不确定性
图片
然而,真实数据的分布与模型预测结果的差异往往隐藏在更复杂的图表中,为了更全面地呈现训练集与测试集之间的关系,并直观展示预测值的置信区间及边缘分布,本篇文章将带大家深入理解一套综合性的可视化方案,本文集成置信区间与边缘柱状图的新图表形式,直观展示模型的拟合效果,如下:
图片
代码实现
数据读取
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsfrom sklearn import metricsimport scipy.stats as statsplt.rcParams['font.family'] = 'Times New Roman'plt.rcParams['axes.unicode_minus'] = Falsedf_train = pd.read_excel('GBDT_train.xlsx')df_test = pd.read_excel('GBDT_test.xlsx')从 Excel 文件中分别加载训练数据 (GBDT_train.xlsx) 和测试数据 (GBDT_test.xlsx) 到数据框 (df_train 和 df_test) 中,里面包含真实值以及预测值
模型性能计算
from sklearn import metrics# 真实y_train = df_train['Experimental value']y_test = df_test['Experimental value']# 预测y_pred_train = df_train['Predicted value']y_pred_test = df_test['Predicted value']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)图片
从训练集和测试集的数据中提取真实值 (Experimental value) 和预测值 (Predicted value),计算模型在训练集和测试集上的回归性能指标
文章一可视化
# 创建一个包含训练集和测试集真实值与预测值的数据框data_train = pd.DataFrame({ 'True': y_train, 'Predicted': y_pred_train, 'Data Set': 'Train'})data_test = pd.DataFrame({ 'True': y_test, 'Predicted': y_pred_test, 'Data Set': 'Test'})data = pd.concat([data_train, data_test])# 自定义调色板palette = {'Train': '#b4d4e1', 'Test': '#f4ba8a'}# 创建 JointGrid 对象plt.figure(figsize=(8, 6), dpi=1200)g = sns.JointGrid(data=data, x='True', y='Predicted', hue='Data Set', height=10, palette=palette)# 绘制中心的散点图g.plot_joint(sns.scatterplot, alpha=0.5)# 添加训练集的回归线sns.regplot(data=data_train, x='True', y='Predicted', scatter=False, ax=g.ax_joint, color='#b4d4e1', label='Train Regression Line')# 添加测试集的回归线sns.regplot(data=data_test, x='True', y='Predicted', scatter=False, ax=g.ax_joint, color='#f4ba8a', label='Test Regression Line')# 添加边缘的柱状图g.plot_marginals(sns.histplot, kde=False, element='bars', multiple='stack', alpha=0.5)# 添加拟合优度文本在右下角ax = g.ax_jointax.text(0.95, 0.1, f'Train $R^2$ = {r2_train:.3f}', transform=ax.transAxes, fontsize=12, verticalalignment='bottom', horizontalalignment='right', bbox=dict(boxstyle='round,pad=0.3', edgecolor='black', facecolor='white'))ax.text(0.95, 0.05, f'Test $R^2$ = {r2_test:.3f}', transform=ax.transAxes, fontsize=12, verticalalignment='bottom', horizontalalignment='right', bbox=dict(boxstyle='round,pad=0.3', edgecolor='black', facecolor='white'))# 在左上角添加模型名称文本ax.text(0.75, 0.99, 'Model = GBDT', transform=ax.transAxes, fontsize=12, verticalalignment='top', horizontalalignment='left', bbox=dict(boxstyle='round,pad=0.3', edgecolor='black', facecolor='white'))# 添加中心线ax.plot([data['True'].min(), data['True'].max()], [data['True'].min(), data['True'].max()], c='black', alpha=0.5, linestyle='--', label='x=y')ax.legend()plt.savefig('TrueFalse.pdf', format='pdf', bbox_inches='tight')plt.show()图片
文章二基础可视化
plt.figure(figsize=(8, 6), dpi=1200)plt.scatter(y_test, y_pred_test, color='coral', label='Predicted N₂O concentration', alpha=0.2) # 预测值散点图plt.plot(y_test, y_test, color='grey', alpha=0.6, label='1:1 Line') # 1:1灰色虚线# 拟合线z = np.polyfit(y_test, y_pred_test, 1)p = np.poly1d(z)plt.plot(y_test, p(y_test), color='blue', alpha=0.6, label=f'Line of Best Fit\n$R^2$ = {r2_test:.2f},MAE = {mae_test:.2f}')plt.title('GBDT Regression')plt.xlabel('Observed Values')plt.ylabel('Predicted Values')plt.legend(loc='upper left')plt.savefig('1.pdf', format='pdf', bbox_inches='tight')plt.show()图片
集成置信区间与边缘柱状图
图片
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。
