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
尝试过的解决方案
- 局部修改:之前在部分案例中,通过对目标类别调用
make.names()修改Predictor$new的参数可以解决问题:
Pred <- Predictor$new(rf, data=df, class=make.names(ALE.ClassOfInterest))
但这个方法在上述示例中无效。
- 预转换水平:目前唯一可行的方案是在训练模型前,用
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
相关产品推荐
相关产品推荐

