✨ 欢迎关注 ✨
本节介绍: 利用递归特征筛选优化随机森林模型并基于SHAP和GAM识别特征影响阈值的模型解释 。数据采用模拟数据,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。 获取 前请咨询,避免不必要的问题。
✨ 文献信息 ✨
在文献中,机器学习被应用于建立环境因素(如某些重金属浓度)与土壤细菌群落中指示物种丰度之间关系的模型。以下是机器学习应用的解读:
- 随机森林(RF)算法:RF算法被用于建立环境因素(如As和Cu的浓度)如何影响指示物种丰度的模型。数据集包含110个样本和18个特征(环境因素)
- 特征选择与模型构建:使用递归特征消除(RFE)方法从更大的特征集中选择最佳特征子集,从而提高模型的可解释性。构建了两个RF模型,一个使用7个特征,另一个使用12个特征,这些模型有效地捕捉了环境变量(As和Cu)与土壤细菌群落之间的关系
- SHAP和GAM:在构建RF模型之后,计算SHAP(值,以理解每个特征对预测结果的影响。SHAP值有助于解释As和Cu的浓度如何影响指示物种。随后,使用广义加法模型(GAM)进一步量化这种关系,并预测这些浓度如何影响细菌群落
- 阈值效应:模型识别出As和Cu的阈值浓度,这些浓度对细菌群落有显著影响。例如,当As浓度低于某一阈值时,会负面影响指示物种,而当浓度超过该阈值时,会产生正面影响。这种阈值效应被RF模型和随后的SHAP与GAM分析所捕捉
最后文献展示了As和Cu浓度对指示物种丰度的影响,其中SHAP值的正负号表示影响方向,正值代表该特征对物种丰度有正向影响,而负值则表示负向影响;SHAP值的绝对值越大,表示该特征对模型输出的影响程度越大。当SHAP值为0时,表示该特征对模型输出没有影响,进一步证明了As和Cu对指示物种的影响是非线性的。这些趋势通过GAM模型量化,并结合SHAP值的变化趋势来判断每个特征对模型的影响
✨ 基础代码 ✨
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")
df = pd.read_excel('2025-6-19公众号Python机器学习AI.xlsx')
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df.drop(['序号', 'Tensile strength/MPa'], axis=1)
y = df['Tensile strength/MPa']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42)
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
# 初始化存储结果的DataFrame
selection_results = pd.DataFrame(columns=['Feature', 'Importance', 'MSE', 'R2'])
# 创建随机森林回归器
rf_reg = RandomForestRegressor(random_state=42)
# 使用递归特征消除(RFE)
rfe = RFE(estimator=rf_reg, n_features_to_select=1, step=1) # 每次消除一个特征
rfe.fit(X_train, y_train)
使用递归特征消除(RFE)方法,结合随机森林回归模型对模拟数据集进行特征选择,目的是通过逐步消除不重要的特征来找到最能预测“Tensile strength/MPa”的特征
可视化递归特征消除过程,展示特征重要性与模型性能(R²和MSE)的变化。可以看出,当选择到第11个特征时,拟合优度R²达到了较高值并趋于平缓,而MSE也在此时达到较小值,后续变化不大,因此最终选择11个特征,为后续建模
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df[selection_results.iloc[0:11]['Feature']]
y = df['Tensile strength/MPa']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42)
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.model_selection import KFold
# 定义随机森林回归模型
rf_model = RandomForestRegressor(random_state=42)
# 定义网格搜索的参数空间(包括默认参数)
param_grid = {
'n_estimators': [100, 200], # 树的数量
'max_depth': [None, 10, 20], # 树的最大深度
'min_samples_split': [2, 5], # 分割一个内部节点所需的最小样本数
'min_samples_leaf': [1, 2], # 叶子节点的最小样本数
'bootstrap': [True, False] # 是否使用bootstrap样本
}
# 使用 GridSearchCV 进行网格搜索,采用 KFold 进行 K 折交叉验证
grid_search = GridSearchCV(estimator=rf_model, param_grid=param_grid, cv=KFold(n_splits=5),
scoring='neg_mean_squared_error', n_jobs=-1, verbose=2)
# 在训练集上进行网格搜索
grid_search.fit(X_train, y_train)
# 使用最佳参数训练模型
best_rf_model = grid_search.best_estimator_
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 用训练好的模型在训练集上进行预测
y_pred_train = best_rf_model.predict(X_train)
# 计算 RMSE (Root Mean Squared Error) 对训练集
rmse_train = mean_squared_error(y_train, y_pred_train, squared=False)
# 计算 MAE (Mean Absolute Error) 对训练集
mae_train = mean_absolute_error(y_train, y_pred_train)
# 计算 R² (R-squared) 对训练集
r2_train = r2_score(y_train, y_pred_train)
# 输出训练集的评估指标
print(f"RMSE on Train Set: {rmse_train}")
print(f"MAE on Train Set: {mae_train}")
print(f"R² on Train Set: {r2_train}")
# 用训练好的模型在测试集上进行预测
y_pred_test = best_rf_model.predict(X_test)
# 计算 RMSE (Root Mean Squared Error) 对测试集
rmse_test = mean_squared_error(y_test, y_pred_test, squared=False)
# 计算 MAE (Mean Absolute Error) 对测试集
mae_test = mean_absolute_error(y_test, y_pred_test)
# 计算 R² (R-squared) 对测试集
r2_test = r2_score(y_test, y_pred_test)
# 输出测试集的评估指标
print(f"RMSE on Test Set: {rmse_test}")
print(f"MAE on Test Set: {mae_test}")
print(f"R² on Test Set: {r2_test}")
RMSE on Train Set: 25.202753385221854
MAE on Train Set: 16.950277876443707
R² on Train Set: 0.9685898480540663
RMSE on Test Set: 47.69748446411317
MAE on Test Set: 34.2818202871461
R² on Test Set: 0.9178513662586597
对提取的特征使用随机森林回归模型进行训练,并通过网格搜索优化模型的超参数。评估结果显示,训练集的R²为0.97,表现非常好,表明模型能够很好地拟合训练数据。然而,测试集的R²为0.92,虽然略低于训练集,但仍显示出良好的预测能力,最后可视化模型在测试集上的预测结果
import shap
explainer = shap.TreeExplainer(best_rf_model)
shap_values = explainer.shap_values(X_test)
使用SHAP的TreeExplainer对训练好的随机森林模型进行解释,并计算测试集的SHAP值,为接下来的基于SHAP和GAM识别特征影响阈值的模型解释和可视化做准备
这里先可视化一个特征(E12-2)的SHAP值,展示该特征对模型输出的影响,其中R²为0.97,表明特征与模型输出之间有很强的关系,并且图中标出了“转折点”,即SHAP值变化的关键点,此时shap值等于0特征对结果没有任何影响
最后通过定义一个函数来一次性绘制多个GAM可视化,图表中没有显示"Tipping point"的标志。为了方便修改位置和批量绘制,文本标记被关闭,读者可以根据需要手动添加"Tipping point"标记,提供更灵活的定制空间
Feature: E12-2 - Tipping point at X=0.24, Original value: 0.23854376500351598
Feature: C3-2 - Tipping point at X=2726.88, Original value: 2726.8795758769406
Feature: E11-2 - Tipping point at X=0.05, Original value: 0.05031897710236624
Feature: S2-1 - Tipping point at X=0.52, Original value: 0.5197715163141999
Feature: A2-2 - Tipping point at X=60.12, Original value: 60.119262342575134
Feature: E4-1 - Tipping point at X=3.45, Original value: 3.445672349784488
Feature: S2-2 - Tipping point at X=0.08, Original value: 0.08278877581926784
Feature: E10-1 - Tipping point at X=1.38, Original value: 1.3805524993054565
Feature: E9-2 - Tipping point at X=0.01, Original value: 0.009620363826956071
Feature: E9-2 - Tipping point at X=0.05, Original value: 0.04944450235450345
Feature: C5-2 - Tipping point at X=3354.33, Original value: 3354.3328081073973
Feature: S12-2 - Tipping point at X=1855.56, Original value: 1855.5574690316244
Feature: S12-2 - Tipping point at X=2992.81, Original value: 2992.806070429625
同时返回GAM曲线与y=0(即SHAP值等于0)的交点,也就是对应的阈值特征原始值,这样能够更方便地进行模型解释,帮助识别影响模型输出的关键特征临界值
✨ 该文章案例 ✨
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,或添加作者微信deep_ML联系,获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容,或者添加作者微信deep_ML联系 避免淘宝客服漏掉信息 ,希望能为您的学习之路提供帮助!
✨ 免费赠书 ✨
支持知识分享,畅享学习乐趣!特别感谢清华大学出版社 对本次赠书活动的鼎力支持!即日起,只需点赞、推荐、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《大模型核心技术与开发实践:基于Transformer、PyTorch及Hugging Face》这本精彩书籍📚!
💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!
往期推荐
期刊复现:连续数据与分类数据共存的SHAP可视化散点图与箱形图组合形式
期刊复现:多分类任务如何拆分为二分类任务并进行堆叠预测提高模型预测性能
期刊配图:SHAP值分析模型可解释性在柱状图与蜂窝图中的进阶组合展示
期刊配图:通过堆叠Mean|SHAP|展示不同区间对模型贡献度的可视化分析
期刊复现:利用UMAP降维算法可视化深度学习随着训练次数的增加模型区分能力的变化
期刊配图:PCA、t-SNE与UMAP三种降维方法简化高维数据的展示应用对比
Science期刊复现:分类、回归与Shap分析多角度揭示同一数据集变量对目标的影响
多模型SHAP+PDP解读Stacking集成模型:从基学习器到元学习器的可解释性与模型调参实现
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考