您的位置:首页 > 娱乐 > 明星 > 什么是网络营销型网站_国际新闻最新消息今天军事_如何优化培训方式_交换链接营销的典型案例

什么是网络营销型网站_国际新闻最新消息今天军事_如何优化培训方式_交换链接营销的典型案例

2024/12/23 10:38:37 来源:https://blog.csdn.net/2301_76574743/article/details/142899905  浏览:    关键词:什么是网络营销型网站_国际新闻最新消息今天军事_如何优化培训方式_交换链接营销的典型案例
什么是网络营销型网站_国际新闻最新消息今天军事_如何优化培训方式_交换链接营销的典型案例

SHAP 依赖图

SHAP 依赖图用于可视化单个特征对机器学习模型预测结果的影响,具体来说,x 轴是特征值,y 轴是 SHAP 值(度量特征对预测结果的重要性),这些图可以直观地显示出某个特征是对模型预测起正向还是负向作用

代码实现

数据集加载

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
import warnings
warnings.filterwarnings("ignore")
df = pd.read_csv('UCI Heart Disease Dataset.csv')
# 划分特征和目标变量
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.2, random_state=42, stratify=df['target'])
df.head()

        首先,需要加载数据集并将其划分为特征 X 和目标变量 y,然后进行训练集和测试集的划分。目标变量是我们要预测的值,X 是输入的特征,这是一个分类任务,目标是预测患者是否患有心脏病。虽然是分类任务,但无论是分类问题还是回归问题,SHAP 依赖图的使用方式和原理是相同的,都可以用来解释模型中各个特征对预测结果的贡献

训练机器学习模型

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV# GBT模型参数
params_gbt = {'learning_rate': 0.02,            # 学习率,控制每一步的步长,用于防止过拟合。典型值范围:0.01 - 0.1'max_depth': 3,                   # 树的深度,控制模型复杂度'random_state': 42,               # 随机种子,用于重现模型的结果'subsample': 0.7,                 # 每次迭代时随机选择的样本比例,用于增加模型的泛化能力
}# 初始化Gradient Boosting分类模型
model_gbt = GradientBoostingClassifier(**params_gbt)# 定义参数网格,用于网格搜索
param_grid = {'n_estimators': [100, 200, 300],  # 树的数量'max_depth': [3, 4, 5],               # 树的深度'learning_rate': [0.01, 0.1],   # 学习率
}# 使用GridSearchCV进行网格搜索和k折交叉验证
grid_search = GridSearchCV(estimator=model_gbt,param_grid=param_grid,scoring='neg_log_loss',  # 评价指标为负对数损失cv=5,                    # 5折交叉验证n_jobs=-1,               # 并行计算verbose=1                # 输出详细进度信息
)# 训练模型
grid_search.fit(X_train, y_train)# 使用最优参数训练模型
best_model = grid_search.best_estimator_

        这里使用了梯度提升树(GBT),这是一个强大且常用的机器学习算法,通过网格搜索进行参数优化

计算 SHAP 值

import shap
explainer = shap.TreeExplainer(best_model)
# 计算shap值为numpy.array数组
shap_values_numpy = explainer.shap_values(X)
# 计算shap值为Explanation格式
shap_values_Explanation = explainer(X)

       

 模型训练完毕后,可以使用 shap 包来计算 SHAP 值,SHAP 值用于衡量特定特征对模型输出的影响,这里分别通过 explainer.shap_values(X) 计算 SHAP 值为数组格式以便自定义绘制,和通过 explainer(X) 计算为 Explanation 格式,直接使用 SHAP 自带的绘图函数进行可视化

SHAP自带绘图函数实现依赖图

默认参数下绘制

# 绘制 'age' 特征的SHAP依赖图
shap.dependence_plot('age', shap_values_Explanation.values, X_test, show=False)
# 添加 SHAP=0 的横线
plt.axhline(y=0, color='black', linestyle='-.', linewidth=1)
plt.savefig("SHAP Dependence Plot_1.pdf", format='pdf',bbox_inches='tight',dpi=1200)
plt.show()

        上图展示了 age(年龄) 特征对模型预测结果的 SHAP 值的依赖关系,说明不同年龄段如何影响模型的预测

  • X 轴(age):表示年龄的取值范围,从 30 到 75 岁

  • Y 轴(SHAP value for age):表示年龄对模型预测的影响。SHAP 值为正时,表示该年龄段增加了模型预测的概率;SHAP 值为负时,表示该年龄段降低了预测的概率

