期刊配图:从训练到测试模型残差分析配图技巧与优化策略(附代码)

机器学习算法数据库

picture.image

✨ 欢迎关注Python机器学习AI ✨

本节介绍:从训练到测试模型残差分析配图技巧与优化策略,数据采用模拟数据无任何现实意义,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。完整数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。文末提供高效的学习工具~!

✨ 论文信息 ✨

picture.image

picture.image

图表展示了植被指数(VIs)在估算叶干生物量(LDB)方面的表现评估也就是模型性能评估。下面是每个面板的具体内容:

  • 图(a)和(b):这两个可视化展示训练集(a)和测试集(b)中观察值与预测值之间的关系。x轴表示观察到的LDB值,y轴表示预测的LDB值。红色虚线表示理想状态,即预测值与观察值完全一致。每个数据集的性能指标(R² 和 RMSE)
  • 图 (c):该可视化展示残差图,其中残差(即观察值与预测值之间的差异)被绘制在观察到的LDB值上。点的密度采用颜色编码,显示残差集中在哪些范围内。残差的密集度在零残差范围内较高,表明预测值大多接近观察值。
  • 图 (d):该可视化展示了不同叶干生物量(LDB)水平下的残差分布。残差根据LDB是否小于 2或大于2分为两类,并采用核密度估计(KDE)进行展示。每个类别的均值(μ)和标准差(δ)

总体来说,这张图表表明植被指数模型在训练数据集上的表现较好,但在应用于测试数据集时存在一定的不确定性和偏差。此外,残差显示了基于叶干生物量的不同大小,存在一定的系统性差异,对于较高的LDB值,偏差较大

残差分析为模型的现实应用提供重要线索。例如,残差图揭示不同范围的叶干生物量(LDB)预测中存在的系统性偏差。当LDB值较高时,模型的预测偏差较大(μ=0.37),这意味着对于较高的LDB值,模型的准确性较低。这一信息对实际应用较为重要,帮助认识到在实际场景中,模型可能无法精确预测大规模植物或高生物量的区域,因此需要进一步优化模型,当然转换到其它方向类似,这是阈值的选择而已

✨ 代码实现 ✨

  
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-11-21公众号Python机器学习AI.xlsx"  
df = pd.read_excel(path)  
from sklearn.model_selection import train_test_split  
  
# 划分特征和目标变量  
X = df.drop(['SR'], axis=1)    
y = df['SR']    
# 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(  
    X,    
    y,   
    test_size=0.3,   
    random_state=42  
)  
from sklearn.ensemble import RandomForestRegressor  
  
# 初始化随机森林回归模型  
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)  
  
# 训练模型  
rf_model.fit(X_train, y_train)

加载数据并使用随机森林回归模型对数据进行训练,首先将数据集划分为特征和目标变量,然后再将其分为训练集和测试集,最后在训练集上训练一个随机森林回归模型,模型为调参,重点在于可视化复现

  
from sklearn.metrics import mean_squared_error, r2_score  
from sklearn.linear_model import LinearRegression  
  
# 在训练集上进行预测  
y_train_pred = rf_model.predict(X_train)  
# 计算RMSE  
rmse_train = np.sqrt(mean_squared_error(y_train, y_train_pred))  
# 计算R²  
r2_train = r2_score(y_train, y_train_pred)  
y_train_np = np.array(y_train).reshape(-1, 1)  
# 拟合线性回归模型  
linear_reg = LinearRegression()  
linear_reg.fit(y_train_np, y_train_pred)  
y_reg_pred = linear_reg.predict(y_train_np)  
  
