R直觉中的'lime'包

时间:2018-04-07 19:14:00

标签: r xgboost lime

我将通过示例(下面):这是一个二进制分类示例。我想确保我的一些直觉在这里是正确的,因为没有太多关于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对应01

在示例here中,作者为malignant讨论了benignlabels。但是当我在我自己的分类问题上运行代码时(我确保在我为0 绘制的数据中有1plot_features(explanation)个观察结果,但labels与观察结果的真实值不符......

对于我自己的问题,我有以下plot;

我设置n_labels = 1(此图与上面的代码不同(但仍然是分类问题))。

case 2 labels header 1 true 1 0 1 0 1 0的结果是case 1 - 我可以假设是二元分类预测吗?但是,当我输出二进制输出的实际0结果时,我有以下1我正在阅读该模型预测case 2被归类为1并且实际上事实上它是0case 3预测是0,实际上是1case 4预计是0和事实上它是0xgb预计是0,它实际上是importance score等......这是不正确的?顺便说一下,我使用Understading lime模型进行预测。

其次;图中的所有{{1}}个案例(例如案例1,3,4,5,6)都具有相似的特征......而案例2则不同,它有其他影响模型的变量/特征(仅限I)从模型中绘制4个变量(我不知道它们是随机绘制还是由某些{{1}}绘制而来)。

我引用{{1}} here

中的分析结果
  

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

如果有人可以给我一些关于上述情节的直觉/分析,那么对我来说这将是朝着正确方向迈出的一大步。

1 个答案:

答案 0 :(得分:0)

为了获得对该方法及其解释的一些直觉,我写了一篇博客文章,其中我使用类似的方法(带有完整的文档代码)重建LIME:Explainable AI (XAI)… Explained! Or: How to whiten any Black Box with LIME

要点是:

[LIME]在演算方面与之相当:如果放大得足够深, 可以构建线性构建之外的大多数(甚至非常复杂的)函数 块。这就是LIME的基本功能!

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