部分依赖图 Partial Dependence Plot

如今机器学习算法在各个领域被广泛应用,对于一些领域的科研来说,机器学习提供了更精确估计的可能,但是其弱解释性却成为了更深入研究的阻力。可解释机器学习就是在机器学习模型的基础上通过一系列方法使得模型结果具备可解释的特性,部分依赖图(Partial Dependence Plot)显示了一个或两个特征对机器学习模型的预测结果的边际效应,由于很多机器学习算法非参数的特性使得部份依赖图可以揭示线性以及非线性特征,容易理解并且有较高的解释力。

部分依赖图简易并且直观,在科学研究中被经常使用,但同时它也具有一些问题:

  1. 自变量间可能存在复杂的交互关系导致最终的结果,所以单看一个变量的pdp图可能是不全面的,然而由于人们对图形理解力的局限性,pdp图最多只支持双变量的交互而无法进行更高维的交互,当然这个缺陷的主要来源是人们的主观理解能力有限。
  2. 一些pdp图不显示特征分布,这可能会产生误导,因为可能会过度解释几乎没有数据的区域。
  3. pdp假设其计算部分依赖的特征与其他特征不相关(在不进行交互的情况下),这可能会导致结果的误差,一个解决办法是使用条件而不是边际分布的累积局部效应图。(https://christophm.github.io/interpretable-ml-book/pdp.html)
  4. 由于pdp绘制的是平均响应,个体间的异质性可能无法被观察到,即有可能个体间的变化差异明显,这可以通过个体条件期望(Individual Conditional Expectation,ICE)曲线观察到。
  5. 取决于算法的精度以及难以避免的过拟合,pdp图可能存在许多较小的波动或变化趋势,而一般进行解释性研究时更加关注的是整体的变化趋势而不是局部变化。

sklearn的pdp方法

Python中重要的机器学习包sklearn在最近的更新中加入了pdp图的绘制方法,官方案例见:https://scikit-learn.org/stable/modules/partial_dependence.html?highlight=pdp


可以看到自带的绘图方法可以绘制单变量以及双变量交互的PDP图,并且还可以绘制ICE图,并且绘制的图形中包括了轴须图。不过根据上述的问题来看,sklearn提供的绘图方法轴须图太过稀疏,对样本分布的表征并不理想;其次缺少对曲线进行平滑拟合的表达。

pdp图绘制改进

基于以上的一些需求,我们可以自行绘制自己想要的pdp图,主要的思路就是使用sklearn的partial_dependence方法直接获取pd的值数组(https://scikit-learn.org/stable/modules/generated/sklearn.inspection.partial_dependence.html?highlight=partialdependence),然后使用其他的绘图包进行绘制。

下面是两种实践的代码,第一种包括了原曲线和拟合的样条曲线,并且使用了更密的轴须图,第二种在第一种的基础上增加了所有样本ICE的95%置信区间,这样可以看出样本间变化的异质性。不过需要注意的是这个置信区间是抽样估计的,与统计方法中参数估计的置信区间的意义是不同的。另外有一个小的细节是调用partial_dependence的时候如果不传入method参数则会自动使用‘recursion’方法,在一些模型中会导致pdp图的y轴是以0为基准值而不是以均值为基准值,而如果使用‘brute’方法则不会出现这种情况,但是会消耗更多的计算时间。

带拟合曲线与特征分布的pdp图

import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.inspection import partial_dependence # 直接获取pdp数组的方法
from scipy.interpolate import splev, splrep # 数据平滑插值features = list(importance.index)
for i in features:sns.set_theme(style="ticks", palette="deep", font_scale = 1.3)fig = plt.figure(figsize=(6, 5), dpi=100)ax  = plt.subplot(111)pdp = partial_dependence(model, X, [i], kind="average", method = 'brute', grid_resolution=50) # 获取pdp的数组plot_x = pdp['values'][0] # 提取值作为x轴plot_y = pdp['average'][0] # 提取平均pdp作为y轴数据tck = splrep(plot_x, plot_y, s=30) # 进行数据平滑,参考:https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html?highlight=interpolatexnew = np.linspace(plot_x.min(),plot_x.max(),300)ynew = splev(xnew, tck, der=0)plt.plot(plot_x, plot_y, color='k', alpha=0.4) # 绘制原曲线plt.plot(xnew, ynew, linewidth=2) # 绘制平滑曲线sns.rugplot(data = dummy_df.sample(100), x = i, height=.06, color='k', alpha = 0.3) # 使用sns绘制轴须图x_min = plot_x.min()-(plot_x.max()-plot_x.min())*0.1 # 定义x轴的下限x_max = plot_x.max()+(plot_x.max()-plot_x.min())*0.1 # 定义X轴的上限plt.title('Partial Dependence Plot of '+i , fontsize=18)plt.ylabel('Partial Dependence')plt.xlim(x_min,x_max) # 定义X轴的上下限,为了防止轴须图中的离散值改变了坐标轴定位plt.savefig('./pdpplot_'+i+'.jpg')plt.show()

绘制结果如下:

带ICE置信区间的pdp图

import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.inspection import partial_dependence # 直接获取pdp数组的方法
from scipy.interpolate import splev, splrep # 数据平滑插值features = list(importance.index)
for i in features:pdp = partial_dependence(model, X, [i], kind="both", grid_resolution=50) # 这里采用了both方法,除了pdp均值外会计算出每个样本的icesns.set_theme(style="ticks", palette="deep", font_scale = 1.1)fig = plt.figure(figsize=(6, 5), dpi=100)ax  = plt.subplot(111)plot_x = pd.Series(pdp['values'][0]).rename('x')plot_i = pdp['individual'] #获取每个样本的ice数组plot_y = pdp['average'][0]tck = splrep(plot_x, plot_y, s=30)xnew = np.linspace(plot_x.min(),plot_x.max(),300)ynew = splev(xnew, tck, der=0)plot_df = pd.DataFrame(columns=['x','y']) # 定义一个新df,包括x y两列for a in plot_i[0]: # 遍历每个样本的icea2 = pd.Series(a)df_i = pd.concat([plot_x, a2.rename('y')], axis=1) # 将ice与x横向拼接plot_df = plot_df.append(df_i) # 加入到总表中sns.lineplot(data=plot_df, x="x", y="y", color='k', linewidth = 1.5, linestyle='--', alpha=0.6) # 使用sns绘制线图,如果同一个x上有多个y的话将会自动生成95%置信区间plt.plot(xnew, ynew, linewidth=2)  sns.rugplot(data = dummy_df.sample(100), x = i, height=.05, color='k', alpha = 0.3)x_min = plot_x.min()-(plot_x.max()-plot_x.min())*0.1x_max = plot_x.max()+(plot_x.max()-plot_x.min())*0.1plt.title('Partial Dependence Plot of '+i , fontsize=18)plt.ylabel('Partial Dependence')plt.xlabel(i)plt.xlim(x_min,x_max)plt.savefig('./pdpplot_'+i+'.jpg')plt.show()

绘制结果如下:

科研中的部分依赖图(PDP)绘制相关推荐

  1. 模型的可解释性:部分依赖图PDP和个体条件期望图ICE

    来源:Deephub Imba 本文约1800字,建议阅读5分钟 本文我们通过一个简单据集的回归示例了解了部分依赖图 (PDP) 和个体条件期望 (ICE) 图是什么,以及如何在 Python 中制作 ...

  2. 一些科研中经常用到的工具

    一些科研中经常用到的工具 想必很多人在做科研或者写文档的时候经常会碰到一个问题就是工具使用的问题,下面列举一些比较常用的工具: 1.文档编辑软件 最常见的莫过于Microsoft Office系列了, ...

  3. 【无机纳米材料科研制图——OriginLab 0205】Origin绘制BET氮气吸附/脱附曲线及孔径分布图

    此篇,我们来分享如何对BET数据进行处理和制图. 一.等温吸脱附曲线绘制 1)找到等温吸脱附文件. 一半来说,对一个样品测一次BET,会产生很多数据,具体因仪器而异.我这里的数据主要有两个文件夹,一个 ...

  4. R语言ggplot2可视化在散点图中的每个点上绘制两个错误条:常见的是垂直错误条,它对应于Y值点上的错误(error bar),添加与X轴(水平)相关的错误条(error bar)

    R语言ggplot2可视化在散点图中的每个点上绘制两个错误条:常见的是垂直错误条,它对应于Y值点上的错误(error bar),添加与X轴(水平)相关的错误条(error bar) 目录

  5. Win10 UWP开发中的重复性静态UI绘制小技巧 1

    Win10 UWP开发中的重复性静态UI绘制小技巧 1 原文:Win10 UWP开发中的重复性静态UI绘制小技巧 1 介绍 在Windows 10 UWP界面实现的过程中,有时会遇到一些重复性的.静态 ...

  6. echart中拆线点的偏移_Qt中圆弧和扇形的绘制

    在超声软件的开发中,超声成像模块需要绘制圆弧,例如绘制一个扇形的取样框,左右是一条直线,上下是一个圆弧,像这样. Qt中使用QPainter::drawArc绘制圆弧,使用QPainter::draw ...

  7. pline加点lisp_用Autolisp 在AutoCAD中实现多种曲线的绘制

    用Autolisp 在AutoCAD中实现多种曲线的绘制 一.引言: AutoCAD自1982年由Autodesk公司推出以来,经历了20年的发展更新,目前,已深入到包括机械.建筑.服装.航天航空.地 ...

  8. OpenCV中直方图的计算和绘制

    OpenCV中直方图的计算和绘制 主要记录一下几个关键的API: cvRound(输入一个浮点数 );//返回一个整型数,取整的方法为四舍五入 split(输入多通道图像,数组或者vector变量. ...

  9. OpenCV-Python实战(番外篇)——OpenCV中利用鼠标事件动态绘制图形

    OpenCV-Python实战(番外篇)--OpenCV中利用鼠标事件动态绘制图形 使用鼠标事件动态绘制 动态绘制图形 动态绘制图形和文本 相关链接 使用鼠标事件动态绘制 我们已经在<OpenC ...

最新文章

  1. Matlab视频流处理:读取,播放,保存
  2. 单目视觉系统检测车辆的测距方法(Mobileye单目测距等7种方法)
  3. 虚拟机中使用centos-----2
  4. S11 Linux系统管理命令
  5. Ajax — 聊天机器人演示
  6. 数据结构 【实验3 链表基本操作】
  7. 大话Linux内核中锁机制之原子操作、自旋锁【转】
  8. 下班啦!做那么多老板不会心疼你的
  9. Android逆向笔记-通过配置文件设置全屏(逆向开发与正向开发)
  10. odoo10参考系列--网络控制器(Web Controllers)
  11. 学习笔记(05):MySQL数据库运维与管理-03-二进制日志配置管理演示
  12. 千字14图--Python慎用assert语句阻止代码执行
  13. 25 年 IT 老兵零基础写小说,作品堪比《三体》| 人物志
  14. 大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?
  15. Deklarit3.0的确不错,推荐一下。
  16. 强行卸载趋势科技防毒墙网络版客户端
  17. CVPR 2021 Exploring Simple Siamese Representation Learning
  18. 让发展中国家展示清洁能源领导力
  19. (接上)将txt中的一组时间转换为简化儒略日的小工具
  20. 画出Android的大体架构图

热门文章

  1. stm32 usart的BRR寄存器的配置,程序是CMSIS中的,分析它是怎么实现的?(自己设置好波特率,库文件会根据波特率计算BRR的值,和以前STM8不一样,需要自己根据波特率计算BRR值再设置)
  2. spring的maven依赖
  3. android系统user/userdebug版本设置selinux到SELINUX_PERMISSIVE模式
  4. webjar的详细使用方式
  5. ASP内置对象及其作用
  6. 欢迎进入夜色的繁星博客导航一站式搜索(所有博客的汇总帖)
  7. 2021年低压电工考试题及低压电工考试报名
  8. php处理大数据量数据的思路
  9. 北大计算机专业考研难不难,北京大学考研有多难 二本考研上北大经验谈
  10. 安防监控系统流媒体服务器,搭建一套安防监控系统RTSP/Onvif网络摄像头视频流媒体服务有哪些核心要素?...