我使用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,以便在训练模型之前将所有级别转换为语法有效的字符串(请参阅列"4").然而,出于各种原因,我想坚持使用原始字符串,并且我已经注意到,其他同样无效的级别,如"0"、"1"(请参阅列"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或可以建议一个解决方案,让我坚持在模型中的原始因素水平?

谢谢你马克

推荐答案

这似乎是包作者在第iml/195期中已经发现的一个特性/bug.我对快速解决方案不乐观,因为that问题是在2022年7月(20个月前写这个答案)确定的,没有作者的 comments .(R函数的最后一次更改是在2022年4月,它似乎没有得到太多更新.

R相关问答推荐

R的GG平行坐标图中的排序变量

从API中抓取R数据SON

带有叠加饼图系列的Highmap

为什么观察不会被无功值变化触发?

二维样条,严格以一个参数递增

par函数中的缩写,比如mgp,mar,mai是如何被破译的?

使用外部文件分配变量名及其值

计算满足R中条件的连续列

在ggplot2的框图中绘制所有级别的系数

使用Scale_*_MANUAL时在图例中保留未使用的系数级别

更改STAT_VALLES/STAT_PEAKS中的箭头线宽/大小

我是否可以使用多个变异项来构建顺序列(标记多个问题)

如何删除设置大小的曲线图并添加条形图顶部数字的百分比

将列的值乘以在不同数据集中找到的值

随机 Select 的非NA列的行均数

计算来自单独分组的分幅的值的百分位数

打印的.txt文件,将值显示为&Quot;Num&Quot;而不是值

在子图内和子图之间对齐行数不均匀的表格罗布对

如何根据每个子框架中分类因子的唯一计数来过滤子框架列表?

使用点图调整离散轴比例