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

使用R语言iml包结合H2O提取变量重要性时遇列选择错误的解决方法

解决iml包FeatureImp报错"undefined columns selected"的问题

这个错误的根源是你在初始化Predictor对象时参数用错了——你把class参数当成了任务类型的标识,但实际上iml里的class参数是用来指定分类任务中你要聚焦的具体类别,而任务类型应该用type参数来声明。

你的代码里设置了class = "classification",这会让iml试图在预测结果中去寻找名为"classification"的列,但你的pred函数返回的是单个概率向量(转成data.frame后列名是默认的,比如x),自然找不到这个列,就抛出了"undefined columns selected"的错误。

修正步骤:

  1. 修正Predictor的初始化参数:

    • 用type = "classification"来指定任务是分类任务;
    • 用class = "1"(或者你关注的类别索引/名称)来指定要解释的类别(这里你的Attrition中"1"代表离职,也就是你要预测的正类)。
  2. 确认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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:58:12