2

我正在浏览示例(如下):这是一个二元分类示例。我想确保我的一些直觉在这里是正确的,lime因为由于它相对较新,没有太多关于包的文档。

示例的输出

library(xgboost)
library(dplyr)
library(caret)
library(insuranceData) # example dataset https://cran.r-project.org/web/packages/insuranceData/insuranceData.pdf
library(lime) # Local Interpretable Model-Agnostic Explanations
set.seed(123)
data(dataCar)
mydb <- dataCar %>% select(clm, exposure, veh_value, veh_body,
                           veh_age, gender, area, agecat)

label_var <- "clm"  
offset_var <- "exposure"
feature_vars <- mydb %>% 
  select(-one_of(c(label_var, offset_var))) %>% 
  colnames()

#preparing data for xgboost (one hot encoding of categorical (factor) data
myformula <- paste0( "~", paste0( feature_vars, collapse = " + ") ) %>% as.formula()
dummyFier <- caret::dummyVars(myformula, data=mydb, fullRank = TRUE)
dummyVars.df <- predict(dummyFier,newdata = mydb)
mydb_dummy <- cbind(mydb %>% select(one_of(c(label_var, offset_var))), 
                    dummyVars.df)
rm(myformula, dummyFier, dummyVars.df)


feature_vars_dummy <-  mydb_dummy  %>% select(-one_of(c(label_var, offset_var))) %>% colnames()

xgbMatrix <- xgb.DMatrix(
  data = mydb_dummy %>% select(feature_vars_dummy) %>% as.matrix, 
  label = mydb_dummy %>% pull(label_var),
  missing = "NAN")


#model 2 : this works
myParam2 <- list(max.depth = 2,
                 eta = .01,
                 gamma = 0.001,
                 objective = 'binary:logistic',
                 eval_metric = "logloss")


booster2 <- xgb.train(
  params = myParam2, 
  data = xgbMatrix, 
  nround = 50)

explainer <- lime(mydb_dummy %>% select(feature_vars_dummy), 
                  model = booster2)

explanation <- explain(mydb_dummy %>% select(feature_vars_dummy) %>% head,
                       explainer,
                       n_labels = 2, ###### NOTE: I added this value, not sure if it should be '=1' or '=2' for binary classification.
                       n_features = 2)


plot_features(explanation)

上面的代码讨论了保险索赔,这是一个分类问题,索赔或不索赔。

问题:

的功能是什么n_labels- 我对自己的问题有一个二进制分类,所以n_lables对应于0and 1

在此处的示例中,作者谈到了malignant和。但是,当我在自己的分类问题上运行代码时(我确保在我绘制的数据中存在观察结果,但与观察结果的真实值不匹配......benignlabels01plot_features(explanation)labels

对于我自己的问题,我有以下内容阴谋

我设置n_labels = 1(这个情节与上面的代码不同(但仍然是一个分类问题))。

在这里,case 2我有labels header一个结果1——我可以假设是一个二元分类预测吗?然而,当我输出true二进制输出的实际结果时,我得到以下内容1 0 1 0 1 0,我正在阅读该模型预测的case 1分类为0,实际上它是一个1. case 2预测是 a 1,实际上是 a 0,预测是 a ,实际上是 a ,case 3预测是0a ,实际上是 a等等...这是不正确的吗?顺便说一句,我使用模型进行预测。1case 400xgb

第二; 图中的所有0案例(因此案例 1、3、4、5、6)都具有相似的特征......而案例 2 不同,它具有影响模型的其他变量/特征(我只绘制了来自模型(同样我不知道它们是随机绘制的还是由某些绘制的importance score))。

我从这里引用我的分析Understading lime

在本概述中,可以清楚地看到案例 195 和 416 的行为是如何相似的,而第三个良性案例 (7) 有一个不寻常的大裸核,这在不影响最终预测的情况下降低了其良性状态(表明其值其他功能正在弥补这个奇怪的功能)。毫不奇怪,很明显,测量中的高值表示恶性肿瘤。

如果有人能给我对上述情节的某种直觉/分析,那对我来说将是朝着正确方向迈出的一大步。

4

1 回答 1

0

为了获得对该方法及其解释的一些直觉,我写了一篇博客文章,在其中我用类似的方法(带有完整的文档代码)重建了 LIME:可解释的AI (XAI)……解释了!或者:如何用 LIME 美白任何黑匣子

要点是:

[LIME] 在微积分中有它的等价物:如果你放大到足够深,你可以用线性构建块构建大多数(甚至是非常复杂的)函数。这就是 LIME 的基本功能!

特征图的条形长度代表线性模型系数的大小!

于 2020-05-12T08:09:32.363 回答