You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言iml包处理语法无效因子水平的问题及方案咨询

分类任务中iml包计算ALE值的因子水平语法问题

我使用iml包从caret训练的随机森林(rf)模型中推导ALE值时,遇到了分类任务的特定问题:当因变量的因子水平包含语法无效的字符串时,会触发报错——原因是底层预测过程会将这些水平用作列名,进而引发索引错误。

错误复现代码

以下代码的最后一行会抛出undefined columns selected错误:

# ----- 加载包 -----
library(randomForest)
library(caret)
library(iml)

# ----- 构造模拟数据 -----
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)

# ----- 针对因子"Three"无效水平的建模+IML报错示例 -----
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

尝试过的解决方案

  1. 局部修改:之前在部分案例中,通过对目标类别调用make.names()修改Predictor$new的参数可以解决问题:
Pred <- Predictor$new(rf, data=df, class=make.names(ALE.ClassOfInterest))

但这个方法在上述示例中无效。

  1. 预转换水平:目前唯一可行的方案是在训练模型前,用make.names()将所有因子水平转换为语法有效的字符串(如示例中的Four列),但出于业务需求,我希望保留原始字符串。

另外发现一个特殊情况:像"0""1"这类同样语法无效的水平,无需任何变通就能正常运行,示例代码如下:

# ----- 针对因子"One"无效水平的建模+IML正常运行示例 -----
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()?
  • 有没有办法在保留模型原始因子水平的前提下,解决这个报错问题?

内容的提问来源于stack exchange,提问作者MarkH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 06:22:44