从图中可以看到:

  • 年龄在 50 到 60 岁之间 对模型预测结果有显著的正面影响,SHAP 值较高,说明模型在这个年龄段倾向于预测目标事件的发生

  • 70 岁左右,SHAP 值开始变为负数,意味着在这个年龄段,模型预测发生的概率降低

  • 颜色代表了 thal(地中海贫血类型) 这一交互特征的影响,红色表示更高的值,蓝色表示较低的值,可以看到,thal 的不同取值对 SHAP 值的分布有一定影响,尤其是在 SHAP 值较大的区域,红色点较为集中

绘制无颜色条的年龄 SHAP 依赖图

# 绘制 'age' 特征的 SHAP 依赖图,不显示颜色条
shap.dependence_plot('age', shap_values_Explanation.values, X_test, show=False, interaction_index=None)
# 添加 SHAP=0 的横线
plt.axhline(y=0, color='black', linestyle='-.', linewidth=1)
plt.savefig(r"SHAP Dependence Plot_2.pdf", format='pdf',bbox_inches='tight',dpi=1200)
plt.show()

        在这里,通过设置 interaction_index=None 可以关闭颜色条,不显示交互特征的影响。不过,该函数目前没有内置参数可以直接在 SHAP 值为 0 的位置添加一条横线。为了实现这一功能,可以利用 matplotlib 的 plt.axhline() 方法,在绘制依赖图后手动添加横线

接下来,还可以通过 explainer.shap_values(X) 格式绘制这个shap依赖图,以便实现自定义绘图

自定义绘图

将 SHAP 值转换为 DataFrame 格式以便于自定义绘图

# 将 SHAP 值转换为 DataFrame
shap_values_df = pd.DataFrame(shap_values, columns=X_test.columns)
shap_values_df.head()

单个shap依赖图绘制

# 绘制散点图,x轴是'age'特征,y轴是SHAP值
plt.scatter(X_test['age'], shap_values_df['age'], s=10)
# 添加shap=0的横线
plt.axhline(y=0, color='black', linestyle='-.', linewidth=1)
# 设置x和y轴标签  
plt.xlabel('age', fontsize=12)
plt.ylabel('SHAP value for age', fontsize=12)
# 隐藏顶部和右侧的脊柱
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
plt.savefig(r"SHAP Dependence Plot_3.pdf", format='pdf',bbox_inches='tight',dpi=1200)
plt.show()

        代码生成一个 SHAP 值依赖图,其中展示了特征 age 对模型输出的贡献,同时对图表进行了一些格式上的优化,比如隐藏不必要的边框线条、在 SHAP=0 处添加一条基准线,并最终将图像保存为高分辨率的 PDF 文件。相比于直接使用 shap.dependence_plot() 的默认作图方式,这种方法提供了更高的灵活性,特别是在定制化绘图方面,可以根据不同场景、需求对图表进行高度定制,从而提高可视化的效果和表达的准确性。

多个shap依赖图绘制

# 定义绘制 SHAP 依赖图的函数
def plot_shap_dependence(feature_list, df, shap_values_df, file_name="SHAP_Dependence_Plots.pdf"):fig, axs = plt.subplots(2, 3, figsize=(12, 8), dpi=1200)plt.subplots_adjust(hspace=0.4, wspace=0.4)# 循环绘制每个特征的 SHAP 依赖图for i, feature in enumerate(feature_list):row = i // 3  # 行号col = i % 3   # 列号ax = axs[row, col]# 绘制散点图,x轴是特征值,y轴是SHAP值ax.scatter(df[feature], shap_values_df[feature], s=10)# 添加shap=0的横线ax.axhline(y=0, color='black', linestyle='-.', linewidth=1)# 设置x和y轴标签ax.set_xlabel(feature, fontsize=12)ax.set_ylabel(f'SHAP value for\n{feature}', fontsize=12)# 隐藏顶部和右侧的脊柱ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)# 隐藏最后一个空图表的坐标轴 (若画布未关闭)axs[1, 2].axis('off')plt.savefig(file_name, format='pdf', bbox_inches='tight')plt.show()# 使用函数绘制age、trestbps、chol、thalach、oldpeak的shap依赖图
feature_list = ['age', 'trestbps', 'chol', 'thalach', 'oldpeak']
plot_shap_dependence(feature_list, X_test, shap_values_df, file_name=r"SHAP Dependence Plot_4.pdf")

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com