# 绘制训练集上的散点图  
plt.figure(figsize=(8, 6))  
scatter = plt.scatter(y_train, y_train_pred, c=y_train_pred, cmap='viridis', alpha=0.6)  
plt.plot([0, max(y_train)], [0, max(y_train)], color='black', linestyle='-', label='x = y')  
plt.plot(y_train, y_reg_pred, color='red', linestyle='-', label='Regression Line')  
plt.title('Random Forest Regression - Training Set', fontsize=16, fontweight='bold')  
plt.xlabel('Observed values (t/ha)', fontsize=16, fontweight='bold')  
plt.ylabel('Predicted values (t/ha)', fontsize=16, fontweight='bold')  
n_samples = len(y_train)  
plt.text(0.05, 0.95, f'R² = {r2_train:.2f}\nRMSE = {rmse_train:.2f}\nn={n_samples}',   
         horizontalalignment='left', verticalalignment='top',   
         transform=plt.gca().transAxes, fontsize=16, fontweight='bold', color='black')  
plt.legend().set_visible(False)  
ax = plt.gca()    
ax.tick_params(axis='both', labelsize=16)  
for tick in ax.get_xticklabels() + ax.get_yticklabels():  
    tick.set_fontweight('bold')  
cbar = plt.colorbar(scatter)  
cbar.ax.tick_params(labelsize=16)   
plt.savefig("train.pdf", format='pdf', bbox_inches='tight',dpi=1200)  
plt.show()

picture.image

使用训练集上的真实值和预测值绘制散点图,并通过线性回归拟合线展示预测结果,计算显示训练集的R²和RMSE值,模拟数值不具有任何现实意义

  
# 在测试集上进行预测  
y_test_pred = rf_model.predict(X_test)  
  
# 计算RMSE  
rmse_test = np.sqrt(mean_squared_error(y_test, y_test_pred))  
# 计算R²  
r2_test = r2_score(y_test, y_test_pred)  
  
# 拟合线性回归模型  
y_test_np = np.array(y_test).reshape(-1, 1)  
linear_reg = LinearRegression()  
linear_reg.fit(y_test_np, y_test_pred)  
y_reg_pred_test = linear_reg.predict(y_test_np)  
  
# 绘制测试集上的散点图  
plt.figure(figsize=(8, 6))  
scatter = plt.scatter(y_test, y_test_pred, c=y_test_pred, cmap='viridis', alpha=0.6)  
  
# x=y 参考线  
plt.plot([0, max(y_test)], [0, max(y_test)], color='black', linestyle='-', label='x = y')  
  
# 回归线  
plt.plot(y_test, y_reg_pred_test, color='red', linestyle='-', label='Regression Line')  
  
plt.title('Random Forest Regression - Test Set', fontsize=16, fontweight='bold')  
plt.xlabel('Observed values (t/ha)', fontsize=16, fontweight='bold')  
plt.ylabel('Predicted values (t/ha)', fontsize=16, fontweight='bold')  
  
n_samples = len(y_test)  
plt.text(0.05, 0.95, f'R² = {r2_test:.2f}\nRMSE = {rmse_test:.2f}\nn={n_samples}',   
         horizontalalignment='left', verticalalignment='top',   
         transform=plt.gca().transAxes, fontsize=16, fontweight='bold', color='black')  
  
plt.legend().set_visible(False)  
ax = plt.gca()    
ax.tick_params(axis='both', labelsize=16)  
for tick in ax.get_xticklabels() + ax.get_yticklabels():  
    tick.set_fontweight('bold')  
