背景
在前两篇文章中,已经深入探讨了回归预测模型的性能评估与数据可视化益处,第一篇文章中——用图表说话:如何有效呈现回归预测模型结果,讲解如何通过精美的图表(散点图+边缘柱状图)展现模型的训练和测试结果(针对于回归预测模型)
第二篇文章中——SCI图表复现:如何直观展示机器学习模型预测结果的准确性和一致性,则通过散点图结合1:1线、最佳拟合线、置信区间及R²和MAE指标,全方位直观展示模型预测准确性、趋势拟合程度和不确定性
然而,真实数据的分布与模型预测结果的差异往往隐藏在更复杂的图表中,为了更全面地呈现训练集与测试集之间的关系,并直观展示预测值的置信区间及边缘分布,本篇文章将带大家深入理解一套综合性的可视化方案,本文集成置信区间与边缘柱状图的新图表形式,直观展示模型的拟合效果,如下:
代码实现
数据读取
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import metrics
import scipy.stats as stats
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
df_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_joint
ax.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()
集成置信区间与边缘柱状图
通过多项式拟合计算训练集和测试集的预测值,并利用置信区间公式估算预测结果的不确定性,分别绘制训练集和测试集的拟合曲线、95%置信区间、散点图以及误差分布直方图,此外添加对角线(1:1参考线)以显示预测值与真实值的理想匹配,最终生成一张包含主要信息和辅助分布图的可视化图表,代码与数据集获取:如需获取本文完整的源代码和数据集,请添加作者微信联系
往期推荐
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
SCI图表复现:如何直观展示机器学习模型预测结果的准确性和一致性
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考