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
相关产品推荐
相关产品推荐

