【问题标题】:'lime' package in R intuitionR直觉中的“石灰”包
【发布时间】:2018-09-17 13:26:03
【问题描述】:

我正在浏览示例(如下):这是一个二元分类示例。我想确保我的一些直觉在这里是正确的,因为没有太多关于 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 中,作者谈到malignantbenign 用于labels。但是,当我在自己的分类问题上运行代码时(我确保在为plot_features(explanation) 绘制的数据中存在01 观察结果,但labels 确实与观察结果的真实值不符...

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

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

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

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

我从Understading limehere引用我的分析

在本概述中,您可以清楚地看到案例 195 和 416 的行为方式有何相似之处, 而第三个良性病例(7)有一个不寻常的大裸核, 在不影响最终结果的情况下减损其良性状态 预测(表示它的其他特征的值是 弥补这个奇怪的)。毫不奇怪,很明显,高 测量值表示恶性肿瘤。

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

【问题讨论】:

  • 检查explain输出中的model_r2列,如果低,说明模型拟合不是很好。您可以尝试更改特征选择类型和内核宽度来改进它。如果它仍然很糟糕,那么石灰不是相关数据的正确选择。在运行xgboost 时,使用xgboostExplainer 可能会更好,因为它旨在提取构建的模型并解释其推理,而lime 构建它自己的模型,使其适用于许多建模技术,但肯定不如专用模型解释一下。
  • 感谢您的评论!我经历了许多使用 LIME 包的例子,model_r2 总是相当低......例如在这个链接中使用这个例子(business-science.io/business/2017/09/18/…model_r2 大约位于0.22,@ 987654369@, 0.24 用于一些变量。在我的数据集中,我获得了大约0.40R2。我目前没有更改功能选择或修改内核宽度(但我会这样做)。根据您的经验,什么是合适的model_r2
  • 我对石灰没有太多经验,我对示例有点搞砸了,在我正在研究的模型上尝试了它(也是 xgboost),我不满意只是因为类标签来自石灰与使用 xgboost 获得的预测不匹配(就像您的情况一样)。所以我决定使用xgboostExplainer,它可以很好地分解来自mlr 的预测和部分依赖图。
  • 如果我的回答有帮助,请考虑点赞并接受,谢谢。

标签: r xgboost lime


【解决方案1】:

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

重点是:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2018-12-28
    • 2014-10-11
    相关资源
    最近更新 更多