首页 » 正文内容 » 模型解释之分解解释

模型解释之分解解释

时间:2024-02-23 10:36:52  热度:0°C

?专注R语言在?生物医学中的使用


设为“星标”,精彩不错过


上一篇推文概述了R语言中的模型解释,简单介绍了模型解释的分类和常见方法以及在R语言中的实现情况。

得益于DrWhy/AI工具集的帮助,在R中进行模型解释的语法非常简单,只需要3行代码即可,所以使用起来毫无难度,关键是如何理解这些模型解释方法。

今天主要介绍模型解释中的分解解释。

分解解释(break-down explanation)是一种模型无关的解释方法,属于局部解释中的特征归因法。分解解释主要分析模型对特定观测的预测值与平均预测值有何不同,以及如何把这些差异分配到各个预测变量中。

分解解释的原理是:在固定其他变量的取值的情况下,计算预测变量对该预测结果的偏移。它可以计算归因于单个特征的贡献如何改变模型对特定观测的平均预测。

下面我们结合一个具体的例子进行说明。

本文目录:

  • 分解解释

  • 优缺点

  • R语言实现

  • explain()和predict_parts()

分解解释

使用泰坦尼克号数据集进行演示。这是一个分类数据。包括2207行(2207个人,1317个乘客和890个船员),8个变量:

  • gender:“male” (78%),“female” (22%),因子型;
  • age:年龄,数值型;
  • class:等级或者类别,分为7种:1st” (14/7%)/ “2nd” (12/9%)/ “3rd”(32/1%)/ “deck crew” (3%)/ “engineering crew” (14/7%)/ “restaurantstaff” (3/1%)/ “victualling crew” (19/5%),因子型;
  • embarked:上船的港口,4个类别:“Belfast” (8/9%)/ “Cherbourg”(12/3%)/ “Queenstown” (5/6%)/ “Southampton” (73/2%),因子型;
  • fare:票价(对于船员是0),数值型,范围在0~512之间;
  • sibsp:在船上的兄弟姐妹个数,数值型,范围在0~8之间;
  • parch:在船上的父母/孩子的个数,数值型,范围在0~9之间;
  • survived:因子型,结果变量,是否生存,“yes” (67/8%) and “no”(32/2%)

我们使用经过缺失值插补的版本:

library(DALEX)Welcome to DALEX (version/ 2/4/3)/Find examples and detailed introduction at/ http///ema//data( titanic_imputed )#结果变量变成因子型titanic_imputed$survived</-factor(titanic_imputed$survived)dim(titanic_imputed)[1] 2207 8str(titanic_imputed) data/frame / 2207 obs/ of 8 variables/ $ gender / Factor w/ 2 levels female / male / 2 2 2 1 1 2 2 1 2 2 /// $ age / num 42 13 16 39 16 25 30 28 27 20 /// $ class / Factor w/ 7 levels 1st / 2nd / 3rd //// 3 3 3 3 3 3 2 2 3 3 /// $ embarked/ Factor w/ 4 levels Belfast / Cherbourg //// 4 4 4 4 4 4 2 2 2 4 /// $ fare / num 7/11 20/05 20/05 20/05 7/13 /// $ sibsp / num 0 0 1 1 0 0 1 1 0 0 /// $ parch / num 0 2 1 1 0 0 0 0 0 0 /// $ survived/ Factor w/ 2 levels 0 / 1 / 1 1 1 2 2 2 1 2 2 2 ///

假设我们使用titanic_imputed数据集建立了一个随机森林模型model_rf,我们想要使用这个模型预测某个乘客是生存还是死亡,预测结果为概率。

我们现在对其中一个样本的预测结果很感兴趣,假设这个样本的名字是张三,这个样本的信息,也就是张三的信息是:

  • age/ 8-year-old
  • class/ 1st
  • fare/ 72
  • gender/ male
  • embarked/ Southampton
  • sbisp/ 0
  • parch/ 0

下图是对该样本预测结果的一种展示:

我们从最上面开始往下看:

  • 最上面的all data这个小提琴图,表示模型对所有样本的预测结果的分布,红点是所有样本的预测值的平均值;这个平均值是0/235;
  • age = 8的这个小提琴图,表示该模型对所有age=8的样本的预测结果的分布,红点是这些预测结果的平均值;
  • class = 1st的这个小提琴图,表示该模型对所有age=8且class=1st的样本的预测结果的分布,红点是这些预测结果的平均值;
  • fare = 72的这个小提琴图,表示该模型对所有age=8且class=1st且fare=72的样本的预测结果的分布,红点是这些预测结果的平均值。……
  • 最后一行parch = 0,这个小提琴图,表示该模型对age=8且class=1st且fare=72且gender=male且embarked=Southampton且sbisp=0且parch=0的样本的预测结果,符合这么多条件的就只有一个样本(所以只有一个红点),就是张三!所以这个红点表示的值就是随机森林模型对“张三”这个样本的预测值。

