使用R语言iml包结合H2O提取变量重要性时遇列选择错误的解决方法
解决iml包FeatureImp报错"undefined columns selected"的问题
这个错误的根源是你在初始化Predictor对象时参数用错了——你把class参数当成了任务类型的标识,但实际上iml里的class参数是用来指定分类任务中你要聚焦的具体类别,而任务类型应该用type参数来声明。
你的代码里设置了class = "classification",这会让iml试图在预测结果中去寻找名为"classification"的列,但你的pred函数返回的是单个概率向量(转成data.frame后列名是默认的,比如x),自然找不到这个列,就抛出了"undefined columns selected"的错误。
修正步骤:
修正
Predictor的初始化参数:- 用
type = "classification"来指定任务是分类任务; - 用
class = "1"(或者你关注的类别索引/名称)来指定要解释的类别(这里你的Attrition中"1"代表离职,也就是你要预测的正类)。
- 用
确认
pred函数的返回值:
你的pred函数返回的是类别"1"的概率(h2o.predict结果的第3列,也就是p1),和class = "1"的设置完全匹配,这部分不需要修改。
修正后的关键代码片段:
# 修正后的Predictor初始化 predictor.glm <- Predictor$new( model = glm, data = features, y = response, predict.fun = pred, type = "classification", # 指定任务类型为分类 class = "1" # 指定我们关注的类别是"1"(离职) ) # 现在再运行FeatureImp就正常了 imp.glm <- FeatureImp$new(predictor.glm, loss = "mse")
额外说明:
如果你不想指定class参数,也可以让iml自动选择第一个类别,但为了代码的可读性和明确性,显式指定仍然是更稳妥的做法。另外,如果你想让pred函数返回所有类别的概率(比如同时返回p0和p1),可以修改pred函数为:
pred <- function(model, newdata) { results <- as.data.frame(h2o.predict(model, as.h2o(newdata))) return(results[, c("p0", "p1")]) # 返回两个类别的概率 }
这种情况下,iml可以自动识别分类任务,甚至可以省略type参数,但显式指定任务类型依然是好习惯。
内容的提问来源于stack exchange,提问作者Blg Khalil
相关产品推荐
相关产品推荐

