基础代码
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参数确保两集的类别比例保持一致。接着,构建随机森林分类器,配合GridSearchCV在多个超参数组合上进行5折交叉验证,最终以准确率为指标筛出最优模型。模型到手后,再用shap.TreeExplainer对测试集计算SHAP值和交互值,这样就能搞清楚每个特征独立的贡献,以及两两特征之间的交互影响。
从结果来看,shap_values的维度是(90, 13, 2)——代表90个测试样本、13个特征、2个类别。最后一个维度分别对应类别0和类别1的SHAP值。而shap_interaction_values的维度是(90, 13, 13, 2),意味着对每一个测试样本,模型都计算了13个特征之间两两交互的贡献矩阵,并且同样按两个类别分开。所以,RF模型二分类的SHAP输出形式和多分类模型很像,需要按研究目标进一步提取。既然我们的关注点放在类别1上,那就可以直接用shap_values[:, :, 1]和shap_interaction_values[:, :, :, 1]来提取类别1的特征贡献值和交互值,后续的网络图构建也就顺理成章了。
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),
sa ve_path="feature_network.png",
)



该文章案例

介绍
到这里,本节的内容就告一段落了。案例资料中包含了代码、注释、数据说明以及参考文献,方便大家学习和复现。