在分类任务中解释 iml 的累积局部效应 (ALE) 值

Interpretation of iml's Accumulated Local Effect (ALE) values in a classification task

提问人:MarkH 提问时间:10/22/2023 最后编辑:dan1stMarkH 更新时间:11/11/2023 访问量:75

问:

我正在使用 R 中的包提供的 ALE 实现。这个包附有通常的文档一个小插图,甚至是一本非常好的iml

我研究了这三个方法,试图弄清楚分类任务中生成的ALE值的确切解释。我确实有一个高层次的理解,即:当从一个特征值移动到相邻的特征值时,增加ALE值意味着模型预测特定类别的概率增加了。

我无法弄清楚的是:不同情况下的确切 ALE 值是多少,它是使用从模型中提取的概率还是通过提取这些概率?我根据 iml 文档和插入符号文档将三种不同的分类模型混淆在一起:imltype

  1. 基于RF的RF,它不显式提取类概率caret
  2. 一个基于RF的RF,它显式提取类概率caret
  3. 基于 DTrpart

然后,我以两种方式绘制了它们:iml

  1. 使用 type=“prob”(根据文档,我可能应该为分类模型做些什么:“经典用例是说分类模型的 type=”prob“)iml
  2. 使用 type=“prob”,而是使用 “raw”(如果可能)或“class”

