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

h2o模型调用iml包出现兼容性问题的解决方案及示例求助

报错原因

iml包的FeatureImp模块处理分类任务时,会默认尝试从预测结果中匹配你指定类别的列名,你当前自定义的预测函数仅返回正类概率的向量,转换为数据框后列名与预期不匹配,因此触发“未定义列被选择”的报错。

解决方法

调整自定义预测函数的返回格式,同时修正Predictor的class参数与返回的列名对齐即可,修正后可正常运行的完整代码如下:

library(rsample)   # 数据拆分
library(ggplot2)   # 可视化扩展
library(dplyr)     # 数据转换
library(h2o)       # 机器学习建模
library(iml)       # 模型可解释性
library(modeldata) # 内置attrition数据集


# 初始化h2o会话
h2o.no_progress()
h2o.init()

# 加载分类数据集
data("attrition", package = "modeldata")
df <- attrition %>% 
  mutate_if(is.ordered, factor, ordered = FALSE) %>%
  mutate(Attrition = recode(Attrition, "Yes" = "1", "No" = "0") %>% factor(levels = c("1", "0")))

# 转换为h2o对象
df.h2o <- as.h2o(df)

# 拆分训练、验证、测试集
set.seed(123)
splits <- h2o.splitFrame(df.h2o, ratios = c(.7, .15), destination_frames = c("train","valid","test"))
names(splits) <- c("train","valid","test")

# 定义标签与特征列
y <- "Attrition"
x <- setdiff(names(df), y) 

# 训练弹性网络模型
glm <- h2o.glm(
  x = x, 
  y = y, 
  training_frame = splits$train,
  validation_frame = splits$valid,
  family = "binomial",
  seed = 123
)

# 1. 仅提取特征构成数据框
features <- as.data.frame(splits$valid) %>% select(-Attrition)

# 2. 提取真实标签向量
response <- as.numeric(as.vector(splits$valid$Attrition))

# 3. 调整自定义预测函数,返回带对应列名的正类概率结果
pred <- function(model, newdata)  {
  results <- as.data.frame(h2o.predict(model, as.h2o(newdata)))
  # 返回列名与正类标签对齐的数据框
  return(data.frame("1" = results[[3L]], check.names = FALSE))
}

# 创建predictor对象,class参数指定为正类的标签"1"
predictor.glm <- Predictor$new(
  model = glm, 
  data = features, 
  y = response, 
  predict.fun = pred,
  class = "1"
)

# 计算特征重要性,不再报错
imp.glm <- FeatureImp$new(predictor.glm, loss = "mse")

# 可直接查看特征重要性结果或绘图
print(imp.glm$results)
plot(imp.glm)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:24:03