别再只问一个AI了:多模型交叉验证的常见误区及避坑指南
2026-06-23
2026-06-25 0

欢迎关注Python机器学习AI
本节介绍:基于SHAP的二分类RF模型特征贡献与交互网络解析,数据采用模拟数据无任何现实意义,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整数据和代码稍后上传至网站。需要的朋友可关注公众文末提供的获取方式。后台 提供 高效AI工具~!
相关信息

在前文中,已实现多分类模型下基于SHAP的特征贡献与特征交互网络图解析——期刊复现:告别枯燥!多分类SHAP网络图读懂变量重要性与交互作用如何共同影响模型预测。对于二分类模型而言,不同模型输出的SHAP值结构存在一定差异。以RF为例,其SHAP输出形式与多分类模型类似,即类别0和类别1分别对应一组SHAP值;但由于二分类任务中两个类别互为对立关系,二者对应的SHAP值互为相反数,且和为0。因此,在进行特征重要性度量时,类别0与类别1的SHAP绝对值均值是一致的。相比之下,部分二分类模型如XGBoost仅输出一组SHAP值,用于共同刻画样本向类别1方向变化的贡献。基于这一差异,在二分类RF模型的SHAP网络图可视化中,以类别1的SHAP值及其交互值作为分析对象;相较于普通二分类模型,仅需在计算SHAP后额外增加一步类别1 SHAP值的提取操作,即可进一步构建特征贡献与特征交互网络
基础代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
# 忽略所有警告
warnings.filterwarnings("ignore")
path = r"2026-6-8公众号Python机器学习AI.csv"
df = pd.read_csv(path)
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df.drop(['target'], axis=1)
y = df['target']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.3,
random_state=42,
stratify=df['target']
)
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
# 定义随机森林模型
rf_model = RandomForestClassifier(
random_state=42,
n_jobs=-1
)
# 定义随机森林超参数网格
hyperparameter_grid = {
'n_estimators': [100, 200, 300], # 树的数量
'max_depth': [None, 3, 6, 10], # 树的最大深度
'min_samples_split': [2, 5, 10], # 内部节点再划分所需的最小样本数
'min_samples_leaf': [1, 2, 4], # 叶子节点所需的最小样本数
'max_features': ['sqrt', 'log2', None], # 每次分裂考虑的最大特征数
'bootstrap': [True, False] # 是否使用 bootstrap 抽样
}
# 初始化网格搜索
grid_search = GridSearchCV(
estimator=rf_model,
param_grid=hyperparameter_grid,
cv=5, # 5折交叉验证
n_jobs=-1, # 使用所有可用CPU
verbose=2, # 输出详细搜索过程
scoring='accuracy' # 评价指标
)
# 在训练集上进行网格搜索
grid_search.fit(X_train, y_train)
# 使用最佳参数模型
best_rf_model = grid_search.best_estimator_
import shap
# 为测试集计算 SHAP 交互值
explainer = shap.TreeExplainer(best_rf_model)
shap_interaction_values = explainer.shap_interaction_values(X_test)
# 计算 SHAP 值
shap_values = explainer.shap_values(X_test)
print("SHAP values:", shap_values.shape)
print(shap_interaction_values.shape)
SHAP values: (90, 13, 2)
(90, 13, 13, 2)
读取数据集,并将target作为目标变量,其余变量作为模型特征;随后按照7:3的比例划分训练集和测试集,并通过stratify=df['target']保持训练集和测试集中类别比例一致。接着,代码构建随机森林分类模型,并使用GridSearchCV在多个超参数组合上进行5折交叉验证,以准确率作为评价指标筛选最优模型。得到最佳RF模型后,进一步利用shap.TreeExplainer对测试集样本计算SHAP值和SHAP交互值,用于解释模型中各特征的独立贡献及两两特征之间的交互贡献
shap_values的维度为 (90, 13, 2),表示测试集中共有90个样本、13个特征、2个类别;其中最后一个维度分别对应类别0和类别1的SHAP值。shap_interaction_values的维度为 (90, 13, 13, 2),表示对于每个测试样本,模型都计算13个特征之间的两两交互贡献矩阵,并且同样分别对应两个类别。因此,在二分类随机森林模型中,SHAP输出形式类似多分类模型,需要根据研究目标进一步提取某一类别的SHAP结果。本文以类别1为主要解释对象,因此后续可使用shap_values[:, :, 1]和shap_interaction_values[:, :, :, 1]分别提取类别1的特征贡献值和特征交互值,用于构建SHAP特征贡献与交互网络图
fig, ax = plot_feature_interaction_and_importance_optimized_cb(
interaction_df,
importance_df,
interaction_cmap=interaction_cmap_literature,
importance_cmap=importance_cmap_literature,
title="diseased",
background_style="curve_shadow",
shadow_all_pairs=True,
shadow_color="lightgray",
shadow_alpha=0.16,
shadow_base_width=1.4,
edge_curve_strength=0.42,
edge_curve_jitter=0.035,
edge_alpha=0.55,
cbar_borderpad=4,
cbar_title_y=1,
edge_width_range=(0.25, 6.0),
node_size_range=(70, 1400),
label_offset=0.16,
figsize=(8, 8),
save_path="feature_network.png",
)