cbar = plt.colorbar(scatter)  
cbar.ax.tick_params(labelsize=16)  
plt.savefig("test.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

使用测试集上的真实值和预测值绘制散点图,拟合线性回归线,计算显示测试集的R²和RMSE值,这两个步骤都是常见的回归模型配图形式,重点在于下面的残差分析

  
# 计算残差  
residuals = y_test - y_test_pred  
center_line_value = 60  
plt.figure(figsize=(8, 6))  
hb = plt.hexbin(y_test, residuals, gridsize=30, cmap='coolwarm', mincnt=1)  
cbar = plt.colorbar(hb)  
cbar.set_label('Density', fontsize=16, fontweight='bold')  
plt.xlim(0, 120)  
plt.ylim(-30, 30)  
# 添加标题和标签  
plt.title('Residual Distribution for Test Set', fontsize=16, fontweight='bold')  
plt.xlabel('Observed SR (t/ha)', fontsize=14, fontweight='bold')  
plt.ylabel('Residuals (t/ha)', fontsize=14, fontweight='bold')  
# 画出参考线  
plt.axhline(0, color='gray', linestyle='--', linewidth=2)  
# 添加 x 轴中心位置的灰色竖线(SR 的均值位置),设置为 60  
plt.axvline(x=center_line_value, color='gray', linestyle='--', linewidth=2)  
threshold = 2  
plt.text(threshold - 1.9, 0.95, f'SR < {center_line_value}', horizontalalignment='left', verticalalignment='top',   
         transform=plt.gca().transAxes, fontsize=14, fontweight='bold', color='black')  
plt.text(threshold - 1.1, 0.95, f'SR > {center_line_value}', horizontalalignment='right', verticalalignment='top',   
         transform=plt.gca().transAxes, fontsize=14, fontweight='bold', color='black')  
plt.legend().set_visible(False)  
ax = plt.gca()    
ax.tick_params(axis='both', labelsize=16)    
for tick in ax.get_xticklabels() + ax.get_yticklabels():  
    tick.set_fontweight('bold')  
cbar.ax.tick_params(labelsize=16)    
for tick in cbar.ax.get_yticklabels():  
    tick.set_fontweight('bold')  
plt.savefig("Density.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

计算绘制测试集的残差分布图,使用六边形箱形图显示残差与观察值之间的关系,标注参考线和均值位置,当然这里的阈值是作者人为确定的根据模拟数据集,目标变量的范围

  
import seaborn as sns  
  
y_test_pred = rf_model.predict(X_test)  
  
# 计算残差  
residuals = y_test - y_test_pred  
# 设置 x 轴中心位置为 60  
center_line_value = 60  
  
# 根据条件分割数据  
SR_less_60 = residuals[y_test < center_line_value]  
SR_greater_60 = residuals[y_test > center_line_value]  
all_SR = residuals  
  
# 计算每组的均值和标准差  
mu_less_60 = np.mean(SR_less_60)  
std_less_60 = np.std(SR_less_60)  
  
mu_greater_60 = np.mean(SR_greater_60)  
std_greater_60 = np.std(SR_greater_60)  
  
mu_all = np.mean(all_SR)  
std_all = np.std(all_SR)  
  
# 绘制密度图  
plt.figure(figsize=(8, 6))  
  
# 绘制不同条件下的密度曲线  
sns.kdeplot(SR_less_60, shade=True, color='lightblue', label=f'LDB < {center_line_value}', alpha=0.6)  
sns.kdeplot(SR_greater_60, shade=True, color='purple', label=f'LDB > {center_line_value}', alpha=0.6)  
sns.kdeplot(all_SR, shade=True, color='gray', label='All LDB', alpha=0.4)  
  
# 添加均值和标准差的注释(放在右上角)  
plt.text(0.95, 0.95, f'LDB < {center_line_value}\nμ = {mu_less_60:.2f}\nδ = {std_less_60:.2f}',   
         horizontalalignment='right', verticalalignment='top', transform=plt.gca().transAxes, fontsize=14, fontweight='bold', color='black')  
  
plt.text(0.95, 0.75, f'LDB > {center_line_value}\nμ = {mu_greater_60:.2f}\nδ = {std_greater_60:.2f}',   
         horizontalalignment='right', verticalalignment='top', transform=plt.gca().transAxes, fontsize=14, fontweight='bold', color='black')  
  
plt.text(0.95, 0.55, f'All LDB\nμ = {mu_all:.2f}\nδ = {std_all:.2f}',   
         horizontalalignment='right', verticalalignment='top', transform=plt.gca().transAxes, fontsize=14, fontweight='bold', color='black')  
  
# 添加标题和标签  
plt.title('Residual Distribution for Test Set', fontsize=16, fontweight='bold')  
plt.xlabel('Observed SR (t/ha)', fontsize=14, fontweight='bold')  
plt.ylabel('Density', fontsize=14, fontweight='bold')  
  
# 设置 x 轴范围为 -35 到 35  
plt.xlim(-35, 35)  
# 设置 y 轴范围为 0 到 0.1  
plt.ylim(0, 0.1)  
  
  
# 图例设置(左上角,不显示方框,字体加粗,大小为16)  
plt.legend(loc='upper left', frameon=False, fontsize=16, prop={'weight': 'bold'})  
  
# 优化字体设置  
ax = plt.gca()  # 获取当前轴  
ax.tick_params(axis='both', labelsize=16)  # 设置 xy 轴刻度字体大小  
# 设置 xy 轴刻度字体加粗  
for tick in ax.get_xticklabels() + ax.get_yticklabels():  
    tick.set_fontweight('bold')  
plt.savefig("Density-2.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

计算绘制测试集残差的密度图,根据叶干生物量(LDB)是否大于或小于60,将数据分组显示,并标注了每组的均值和标准差,作者这里只是默认目标变量为SR而已,实际运用中根据目标变量实际表示确定

SR < 60:这个区域的残差分布呈现出一个负的偏差(均值为 -2.83),且具有较大的标准差(8.90),说明对于较低的SR,模型的预测误差较大,并且存在一定的负偏差,可能意味着模型在预测这些低值时出现了低估的趋势

SR > 60:这一部分的残差分布偏向于正值(均值为 4.07),标准差为9.14,表明对于较高的SR预测,模型的预测误差存在一定的正偏差,可能存在过度预测的情况

所有 SR:总体来看,所有数据的残差均值为-0.89,标准差为9.49,显示出残差分布的整体情况,表明模型的预测误差存在一定的偏差,但整体上偏离真实值的程度不大

当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息

picture.image

✨ 该文章案例 ✨

picture.image

在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。

同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。

✨ 介绍 ✨

本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。

更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。

✨ 群友反馈 ✨

picture.image

✨ 合集获取 ✨

picture.image

欢迎到公众号后台,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!

✨ 书籍推荐 ✨

无论你是零编程基础的科研新手,还是想提升机器学习技能的医学科研工作者,这本书都能带你从入门到进阶,掌握Python数据分析+医学AI应用的全流程技能

✨ AI工具推荐 ✨

picture.image

往期推荐

期刊配图:模型SHAP解释特征类别柱状图、饼图与蜂巢图的组合展示

期刊复现:基于自动机器学习的预测模型构建及其残差和部分依赖分析

期刊复现:SVM、RF、BDT、DT、Logit五大模型堆叠31种组合情况最优模型的SHAP解释

期刊复现:单变量特征降维与共线性分析结合RFE集成排名进行特征筛选下的组合拳流程

期刊复现:SVM、RF、BDT、DT、Logit五大模型堆叠31种组合情况优化与最优模型选择可视化

期刊复现:基于相关系数与AUC值优化特征选择剔除冗余特征精简模型(附代码)

期刊复现:如何正确使用LASSO进行二分类特征选择?避开常见误区,掌握实用技巧

期刊复现:融合聚类与多分类转二分类的亚型可解释SHAP机器学习模型构建

期刊复现:基于LightGBM、XGBoost与RF的Lasso回归堆叠模型在连续和分类特征上的模型解释

期刊复现:基于LightGBM、XGBoost与RF的堆叠模型贝叶斯优化调参与Lasso回归元模型,结合10倍交叉验证

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
大规模高性能计算集群优化实践
随着机器学习的发展,数据量和训练模型都有越来越大的趋势,这对基础设施有了更高的要求,包括硬件、网络架构等。本次分享主要介绍火山引擎支撑大规模高性能计算集群的架构和优化实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论