R 的 iml 包如何处理语法无效的因子级别?

问题描述 投票:0回答:1

我正在使用

iml
包从经过
caret
训练的
rf
模型导出 ALE 值。在分类任务中,因变量的级别具有语法上无效的字符串值,这可能会导致问题,因为这些级别在预测过程中最终会成为列名称。

这是一个愚蠢的示例,它会在最后一行代码中抛出 undefined columns selected 错误:

# ----- Packages -----
library(randomForest)
library(caret)
library(iml)

# ----- Dummy Data -----
One <- as.factor(sample(c("1", "0"), size = 250, replace = TRUE))
Two <- as.factor(sample(make.names(c("1", "0")), size = 250, replace = TRUE))
Three <- as.factor(sample(c("A-1_x", "B-0_y", "1 C-$_3.5"), size = 250, replace = TRUE))
Four <- as.factor(sample(make.names(c("A-1_x", "B-0_y", "1 C-$_3.5")), size = 250, replace = TRUE))
df <- cbind.data.frame(One, Two, Three, Four)

# ----- Modelling + IML for syntactically invalid levels from "Three" -----
ALE.ClassOfInterest <- "1 C-$_3.5"
TrainData <- cbind.data.frame(One, Two, Four)
rf <- caret::train(TrainData, Three, method = "rf", tuneLength = 3, trControl = trainControl(method = "cv"))
Pred <- Predictor$new(rf, data=df, class=ALE.ClassOfInterest)
FE3 <- FeatureEffects$new(Pred, features=names(df), method="ale")$results

我有一些例子,其中一个非常简单的修改就达到了目的,只需在代码的倒数第二行中调用 make.names ,如下所示:

Pred <- Predictor$new(rf, data=df, class=make.names(ALE.ClassOfInterest))

但是,在上面的示例中,这没有帮助,我发现的唯一解决方案是在训练模型之前从一开始就使用

make.names
将所有级别转换为语法上有效的字符串(参见“四”列)。但是,出于各种原因,我想坚持使用原始字符串,并且我注意到其他同样无效的级别,如“0”、“1”(请参阅“一”列)不需要任何解决方法,并且这是可行的:

# ----- Modelling + IML for syntactically invalid levels from "One" -----
ALE.ClassOfInterest <- "1"
TrainData <- cbind.data.frame(Two, Three, Four)
rf <- caret::train(TrainData, One, method = "rf", tuneLength = 3, trControl = trainControl(method = "cv"))
Pred <- Predictor$new(rf, data=df, class=ALE.ClassOfInterest)
FE1 <- FeatureEffects$new(Pred, features=names(df), method="ale")$results

如果不是普通的

make.names
,有谁知道幕后发生了什么,或者可以提出一个解决方案,让我坚持模型中的原始因子水平?

谢谢,马克

r r-caret names iml
1个回答
0
投票

这似乎是包作者在问题 iml/195 中已发现的功能/错误。我对快速修复并不乐观,因为 that 问题是在 2022 年 7 月(撰写此答案时 20 个月前)发现的,而作者没有发表任何评论。 (R 函数的最后一次更改是在 2022 年 4 月,似乎没有得到太多更新。)

© www.soinside.com 2019 - 2024. All rights reserved.