基于二分类糖尿病随机森林模型的SHAP结果,绘制患病类别对应的特征贡献与特征交互网络图。图中节点大小和颜色深浅表示特征重要性,即该特征对模型判别为患病类别的平均贡献强度;连线粗细和颜色表示特征之间的交互强度,红色越明显、线条越粗,说明两个特征在共同影响患病预测时的交互作用越强
从结果来看,cp是网络中最突出的特征,节点最大且颜色最深,说明其对模型识别患病样本的贡献最高;其次是thal、ca、exang和oldpeak等特征,也表现出较高的重要性。交互关系方面,ca与cp之间的红色粗线最明显,提示二者在模型判别患病类别时存在较强协同作用;此外,thal、exang、oldpeak与其他特征之间也存在一定交互,但强度相对较弱。整体而言,该网络图表明模型在预测患病类别时,主要依赖少数关键特征及其交互组合,其中cp、thal和ca是驱动患病判别的重要变量

读者可通过更换interaction_cmap和importance_cmap,该函数能够在保持网络结构和数值映射不变的前提下,快速生成不同色系风格的SHAP特征交互网络图,从而满足不同论文主题、期刊风格或展示场景的可视化需求
需要指出的是,SHAP特征贡献与交互网络图主要用于从整体层面识别驱动模型判别患病类别的重要变量及其潜在交互关系,例如哪些特征在模型预测中贡献更大、哪些特征组合可能共同影响患病判别。然而,该网络图并不能进一步揭示单个特征在不同取值区间内的具体作用方向,例如某一特征在何种范围内更倾向于推动模型预测为类别1,或在何种范围内更倾向于预测为类别0。为进一步刻画特征取值变化与模型预测输出之间的关系,可引入SHAP依赖图进行细化分析——期刊复现:基于XGBoost-SHAP的依赖图与交互图解析从单变量效应到变量协同作用、期刊配图:SHAP进阶类别特征与连续特征的箱线图、边际分布和拟合线可视化。SHAP依赖图能够展示特征值变化时对应SHAP值的分布趋势,从而帮助判断不同特征区间对预测结果的正向或负向影响。需要注意的是,SHAP解释反映的是模型内部学习到的统计关联关系,而非因果关系,因此其结果只能说明在当前模型中,特征取值变化与预测概率变化之间的相关性,不能直接推断该特征会导致疾病发生或风险改变
当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息

该文章案例

在上传的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
介绍
本节内容到此结束。若需要获取本案例的源码及相关资料,可通过公众号后台私信按钮“ 源码获取 ”了解店铺相关信息。资料中包含代码、注释、数据说明及参考文献,便于读者进一步学习和复现。合集目前包含近400篇资料。更多内容等你探索~~
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。
淘宝店铺

请大家打开淘宝,进入“Python机器学习AI”,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!
反馈


如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考