使用LIME探索模型

栏目: 编程工具 · 发布时间: 5年前

内容简介:编者按:模型的解释性对于模型的应用和可信,有着重要意义。同时,也可以让模型更透明,更公平,也更好地服务大众,以降低模型多带来的风险。如何对黑盒模型的解释性做探索和研究,本文的LIME方法在一定程度上可以发挥作用和达成目的。最近在工作中,我被要求帮助一些临床医生理解为什么我的风险模型将特定的病人分类为高风险。就在这项工作之前,我在华盛顿大学偶然发现了一些数据科学家的工作,他们叫lime。LIME代表模型无关的局部性可解释算法。我的想法是,通过在数据点附近的参数空间局部拟合一个线性(又名“可解释”)模型,我可

使用LIME探索模型

编者按:模型的解释性对于模型的应用和可信,有着重要意义。同时,也可以让模型更透明,更公平,也更好地服务大众,以降低模型多带来的风险。如何对黑盒模型的解释性做探索和研究,本文的LIME方法在一定程度上可以发挥作用和达成目的。

最近在工作中,我被要求帮助一些临床医生理解为什么我的风险模型将特定的病人分类为高风险。就在这项工作之前,我在华盛顿大学偶然发现了一些数据科学家的工作,他们叫lime。LIME代表模型无关的局部性可解释算法。我的想法是,通过在数据点附近的参数空间局部拟合一个线性(又名“可解释”)模型,我可以回答临床医生对特定患者提出的那些问题。我决定将lime作为一种解决方案,过去几个月我一直专注于为我的风险模型实现这个解释器。幸运的是,我还发现了一个R包,它实现了这个源自 python 的解决方案。

样本数据

因此本文的第一步是找到一些公共数据来说明。我记得 James, Witten, Hastie和Tibshirani在《统计学学习导论》 中举过一个例子。

我要用Heart.csv数据,可以通过以下链接下载:

library(readr)
library(ranger)
library(tidyverse)
library(lime)

dat <- read_csv("http://www-bcf.usc.edu/~gareth/ISL/Heart.csv")
dat$X1 <- NULL

现在让我们快速看一下数据:

Hmisc::describe(dat)

这个数据中的目标变量是AHD。这个标志标识病人是否患有冠状动脉疾病。如果我们能准确预测,临床医生可能会更好地治疗这些病人,并希望帮助他们避免类似胸痛或更严重的心脏病发作等AHD症状。

数据处理

对于预测模型,我选择使用ranger执行的随机森林模型,它并行化r中的随机森林算法。但是首先,一些数据清理是必要的。在替换缺失的值之后,我将把数据拆分为测试和训练数据框。

# Replace missing values
dat$Ca[is.na(dat$Ca)] <- -1
dat$Thal[is.na(dat$Thal)] <- "missing"

## 75% of the sample size
smp_size <- floor(0.75 * nrow(dat))

## set the seed to make your partition reproducible
set.seed(123)
train_ind <- sample(seq_len(nrow(dat)), size = smp_size)

train <- dat[train_ind, ]
test <- dat[-train_ind, ]

mod <- ranger(AHD~., data=train, probability = TRUE, importance = "permutation")

mod$prediction.error
## [1] 0.1326235

我们对OOB预测错误的快速粗略检查告诉我们,我们的模型在预测AHR方面表现良好。现在的问题是向我们的医生和护士描述为什么我们相信某人是AHR的高危人群。在学习lime之前,我可能会做一些类似于下面代码的事情,首先查看树中哪些变量最重要。

plot_importance <- function(mod){
  tmp <- mod$variable.importance
  dat <- data.frame(variable=names(tmp),importance=tmp)
  ggplot(dat, aes(x=reorder(variable,importance), y=importance))+ 
    geom_bar(stat="identity", position="dodge")+ coord_flip()+
    ylab("Variable Importance")+
    xlab("")
}

# Plot the variable importance
plot_importance(mod)

使用LIME探索模型

之后,我可能会看一些部分依赖图来了解这些重要的变量在这个变量范围内是如何变化的。然而,这种方法的缺点通常是我需要保持所有其他变量不变。如果我真的相信我的变量之间存在相互作用,那么当其他变量发生变化时,部分依赖图就会发生巨大的变化。

