发布日期:2024-11-06 04:53 点击次数:77
图片
图片
图片
图片
图片
图片
图片
图片
SHAP(SHapley Additive exPlanations)是一种模子无关的诠释规范,因此它适用于任何模子。前边仍是先容过屡次这个SHAP了,在R谈话中末端SHAP也短长常轻视的。
R谈话SHAP模子诠释R谈话shapviz末端SHAP可视化R谈话SHAP模子诠释之kernelshapfastshap基于Rcpp和foreach,是以它的速率至极快(比之前先容的几种皆快),况且fastshap既不错末端局部诠释,又能末端全局诠释,还不错无缝对接shapviz的可视化。
装配# Install the latest stable version from CRAN:install.packages("fastshap")# Install the latest development version from GitHub:if (!requireNamespace("remotes")) { install.packages("remotes")}remotes::install_github("bgreenwell/fastshap")准备数据和R包
咱们使用经过缺失值插补的泰坦尼克号数据集t1,该数据有1309行,6列,其中survived是恶果变量,二分类,1代表归天,2代表存活。
library(fastshap)t1 <- titanic_mice[[1L]]dim(t1)## [1] 1309 6str(t1)## 'data.frame': 1309 obs. of 6 variables:## $ survived: Factor w/ 2 levels "no","yes": 2 2 1 1 1 2 2 1 2 1 ...## $ pclass : int 1 1 1 1 1 1 1 1 1 1 ...## $ age : num 29 0.92 2 30 25 48 63 39 53 71 ...## $ sex : Factor w/ 2 levels "female","male": 1 2 1 2 1 2 1 2 1 2 ...## $ sibsp : int 0 1 1 1 1 0 1 0 2 0 ...## $ parch : int 0 2 2 2 2 0 0 0 0 0 ...
把pclass变为有规章的因子型:
t1$pclass <- as.ordered(t1$pclass) # makes more sense as an ordered factor
本次使用ranger建树飞速丛林模子,对于其他模子,fastshap皆是撑捏的。
library(ranger)set.seed(2053) # for reproducibility(rfo <- ranger(survived ~ ., data = t1, probability = TRUE))## Ranger result## ## Call:## ranger(survived ~ ., data = t1, probability = TRUE) ## ## Type: Probability estimation ## Number of trees: 500 ## Sample size: 1309 ## Number of independent variables: 5 ## Mtry: 2 ## Target node size: 10 ## Variable importance mode: none ## Splitrule: gini ## OOB prediction error (Brier s.): 0.1337358局部诠释
为了证实如何最轻视地使用Shapley值来量化特征孝敬,咱们需要一个新的不雅测值来展望。底下咱们将为新建一个不雅测值,给这个不雅测取个名字叫jack.dawson:
jack.dawson <- data.frame( #survived = 0L, # in case you haven't seen the movie pclass = 3L, # third-class passenger age = 20.0, # twenty years old sex = factor("male", levels = c("female", "male")), # male sibsp = 0L, # no siblings/spouses aboard parch = 0L # no parents/children aboard)
使用fastshap进行模子诠释和DALEX同样,领先亦然需要建树一个诠释器,用来剖析模子和数据的多样信息。
在DALEX中,展望函数默许会从模子对象中索要(默许使用predict()),关联词在fastshap中需要咱们自界说展望函数,用于平直复返数值(回顾任务)粗略类别概率(分类任务)。
# 自界说展望函数pfun <- function(object, newdata) { # prediction wrapper unname(predict(object, data = newdata)$predictions[, "yes"])}# 贪图Jack's的糊口概率(jack.prob <- pfun(rfo, newdata = jack.dawson))## [1] 0.1314723
要是平直使用以下代码得到的并不是类别概率:
predict(rfo, jack.dawson)## Ranger prediction## ## Type: Probability estimation ## Sample size: 1 ## Number of independent variables: 5
用这个函数不错得到悉数t1不雅测的平均糊口概率:
# 贪图悉数东说念主的平均糊口概率(baseline <- mean(pfun(rfo, newdata = t1))) ## [1] 0.3821045
# Difference between Jack and average(difference <- jack.prob - baseline)## [1] -0.2506322
不错发现Jack的糊口可能性低于平均值。底下咱们就使用SHAP来诠释为什么会这么。
底下就不错建树诠释器了,和DALEX同样,亦然使用explain()函数,亦然需要提供只含展望变量的数据框:
X <- subset(t1, select = -survived) # 只含展望变量set.seed(2113)# 建树诠释器(ex.jack <- explain(rfo, X = X, pred_wrapper = pfun, newdata = jack.dawson))## pclass age sex sibsp parch## [1,] 0 -0.005012306 0 0.02174902 0## attr(,"baseline")## [1] 0## attr(,"class")## [1] "explain" "matrix" "array"
fastshap包使用高效版块的蒙特卡洛(Monte-Carlo,MC)算法。因此,为了沉稳性和准确性,应屡次贪图特征孝敬,并将恶果取平均值。为此,软件开发价格是多少只需将nsim参数设立为一个相比大的值即可(默许是1)。底下咱们贪图Jack的1000个基于Shapley的特征孝敬,并取得平均恶果:
最近100期开奖中,含有重号的奖号有64期,最近20期含有重号的奖号有12期,最近10期含有重号的奖号有5期。本期注意重号落号。
福彩3D第2024181奖号230,重号未落号。在最近100期(第2024082期-2024181期)中,重号落号64期;最近20期重号落号概率为60%;最近10期重号落号概率为50%。本期防重号中号码轮空。
set.seed(2129) (ex.jack <- explain(rfo, X = X, pred_wrapper = pfun, newdata = jack.dawson, nsim = 1000))## pclass age sex sibsp parch## [1,] -0.07554003 -0.01240914 -0.1414107 0.001836116 -0.01103988## attr(,"baseline")## [1] 0## attr(,"class")## [1] "explain" "matrix" "array"
fastshap使用的MC规范贪图的Shapley值的加和不会就是相应展望和基线(即平均展望值)之间的差值。关联词借用Python的shap库的技艺,咱们不错使用基于回顾的调养来纠正总数。为此,只需在调用explain()中设立为adjust = TRUE:
set.seed(2133) (ex.jack.adj <- explain(rfo, X = X, pred_wrapper = pfun, newdata = jack.dawson, nsim = 1000, adjust = TRUE))## pclass age sex sibsp parch## [1,] -0.0697378 -0.02354202 -0.1485205 0.003980237 -0.01281207## attr(,"baseline")## [1] 0.3821045## attr(,"class")## [1] "explain" "matrix" "array"
这个恶果的加和与difference是不同样的:
sum(ex.jack.adj) # 和jack.prob - baseline的恶果不同样哦## [1] -0.2506322
构建好诠释器之后,就不错使用shapviz包进行可视化了。
咱们先创建一个轻视的瀑布图来可视化这几个特征是如何让Jack的展望糊口概率较低的:
library(shapviz)shv <- shapviz(ex.jack.adj, X = jack.dawson, baseline = baseline)sv_waterfall(shv)
图片
较着,Jack是又名男性三等舱乘客,这两个变量对他的较低糊口概率孝敬最大。
然后是瀑布图的另一种形式:
sv_force(shv)
图片
从图形默契方面来看,这个图固然和瀑布图抒发的原理完全同样,关联词不如瀑布图读起来轻视。
全局诠释SHAP除了用于局部诠释外,还不错用于全局诠释。
要是对数据鸠合悉数的不雅测皆进行一遍SHAP诠释,然后团聚它们的恶果,就不错得到全局的SHAP诠释。这个规范和CP团聚成为PDP的规范至极类似。
小程序开发底下的代码使用1000次MC类似贪图磨练数据中每个乘客的Shapley诠释,并将生成的矩阵强制调度为tibble(以便更好地打印)。设立shap_only=FALSE不错苟简shapviz使用。
这个进程很慢哈~
set.seed(2224) ex.t1 <- explain(rfo, X = X, pred_wrapper = pfun, nsim = 100, adjust = TRUE, shap_only = FALSE)tibble::as_tibble(ex.t1$shapley_values)## # A tibble: 1,309 × 5## pclass age sex sibsp parch## <dbl> <dbl> <dbl> <dbl> <dbl>## 1 0.228 0.00994 0.312 0.0208 -0.00916## 2 0.138 0.331 -0.0717 0.0113 0.0712 ## 3 0.156 0.0213 0.116 -0.0240 -0.0189 ## 4 0.212 -0.0212 -0.183 0.0171 0.00782## 5 0.201 -0.0308 0.282 -0.0149 -0.0369 ## 6 0.168 -0.0393 -0.199 -0.000779 -0.00240## 7 0.177 -0.127 0.346 -0.00829 0.00371## 8 0.153 -0.0644 -0.186 -0.00392 -0.00976## 9 0.234 0.00345 0.296 0.0398 0.00432## 10 0.106 -0.115 -0.212 0.000223 -0.00402## # ℹ 1,299 more rows
可视化全局变量进攻性(防范和基于重排的变量进攻性辞别),这个其实是各个变量的多个Shapley值完全值的平均值:
shv.global <- shapviz(ex.t1)sv_importance(shv)
图片
变量进攻性图的另一种浮现形式,蜂窝图,在Python中被称为shap summary plot:
sv_importance(shv.global, kind = "beeswarm")
图片
变量依赖图,类似于部分依赖图。在这里,咱们将望望特征孝敬age对其输入值的依赖性:
sv_dependence(shv.global, v = "age")
图片
其他可视化函数可参考对于shapviz的推文:R谈话shapviz可视化SHAP
要是你的数据量很大软件开发价格是多少,fastshap还撑捏使用并行化,借助doParallel包即可末端,各人我方尝试下即可。
本站仅提供存储工作,悉数实质均由用户发布,如发现存害或侵权实质,请点击举报。