所以这张图从上往下看,小提琴图是逐渐“变短”的,因为符合条件的人越来越少了。到最后一行时,就只有1个点了!这个点自然就表示该模型对“张三”这个样本的预测结果。

下面我们把上面这张图简化一下,去掉小提琴图,只留下表示平均值的红点,并标注出红点的值,就可以得到下图:

可以在最后一行看到,“张三”这个样本的预测值是0/422。

现在我们需要解释,这几个预测变量是如何让这个预测值变为0/422的。

把上图中的红点使用条形图表示,就可以得到下面的图:

这个图就是经典的分解解释图(break-down plot,BDplot)。这张图就很好地解释了对于“张三”这个样本的预测结果,每个预测变量是如何产生影响的。

模型对所有样本的预测平均值是0/235,加上age这个变量后,预测值就需要在0/235的基础上再加上0/27;再加上class这个变量,又需要加上0/086;再加上fare,需要减去0/046。加上所有变量后,最终这个预测结果变成了0/422。

这张图不仅展示了对于“张三”这个样本,哪个预测变量比较重要(age最重要),同时还以图形和数值的形式对预测变量的重要性进行了量化。还展示了哪些变量是正的影响,哪些是负的影响。

这种解释方法就是经典的分解解释!明白了这种方法的原理和图形之后,用代码实现就非常简单了。

优缺点

BD是一种与模型无关的方法,可以用于为单个观测值返回单个数字的任何模型。

优点:

  • 容易理解,把复杂的问题简化为简单的线性解释;
  • BD plot的结构紧凑,可以在一张图中展示多个预测变量对结果的影响

缺点:

  • 对有交互作用的模型会产生误导;
  • 对于有大量预测变量的模型,BD plot不足以应对;
  • 高度依赖于预测变量的顺序,结果偏差大

R语言实现

分解解释在R中可以通过iBreakDown实现,但是DALEX已经整合了所有的方法,我们无需单独加载iBreakDown,只需要使用DALEX即可实现。

DALEX是首字母缩写:moDel Agnostic Language for Exploration andeXplanation。

首先加载randomForest包,并用它建立一个随机森林模型:

library(randomForest)set/seed(123)titanic_rf</-randomForest(survived~//data=titanic_imputed)

建立好模型之后,接下来就进入模型解释的环节,如同上一篇推文中介绍的,只需要3步(3行代码)。

第一步:建立模型解释器,这个步骤是通过explain()函数实现的,不管是哪种模型,都是1行代码解决:

explain_rf</-DALEX//explain(model=titanic_rf/data=titanic_imputed[/-8]/y=titanic_imputed$survived==1/label= randomforest )Preparation of a new explainer is initiated ->/ model label / random forest ->/ data / 2207 rows 7 cols ->/ target variable / 2207 values ->/ predict function / yhat/randomForest will be used ( default ) ->/ predicted values / No value for predict function target column/ ( default ) ->/ model_info / package randomForest / ver/ 4/7/1/1 / task classification ( default ) ->/ model_info / Model info detected classification task but y is a logical / Converted to numeric/ ( NOTE ) ->/ predicted values / numerical/ min = 0 / mean = 0/2350131 / max = 1 ->/ residual function / difference between y and yhat ( default ) ->/ residuals / numerical/ min = -0/886 / mean = 0/08714363 / max = 1 A new explainer has been created!

第2步,选择解释方法。

对于局部解释(或者叫instance-level-explanation),统一使用predict_parts()函数,我们以第15个观测为例:

bd_rf</-predict_parts(explainer=explain_rf/new_observation=titanic_imputed[15/-8]/type= break_down /keep_distributions=TRUE)bd_rf contributionrandom forest/ intercept 0/235random forest/ gender = female 0/536random forest/ parch = 1 -0/032random forest/ class = 3rd -0/159random forest/ fare = 9/07 -0/074random forest/ embarked = Southampton -0/012random forest/ sibsp = 0 0/033random forest/ age = 18 0/197random forest/ prediction 0/724

此时对于数据集中的第15个观测(titanic_imputed[15/]),已经给出了分解解释结果。

第3步,画图。

直接调用plot()即可:

plot(bd_rf)

这张图就是分解解释图了,和我们上面的介绍一模一样。

如果在选择解释方法时使用了keep_distributions=TRUE,那么还可以在画图时使用小提琴图展示预测值的分布:

plot(bd_rf/plot_distributions=T)

explain()和predict_parts()

详细介绍一下explain()函数的用法。

使用不同的工具创建的模型对象可能具有不同的内部结构。因此,首先,我们必须创建一个解释器,即一个为不同模型提供统一接口的对象。该对象可以通过DALEX//explain()创建,该函数必须提供的参数只有model,其他参数都是可选的,包括:

  • data:建立模型使用的数据集,默认为NULL,即自动从模型对象中提取。注意,这里的data原则上是不包含结果变量的。
  • y:与对象中给定的数据相对应的因变量的观测值,默认为NULL,即自动从模型对象中提取,这个y需要数值型,但是如果是因子型它也会自动帮你转成数值型。
  • predict_function:模型的预测函数,默认为NULL,R中的预测函数大部分都是predict(),但是也有例外,所以有时需要自己指定,否则容易报错。
  • residual_function:残差计算函数,默认为NULL。
  • verbose:逻辑值,TRUE(默认)或者FALSE,是否打印日志信息。
  • precalculate:逻辑值,TRUE(默认)或者FALSE,是否在建立解释器时计算预测值和残差,如果verbose=TRUE时也会自动计算,如果不要自动计算,必须把该参数和verbose同时设置为FALSE。
  • model_info:一个提供模型信息的命名列表,默认为NULL,即函数会自动从模型对象中寻找。
  • type:模型的模式,分类(classification)还是回归(regression),默认为NULL,即函数会自动从模型对象中寻找。
  • label:对这个模型取个独特的名字,默认为NULL,即函数会自动从模型对象中选择。

再详细介绍一下predict_parts()的功能,主要参数如下:

  • explainer:模型解释器
  • new_observation:需要解释的观测,需要是一个数据框,数据结构和构建模型的数据需要保持一致
  • type:变量归因的计算方法,默认值是“break_down”,即分解解释,除此之外还有”shap”、“oscillations”、“break_down_interactions”
  • order:预测变量的顺序
  • keep_distribution:保存预测值的分布

前面也说过,分解解释高度依赖于变量的顺序,我们如果改变了顺序,结果就不一样了,下面演示一下:

bd_rf_distr</-predict_parts(explainer=explain_rf/new_observation=titanic_imputed[15/]/type= break_down /#改变变量顺序order=c( age / class / fare / gender / embarked / sibsp / parch ))plot(bd_rf_distr)

图形完全不一样哦~

predict_parts中的new_observation也可以是新的观测,只要数据结构保持一致即可,比如假设我们有一个新的观测名字为“Herry”,他的信息如下:

Herry</-data/frame(class=factor( 1st /levels=c( 1st / 2nd / 3rd / deckcrew / engineeringcrew / restaurantstaff / victuallingcrew ))/gender=factor( male /levels=c( female / male ))/age=8/sibsp=0/parch=0/fare=72/embarked=factor( Southampton /levels=c( Belfast / Cherbourg / Queenstown / Southampton )))Herry class gender age sibsp parch fare embarked1 1st male 8 0 0 72 Southampton

这个新观测的结构(预测变量的名字、顺序、类型)都要和原数据保持一致,这样也是可以进行预测并得到解释的:

bd_rf_herry</-predict_parts(explainer=explain_rf/new_observation=Herry/#这里是新的观测type= break_down )plot(bd_rf_herry)

随便建立个其他模型,也是可以解释的,DALEX支持的模型对象非常广泛,具体可参考上一篇推文:模型解释概述

比如建立一个支持向量机模型:

library(e1071)model_svm</-svm(survived~//data=titanic_imputed/probability=T)explain_svm</-DALEX//explain(model=model_svm/data=titanic_imputed[/-8]/y=titanic_imputed$survived==1/label= SVM )Preparation of a new explainer is initiated ->/ model label / SVM ->/ data / 2207 rows 7 cols ->/ target variable / 2207 values ->/ predict function / yhat/svm will be used ( default ) ->/ predicted values / No value for predict function target column/ ( default ) ->/ model_info / package e1071 / ver/ 1/7/14 / task classification ( default ) ->/ model_info / Model info detected classification task but y is a logical / Converted to numeric/ ( NOTE ) ->/ predicted values / numerical/ min = 0/08615183 / mean = 0/3226715 / max = 0/9588418 ->/ residual function / difference between y and yhat ( default ) ->/ residuals / numerical/ min = -0/8616836 / mean = -0/0005147015 / max = 0/9070124 A new explainer has been created! bd_svm</-predict_parts(explainer=explain_svm/new_observation=titanic_imputed[15/]/type= break_down /keep_distributions=TRUE)plot(bd_svm)

OVER!


联系我们,关注我们

  • 免费QQ交流群1:613637742
  • 免费QQ交流群2:608720452
  • 公众号消息界面关于作者获取联系方式
  • 知乎、CSDN、简书同名账号
  • 哔哩哔哩:阿越就是我
  • 免责声明:
    1. 《模型解释之分解解释》内容来源于互联网,版权归原著者或相关公司所有。
    2. 若《86561825文库网》收录的文本内容侵犯了您的权益或隐私,请立即通知我们删除。