这给了我六个图(代码见下文),其中只有两个在质量和数量上是相同的(#3 和 #6),另一个至少在质量上是相同的 (#1),另外三个在质量上只是有点相似(#1、#2 和 #5):

ALE for Petal.Width

我了解到一个人不应该在一篇文章中提出多个问题,但这些问题是如此密切相关,以至于我觉得为每个问题创建一个单独的帖子会令人困惑。

  • #1 和 #2 是否只是由于两者的随机性而略有不同 RF 模型,但是我是否从基于的 RF 模型中提取概率真的对 ALE 没有作用?caretiml
  • 如果是,为什么 #4 和 #5 如此不同,因为它们也只是通过与 #1 和 #2 相同的两个射频模型的随机性而有所不同?
  • 为什么 #3 看起来与 #4 和 #6 相似,尽管一个是“prob”(可能是正确的),一个是“prob”类型,一个是“class”类型(两者都可能不正确)?type

y 轴上真正放的是什么?它如何取决于我是否通过以下方式提取概率?为什么“错误”并不总是有所作为?carettype

library(rpart)
library(caret)
library(iml)

data(iris)
TrainData <- iris[,1:4]
TrainClasses <- iris[,5]

## Train three different models
# RF w/o extracting probabilities
cntrl_noprobs<-trainControl(method = "oob", number=5, sampling="up", search="grid", verboseIter=TRUE, savePredictions=TRUE, classProbs=FALSE)
rf_noprobs <- caret::train(TrainData, TrainClasses, method="rf", ntree=100, metric="Kappa", trControl=cntrl_noprobs)
# RF w/ extracting probabilities
cntrl_probs<-trainControl(method = "oob", number=5, sampling="up", search="grid", verboseIter=TRUE, savePredictions=TRUE, classProbs=TRUE)
rf_probs <- caret::train(TrainData, TrainClasses, method="rf", ntree=100, metric="Kappa", trControl=cntrl_probs)
# DT
dt <- rpart(Species ~ ., data = iris)

## Create ALE plots with type="prob"
mod_rf_noprobs_prob <- Predictor$new(rf_noprobs, data = iris, type = "prob")
plot(FeatureEffect$new(mod_rf_noprobs_prob, feature = "Petal.Width")) + ggtitle("caret classProbs=FALSE | iml type=prob")
mod_rf_probs_prob <- Predictor$new(rf_probs, data = iris, type = "prob")
plot(FeatureEffect$new(mod_rf_probs_prob, feature = "Petal.Width")) + ggtitle("caret classProbs=TRUE | iml type=prob")
mod_dt_prob <- Predictor$new(dt, data = iris, type = "prob")
plot(FeatureEffect$new(mod_dt_prob, feature = "Petal.Width")) + ggtitle("rpart | iml type=prob")

## Create ALE plots with type="raw" or "class"
mod_rf_noprobs_raw <- Predictor$new(rf_noprobs, data = iris, type = "raw")
plot(FeatureEffect$new(mod_rf_noprobs_raw, feature = "Petal.Width")) + ggtitle("caret classProbs=FALSE | iml type=raw")
mod_rf_probs_raw <- Predictor$new(rf_probs, data = iris, type = "raw")
plot(FeatureEffect$new(mod_rf_probs_raw, feature = "Petal.Width")) + ggtitle("caret classProbs=TRUE | iml type=raw")
mod_dt_class <- Predictor$new(dt, data = iris, type = "class")
plot(FeatureEffect$new(mod_dt_class, feature = "Petal.Width")) + ggtitle("rpart | iml type=class")
R-CARET IML R-ALE

评论

0赞 Peter Mortensen 10/22/2023
Stack Overflow 不是一个论坛。这是一个问答网站(问答形式的知识(苏格拉底式))。甚至还有一个(金)徽章的名字: - “苏格拉底......在 100 个单独的合格日内提出一个广受好评的问题,并有积极的问题记录“
0赞 Tripartio 10/23/2023
我已尝试回答您发布的问题。但是,正如我在其他地方提到的,如果你真正感兴趣的是二元分类,你应该发布一个问题,并举个例子。它与多项式分类有很大不同,答案会大不相同(而且可能要简单得多)。
1赞 MarkH 10/23/2023
感谢您的提示,但我确实对多项式分类感兴趣
0赞 Tripartio 10/23/2023
“我了解到一个人不应该在一篇文章中提出多个问题,但这些问题是如此密切相关,以至于我觉得为每个问题创建一个单独的帖子会令人困惑。”你是完全正确的。这是每个帖子一个问题规则的可接受例外。

答:

1赞 Tripartio 10/23/2023 #1

在发表任何评论之前,请注意,对在整个数据集上训练的模型进行分析是无效的,因为除非模型被引导,否则它会大量过拟合。对于像虹膜这样的小型数据集,您应该执行完整的模型引导(我的啤酒包的小插图详细解释了这一点:https://cran.r-project.org/web/packages/ale/vignettes/ale-statistics.html)。但我会尝试将您显示的结果解释为有效(即使它们无效)。

我不是软件包或软件包的专家,所以我无法明确回答,但我可以尝试根据我对 ALE 和预测建模的一般知识来回答。我花了一些时间检查和比较这些图表,我在这里提供的是我有根据的猜测。caretiml

首先,你可以很容易地看到三个图中有两个不同的形状:1、2 和 5 具有相同的形状;和 3、4 和 6 具有相同的形状。

检查第 3-4-6 组,我可以清楚地看到发生了什么。在此组中,setosa 的 ALE 始终为 0。当 ALE 值都正好为 0 时,这始终意味着模型根本没有使用该值。(不是通过ALE,而是通过模型:ALE只描述一个模型,而不是直接描述数据。在此分析的上下文中,这意味着这些多项式分类模型将 setosa 设置为 0 作为基本参考组,并且这些模型的 versicolor 和 virginica 值是相对于 setosa 给出的。这等效于对类使用虚拟编码:对于 n 个类,将有 n - 1 个虚拟值,其中一个类被视为引用类。

相比之下,组 1-2-5 具有所有三个类的 ALE 值,这表明它为每个类提供了值。这相当于为类创建独热编码:对于 n 个类,将有 n 个二进制变量,每个类一个。因此,在这些模型中,每个虹膜类别都有自己独特的 ALE。

这意味着这两种不同的形状很可能在所有六个模型中代表相同的关系。唯一的区别是造成的失真,因为 1-2-5 组单独模拟每个类,而 3-4-6 组相对于 setosa 模拟 versicolor 和 virginica。

那么,为什么 3、4 和 6 使用虚拟编码,而 1、2 和 5 使用独热编码呢?我不确定,但这是一个猜测。据我所知,似乎当为 randomForest 对象请求概率 (caret type='rf') 时,将计算每个类的概率。第 1-2-5 组就是这种情况:

  • 图 1:概率来自“iml type=prob”。
  • 图 2:概率来自“插入符号 classProbs=TRUE”和“iml type=prob”。
  • 图 5:概率来自“插入符号 classProbs=TRUE”。

那么,我猜 rpart 的决策树总是使用虚拟编码,这就是为什么 3 和 6 看起来相同的原因。对于随机森林,只有图 4 根本没有可用的概率(“caret classProbs=FALSE” 和 “iml type=raw”),因此它默认为虚拟编码。

还有一个松散的结局:地块的不同规模。只有查看组内的规模才有意义。

对于 1-2-5 组,您应该了解,当您询问概率(无论是规范还是规范)时,您将得到 0 到 1 之间的概率。这与以下事实非常相似:当您请求类(使用规范)时,您将获得 1 响应 TRUE 和 0 响应 FALSE。使用 ALE 时,ALE 计算的平均等级最终将是所有 TRUE 和 FALSE 值的平均值,即 1 和 0 值的平均值。这些ALE平均值将与概率非常相似,尽管它们实际上不是一回事。因此,图 1 和图 2 本质上是一回事(允许随机变化):它们表示概率(“iml type=prob”),但图 5 是 1 和 0 原始类预测的平均值(“iml type=raw”)。carettrainControl(classProbs=TRUE)imlPredictor$new(type = "prob")imlPredictor$new(type = "raw")

对于 3-4-6 组,您有完全不同的模型。rpart 决策树(3 和 6)的图本质上是相同的,允许随机变化。但是,图 4 是一个随机森林;尽管它的形状相同,但它的预测却不同,因此规模不同也就不足为奇了。

我知道我的回答有很多不确定性,但我希望这是有道理的。

评论

1赞 MarkH 10/23/2023
超酷的答案@Tripartio,感谢您抽出宝贵时间!这对我来说确实很有意义,我想这意味着我实际上可以通过两种方式(通过 's 或通过 ')提取概率,并且在这两种情况下它们都用于 ALE 计算。感谢您的小插曲链接,我还没有找到这个但有趣的事实:我有一个类似于您effects_plot的想法,它将 ALE 的范围与一些重要指标相结合,缩写为“Pint of ALE”;-)caretclassProbsimltype