使用LIME解释模型

进入LIME。如上所述,LIME的整个目的是提供一个本地可解释的模型,以帮助我们理解,如果我们在许多排列中稍微调整其他变量,我们的预测将如何变化。在这种特殊情况下使用lime的第一步是添加一些函数,以便lime包知道如何处理ranger包的输出。一旦我有了这些,我就可以使用lime()和explain()函数的组合来得到我需要的东西。在所有多元线性模型中,我们仍然有一个问题…相关的解释变量。根据原始模型中变量的数量,我们可能需要将模型进行配对,只查看最“有影响力”或“重要”的变量。在使用岭回归或L2惩罚校正多共线性后,lime默认使用正向选择或选择系数较大的变量。如下所示,您还可以使用Lasso(即L1惩罚)选择解释的变量,或者使用“树”方法使用xgboost最重要的变量。

# Train LIME Explainer
expln <- lime(train, model = mod)


preds <- predict(mod,train,type = "response")
# Add ranger to LIME
predict_model.ranger <- function(x, newdata, type, ...) {
  res <- predict(x, data = newdata, ...)
  switch(
    type,
    raw = data.frame(Response = ifelse(res$predictions[,"Yes"] >= 0.5,"Yes","No"), stringsAsFactors = FALSE),
    prob = as.data.frame(res$predictions[,"Yes"], check.names = FALSE)
  )
}

model_type.ranger <- function(x, ...) 'classification'


reasons.forward <- explain(x=test[,names(test)!="AHD"], explainer=expln, n_labels = 1, n_features = 4)
reasons.ridge <- explain(x=test[,names(test)!="AHD"], explainer=expln, n_labels = 1, n_features = 4, feature_select = "highest_weights")
reasons.lasso <- explain(x=test[,names(test)!="AHD"], explainer=expln, n_labels = 1, n_features = 4, feature_select = "lasso_path")
reasons.tree <- explain(x=test[,names(test)!="AHD"], explainer=expln, n_labels = 1, n_features = 4, feature_select = "tree")

注意:使用当前版本的lime时,您可能会遇到feature_select = "lasso_path"选项的问题。要让上面的代码运行在上面,您可以在这里安装我的改进版lime。

绘制解释图

现在我们已经有了所有的解释,我最喜欢的lime包功能之一是plot_explain()函数。你可以很容易地为我们上面的每个选择方法显示最重要的变量,我们可以看到,在预测AHD的最具影响力的4个变量的选择中,它们都是非常一致的。

plot_explanations(reasons.forward)

使用LIME探索模型

plot_explanations(reasons.ridge)

使用LIME探索模型

plot_explanations(reasons.lasso)

使用LIME探索模型

plot_explanations(reasons.tree)

使用LIME探索模型

感谢您阅读关于lime的快速教程。我还想探讨这个包的更多内容。特别是它在图像和文本分类中的应用。

作者:Mark Nielsen 原文链接: https://www.nielsenmark.us/2018/11/09/exploring-models-with-lime/

版权声明: 作者保留权利。文章为作者独立观点,不代表数据人网立场。严禁修改,转载请注明原文链接:http://shujuren.org/article/783.html

数据人网: 数据人学习,交流和分享的平台,诚邀您创造和分享数据知识,共建和共享数据智库。


以上所述就是小编给大家介绍的《使用LIME探索模型》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript王者归来

JavaScript王者归来

月影 / 清华大学出版社 / 2008-7 / 86.00元

你手中的这本《JavaScript王者归来》不仅是一本传播知识的书,更是一本求道的书。 本书分为五个部分循序渐进地与读者讨论了JavaScript的方方面面,从简单的语言基础到丰富的实际应用再到深入剖析语言本质的高级话题,字里行间包含着作者多年工作中对JavaScript实践乃至程序设计思想的深入思考和总结。 本书揭开了JavaScript的面纱,绕过误解和虚幻的表象,引领你探索程序王......一起来看看 《JavaScript王者归来》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具