背景
广义加性模型(GAM)结合SHAP值的可视化为切入点,通过回归趋势分析,挖掘关键特征在不同取值范围内对模型的正负影响变化。通过分析特征的原始值及其SHAP值的趋势关系,不仅能够识别出特征对于模型的影响趋势,还能直观地呈现特征从正向影响到负向影响的分界线,这种方法为深度理解模型预测提供了新的可视化视角,详细期刊复现参考往期文章——期刊配图:利用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
from sklearn.model_selection import train_test_split
df = pd.read_excel('2025-1-21公众号Python机器学习AI.xlsx')
# 划分特征和目标变量
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.3,
random_state=42, stratify=df['y'])
from xgboost import XGBClassifier
from sklearn.model_selection import GridSearchCV, StratifiedKFold
from sklearn.metrics import accuracy_score
# 定义 XGBoost 二分类模型
model_xgb = XGBClassifier(use_label_encoder=False, eval_metric='logloss', random_state=8)
# 定义参数网格
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [3, 5, 7],
'learning_rate': [0.01, 0.1, 0.2],
'subsample': [0.8, 1.0],
'colsample_bytree': [0.8, 1.0]
}
# 定义 K 折交叉验证 (Stratified K-Fold)
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=8)
# 使用网格搜索寻找最佳参数
grid_search = GridSearchCV(estimator=model_xgb, param_grid=param_grid, scoring='accuracy',
cv=kfold, verbose=1, n_jobs=-1)
# 拟合模型
grid_search.fit(X_train, y_train)
# 使用最优参数训练模型
xgboost = grid_search.best_estimator_
通过网格搜索和交叉验证优化XGBoost分类模型的超参数,为后续使用SHAP进行模型解释提供模型基础
SHAP解释:特征重要性排序
import shap
explainer = shap.TreeExplainer(xgboost)
explainer = shap.TreeExplainer(xgboost)
# 计算shap值为Explanation格式
shap_values_Explanation = explainer(X_test)
plt.figure(figsize=(10, 5), dpi=1200)
shap.plots.bar(shap_values_Explanation, show=False)
plt.title('SHAP_Explanation Sorted Feature Importance')
plt.savefig("1.pdf", format='pdf',bbox_inches='tight')
plt.tight_layout()
plt.show()
使用SHAP来计算并可视化XGBoost模型的特征重要性,展示每个特征的SHAP绝对值均值,从图中可以看出,X_2是最重要的特征,其SHAP绝对值均值为0.69,表明它对模型预测结果有最大的影响。其他特征如X_6、X_8、X_1、X_7等的重要性逐渐减小,而X_3、X_5和X_4的影响最小
接下来,选择特征X_2(特征重要性最高的特征)进行更深入的分析,使用GAM(广义加法模型)对其进行建模,并通过SHAP值的可视化来解释该特征对预测结果的贡献。通过这种方式,能够帮助理解X_2特征如何影响模型的预测结果,并解释其与目标变量之间的关系
X_2特征的GAM模型拟合与SHAP值可视化
# 找到 y=0 与拟合线的所有交点
zero_crossing_indices = np.where(np.diff(np.sign(y_pred)))[0]
# 获取交点时的 x 值(原始的 X_2 值)
zero_crossing_x_values = XX[zero_crossing_indices]
# 保留交点时的 x 值两位小数
zero_crossing_x_values_rounded = np.round(zero_crossing_x_values, 2)
# 输出交点时的 x 值
print("交点时的 x 值:", zero_crossing_x_values_rounded)
SHAP值是对模型输出的解释,表示特征对预测结果的贡献。SHAP 值有两个重要方面:
- 符号(正或负): 表示特征对模型输出的影响方向, 正:特征的增大导致预测值增加,负:特征的增大导致预测值减少
- 绝对值的大小:表示特征对模型预测的影响程度。绝对值越大,表示对模型预测结果的影响越强
临界点和SHAP值的变化
在图像和数据中,可以看到一个显著的临界点(Tipping Point),发生在X=129.08,SHAP值由负变为正:这是一个非常重要的变化,意味着特征的影响方向发生了变化。在该点之前,特征对模型的影响是负向的,特征的增大导致预测值减小;而在该点之后,特征的影响转为正向,特征的增大导致预测值增加
区间1: 从0.0到129.08(SHAP值为负)
在这个区间内,SHAP值为负,意味着特征值的增加导致预测值减少。然而,预测值减少的程度是动态变化的,它不仅取决于符号,还与SHAP值的绝对值有关。 虽然整个区间的 SHAP值为负,但在区间内不同的SHAP值绝对值表示了预测值减少的不同程度。 SHAP值的绝对值越大,预测值减少的程度越显著
区间2: 从129.08到199.0(SHAP值为正)
在这个区间内,SHAP值为正,意味着特征值的增加导致预测值增加。SHAP值的绝对值表示预测值增加的程度
总结性结论:根据临界点划分区域,SHAP值的符号决定特征对预测值的影响方向(正向或负向)。 根据SHAP值的绝对值确定影响程度,SHAP值的绝对值表示特征对预测结果的影响强度,绝对值越大,影响越强。 非线性影响, 特征的影响并非单纯的线性关系,特征值在不同区间内对预测结果的影响是复杂且非线性的。 因此,影响程度不仅依赖于 SHAP 值的符号,还与其绝对值密切相关
往期推荐
聚类与解释的结合:利用K-Means聚类辅助SHAP模型解释并可视化
期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比
期刊配图:SHAP蜂巢图与柱状图多维组合解读特征对模型的影响
基于mRMR筛选和递归特征选择的多模型性能评估与AUC可视化对比
期刊配图:SHAP可视化进阶蜂巢图与特征重要性环形图的联合展示方法
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考