Advertisement

SHAP模型:可解释机器学习模型

阅读量:

SHAP(SHapley Additive exPlanation)模型是一种用于解释机器学习模型的方法,其核心思想是通过计算特征对模型输出的边际贡献,从全局和局部两个层面解释“黑盒模型”。SHAP基于Shapley value理论,公平合理地分配每个特征对预测结果的贡献。它可以用于模型调试、特征工程指导、数据采集方向、决策指导以及建立模型与人之间的信任。SHAP支持多种解释器,如deep、gradient、kernel、linear和tree,适用于不同的模型类型。通过SHAP可以生成可视化图表,帮助理解模型行为。此外,用户需要注意在使用SHAP进行模型解释时,可能需要调用initjs()以确保图表的正确显示。SHAP在足球运动员身价估计和波士顿房价估计等实际问题中也有应用。

小白进阶选手,如果写的内容有什么问题大家一起讨论学习呀 :)

模型介绍

首先个人理解SHAP模型是对机器学习模型进行解释的一个模型

上面这个图就是一个比较直观的解释

大多数机器学习模型本质上是一个黑箱。例如,一个模型在进行预测任务时,首先会将这些已知参数(如年龄、性别、血压、BMI值)输入模型。随后,模型在接收到这些输入后会进行训练。经过训练后,模型能够输出预测结果(如0.4)。

该模型仅能得出最终的预测结果。至于模型内部的工作原理,输入的已知条件(Age=65,Sex=F,BP=180,BMI=40)对预测结果(Output=0.4)的影响机制,我们目前无法深入解析。

而SHAP模型则能帮助我们明确这些已知条件对最终预测结果的影响方向(是正向还是负向影响)。除了SHAP模型之外,还有其他方法可用于特征重要性计算,例如在下表中提到的,我们可以根据不同方法的特点选择最适合的来进行特征重要性计算。

本文重点阐述了SHAP方法,作为模型事后解释技术的核心,其基本理念是通过计算特征对模型输出的边际贡献,从全局和局部两个维度解析"黑盒模型"的行为机制。SHAP构建了一个加性解释模型,将所有特征视为具有独立贡献的"贡献单元"。

SHAP的全称是SHAP(SHapley Additive Explanations),SHAP是基于Shapley value理论的可加性解释模型。那什么是合作博弈论呢?比如说甲乙丙丁四个工人一起打工,甲和乙完成了价值100元的工件,甲、乙、丙完成了价值120元的工件,乙、丙、丁完成了价值150元的工件,甲、丁完成了价值90元的工件,那么该如何公平合理地分配这四个人的工钱呢?Shapley提出了一个合理的方法,我们称每个参与者应获得的分配数额被称为Shapley value。

基于文章开篇所提及的预测任务,我认为即上述已知条件(Age=65,Sex=F,BP=180,BMI=40)共同完成了预测结果(Output=0.4)。那么,如何公平、合理地将这四个已知条件对预测结果的贡献进行分配呢?此时SHAP模型则会分别赋予这四个已知条件各自的 Shapley value 值,通过这些值我们得以清晰地理解其各自的重要性。

SHAP可以具体解决的任务

为模型调试提供支持,帮助工程师进行特征工程设计,确定数据采集策略,指导决策过程,提升模型与用户之间的信任度。

这一部分在该网站上有详细的阐述

SHAP库可用的explainers

在SHAP中进行模型解释时,首先需要生成一个解释器,该库能够处理多种类型

用于分析深度学习模型的行为,该方法利用DeepLIFT算法进行高效梯度计算,支持TensorFlow和Keras框架。

实验

通过在网路上运行几个相关的实验,加深了对SHAP模型行为的理解,同时其可视化图具有较高的美观性。

为了更好地掌握SHAP方法,首先需要对机器学习模型有较为深入的理解。

网上查找的几个代码多为回归类问题,因此了解得相对较为浅显。对于其他类型的问题,未来可以尝试用SHAP方法对模型进行解释验证。值得注意的是,关于利用SHAP解释深度学习模型的实例相对较少,如在计算机视觉领域,通过SHAP分析各层网络对最终分类结果的影响,未来可以进一步探索这一方向。

问题1:

足球运动员身价估计

每个足球运动员在转会市场上都具有独特的市场价码,这一问题的核心在于基于球员的各项统计数据和综合能力评估来预测其在转会市场的市场价值。

问题2:

波士顿房价估计

通过数据挖掘对影响波士顿房价的因素进行分析

具体代码:

该文件可通过以下方式访问并下载:此处可点击下载该文件

SHAP导出各种格式的图

注意画图前需要加:

复制代码
    shap.initjs()

不加就会报错:

复制代码
 Visualization omitted, Javascript library not loaded!

    
 Have you run `initjs()` in this notebook? If this notebook was from another user you must also trust this notebook (File -> Trust notebook). If you are viewing this notebook on github the Javascript has been stripped for security. If you are using JupyterLab this error is because a JupyterLab extension has not yet been written.

在论文中添加SHAP模型输出的可视化图时,发现仅在代码最后添加plt.savefig函数会导致生成的图像为空白。通过查看源码可以发现,其底层仍基于matplotlib库。在调用shap.xxx_plot函数时,可以传递matplotlib参数以实现类似功能。例如,不同类型的shap.xxx_plot函数对matplotlib参数的要求可能不同,以下是一些常见的使用场景:

不包括以下情况,瀑布图无需额外配置即可完成,而shap.decision_plot则需要指定参数return_objects=True。

除了少数例外情况,瀑布图可以直接使用plt.savefig,而shap.decision_plot则需要设置参数return_objects=True。

除了几个特例,瀑布图可以直接调用plt.savefig,shap.decision_plot则需要指定return_objects=True作为参数。

复制代码
 shap.force_plot(explainer.expected_value, shap_values[j], data[cols].iloc[j],matplotlib=True,show = False)

    
 plt.savefig('./result_300dpi.jpg', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.jpg', bbox_inches='tight', dpi=150)
    
 plt.savefig('./result_300dpi.png', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.png', bbox_inches='tight', dpi=150)
    
 plt.savefig('./result_300dpi.tiff', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.tiff', bbox_inches='tight', dpi=150)
    
 plt.savefig('./result_300dpi.svg', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.svg', bbox_inches='tight', dpi=150)
复制代码
 shap.summary_plot(shap_values, data[cols],show = False)

    
 plt.savefig('./result_300dpi.jpg', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.jpg', bbox_inches='tight', dpi=150)
    
 plt.savefig('./result_300dpi.png', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.png', bbox_inches='tight', dpi=150)
    
 plt.savefig('./result_300dpi.tiff', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.tiff', bbox_inches='tight', dpi=150)
    
 plt.savefig('./result_300dpi.svg', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.svg', bbox_inches='tight', dpi=150)
复制代码
 shap.dependence_plot('age', shap_values, data[cols], interaction_index=None, show=False)

    
 plt.savefig('./result_300dpi.jpg', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.jpg', bbox_inches='tight', dpi=150)
    
 plt.savefig('./result_300dpi.png', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.png', bbox_inches='tight', dpi=150)
    
 plt.savefig('./result_300dpi.tiff', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.tiff', bbox_inches='tight', dpi=150)
    
 plt.savefig('./result_300dpi.svg', bbox_inches='tight', dpi=300)
    
 plt.savefig('./result_150dpi.svg', bbox_inches='tight', dpi=150)

References

https://www.jianshu.com/p/324a7c982034

https://zhuanlan.zhihu.com/p/64799119

https://zhuanlan.zhihu.com/p/83412330

全部评论 (0)

还没有任何评论哟~