背景
在机器学习建模过程中,常常需要评估模型预测值与真实值之间的拟合程度,这种图表的主要作用是直观展示机器学习模型预测结果的准确性和一致性,尤其在回归任务中用来评估模型对连续变量的预测效果,以下是图表中的几个关键元素及其作用:
- 散点图:每个点表示一次模型预测与实际观测值的配对。散点越接近对角线,说明模型预测越准确
- 1:1 线(灰色线):这是理想预测线,表示预测值完全等于实际值的情况,所有散点应尽量接近这条线,表明模型的预测与实际观测值接近
- 最佳拟合线(蓝色线):该线通过数据的线性回归计算得到,表示模型的整体拟合趋势,最佳拟合线越接近1:1线,说明模型的预测偏差越小
- 置信区间(浅蓝色阴影):通常为95%置信区间,表示模型预测的不确定性,置信区间越窄,说明模型预测的稳定性越高,越宽则说明模型在某些范围内的预测具有更大的不确定性
- R²和MAE指标:R²(决定系数)衡量模型的解释能力,数值越接近1,说明模型的预测能力越强,MAE(平均绝对误差)表示预测值与实际值之间的平均绝对差异,数值越小越好,说明模型预测误差越小
代码实现
模型构建
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-5-公众号Python机器学习AI.xlsx')
from sklearn.model_selection import train_test_split, KFold
X = df.drop(['待预测变量Y'],axis=1)
y = df['待预测变量Y']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
from hyperopt import fmin, tpe, hp
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
# 定义超参数搜索空间
parameter_space_rf = {
'n_estimators': hp.choice('n_estimators', [50, 100, 200, 300]), # 决策树数量
'max_depth': hp.choice('max_depth', [5, 10, 20, None]), # 树的最大深度
'min_samples_split': hp.uniform('min_samples_split', 0.01, 0.5), # 分裂所需最小样本比例
'min_samples_leaf': hp.uniform('min_samples_leaf', 0.01, 0.5) # 叶节点最小样本比例
}
# 定义目标函数
def objective(params):
# 使用超参数创建随机森林回归模型
model = RandomForestRegressor(
n_estimators=params['n_estimators'],
max_depth=params['max_depth'],
min_samples_split=params['min_samples_split'],
min_samples_leaf=params['min_samples_leaf'],
random_state=42
)
# 在训练集上拟合模型
model.fit(X_train, y_train)
# 在测试集上预测
y_pred = model.predict(X_test)
# 计算均方误差(MSE)
mse = mean_squared_error(y_test, y_pred)
# 返回MSE,Hyperopt会最小化该目标值
return mse
# 运行超参数优化
best_params = fmin(
fn=objective, # 优化的目标函数
space=parameter_space_rf, # 搜索空间
algo=tpe.suggest, # 贝叶斯优化算法
max_evals=100 # 最大评估次数
)
# 显示最优超参数组合
print("Best hyperparameters:", best_params)
# 使用最佳超参数组合重新训练模型
best_model_regression = RandomForestRegressor(
n_estimators=[50, 100, 200, 300][best_params['n_estimators']],
max_depth=[5, 10, 20, None][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_regression.fit(X_train, y_train)
使用Hyperopt库对随机森林回归模型的超参数进行优化,以最小化均方误差(MSE),并通过最佳参数组合训练最终模型,为后续绘制预测结果的对比图做好准备
模型评价指标
from sklearn import metrics
# 预测
y_pred_train = best_model_regression.predict(X_train)
y_pred_test = best_model_regression.predict(X_test)
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)
计算模型在训练集和测试集上的多项误差指标(MSE、RMSE、MAE、R²),其中MSE和RMSE越小越好,表示模型预测误差小;MAE越小说明平均误差更小;R²值越接近1,表示模型拟合度越高,从而综合评估模型的预测性能
基础可视化
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("Random Forest Regression")
plt.xlabel("Observed dissolved N₂O concentration (µg/L)")
plt.ylabel("Modeled dissolved N₂O concentration (µg/L)")
plt.legend(loc="upper left")
plt.savefig('1.pdf', format='pdf', bbox_inches='tight')
plt.show()
生成了一个基础可视化图,用于比较随机森林回归模型在测试集上的预测值与真实观察值。图中包括:
- 散点图:用珊瑚色表示每个观测值的实际与预测值的分布,显示模型预测值与真实值的关系
- 1:1 参考线:灰色的 1:1 直线表示完美预测的位置,越接近此线的点表示模型预测越准确
- 拟合线:根据预测值和真实值的线性回归拟合线,蓝色显示拟合趋势,并在图例中标注了模型的 和 MAE 值,以便直观了解模型的预测精度
- 图例和标题:图例标注了拟合线和散点含义,标题说明了模型和预测变量(N₂O浓度),使图表自解释性更强
用于快速评估模型预测效果,观察预测值与真实值之间的吻合程度(当然作者这里为模拟数据)
进阶可视化—1
在基础可视化的基础上增加置信区间,以增强模型预测效果的解释性,置信区间的添加提供了模型预测的置信水平,展示了模型的预测值围绕拟合线的分布,进一步说明模型的稳定性和预测的准确度,使用置信区间后,可以更直观地了解模型预测的精度和可能的误差范围,帮助判断预测值的可靠性,这里也已经基本接近文献中的可视化了,但是会发现文献中的置信区间总体而言较为显眼,可能的原因为是由于数据点少、残差大、置信水平高或数据偏离拟合线等因素引起的,当然也可以引入其它变量在不影响原始数据的统计意义下,调整置信区间在图表中的显示范围, 代码获取:如果您希望获取本文展示的改进版代码,请添加作者微信联系获取
进阶可视化—2
在这里引入参数放大置信区间的宽度,scale_factor是一个人为设置的缩放因子,用于放大或缩小置信区间的宽度,通常,置信区间的宽度由统计公式计算,但可以通过将其乘以scale_factor来调整宽度,以增加或减少置信区间的范围,当 scale_factor=1时,置信区间的宽度为标准理论值;若scale_factor 1(例如 1.5),置信区间的宽度会变大,使图中阴影区域扩展;而若scale_factor1<1(例如 0.8),置信区间宽度则会缩小,通过调整scale_factor,可以在图中更好地展示拟合效果,例如当置信区间看起来太窄时,可以增大scale_factor使其更明显,需要注意的是,scale_factor仅影响置信区间的视觉展示范围,并不会改变数据的实际统计意义, 代码获取:如果您希望获取本文展示的改进版代码,请添加作者微信联系获取
🎁 赠书活动来啦! 🎁
支持知识分享,畅享学习乐趣!特别感谢清华出版社 对本次赠书活动的鼎力支持!即日起,只需
点赞、在看、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《通识AI:人工智能基础概念与应用》这本精彩书籍📚!
💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!
往期推荐
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考