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

R语言iml包机器学习可解释教程运行报错问题咨询

iml包FeatureImp计算时报undefined columns selected错误解决

问题复现

运行iml包机器学习模型解释相关教程时,已通过加载modeldata包内置attrition数据集的方式,修复了预处理阶段'attrition' is not an exported object from 'namespace:rsample'的报错,数据预处理、模型训练流程可正常运行。
后续在全局解释模块计算特征重要性时,调用FeatureImp$new()方法、指定损失指标为"mse",尝试为训练好的glm、随机森林、gbm三个模型分别构建特征重要性对象,三次执行均返回相同报错:

Error in [.data.frame(prediction, , self$class, drop = FALSE) : undefined columns selected

运行环境为R 4.2.0、Windows 10。

报错原因

该报错和操作系统、R 4.2.0版本无直接关联,核心是参数配置不匹配任务类型:

  • 当前任务是基于attrition数据集的员工离职二分类任务,错误使用了回归任务专属的mse(均方误差)作为特征重要性的计算损失。iml在mse损失逻辑下会默认寻找模型输出的单列连续预测值,但分类模型默认返回的是多列概率矩阵(每个类别对应一列概率值),格式不匹配导致无法选中对应列。
  • 初始化Predictor对象、调用FeatureImp$new()时,未显式指定分类任务需要解释的目标类别,iml无法从多列概率输出中定位要计算损失的目标列。

解决方案

按以下步骤调整代码即可修复:

  • 匹配任务与损失指标
    分类任务弃用mse损失,替换为分类场景适配的损失指标:二分类/多分类优先用"ce"(交叉熵损失),二分类场景如果关注排序能力也可使用"auc"作为损失。
  • 显式声明分类任务相关参数
    构建Predictor对象时必须显式传入标签列,确保标签为因子类型且和模型训练时的标签层级完全一致;调用FeatureImp$new()时通过class参数明确指定要解释的目标类别(即你关注的正类标签值,比如attrition数据集中代表离职的"Yes")。
    参考正确代码示例:
    # 确保标签为因子类型,和建模时的类型、层级保持一致
    attrition$Attrition <- as.factor(attrition$Attrition)
    
    # 以随机森林模型为例构建Predictor对象,glm、gbm模型写法一致
    library(iml)
    predictor.rf <- Predictor$new(
      model = rf_model, # 替换为你训练好的模型对象
      data = attrition[, setdiff(names(attrition), "Attrition")], # 输入特征列,不含标签
      y = attrition$Attrition, # 显式传入标签列
      # 分类任务显式定义预测函数,返回各分类的概率矩阵,列名与标签层级对应
      predict.fun = function(model, newdata) {
        predict(model, newdata, type = "prob")
      }
    )
    
    # 构建特征重要性对象
    imp.rf <- FeatureImp$new(
      predictor = predictor.rf,
      loss = "ce", # 分类任务用交叉熵损失
      class = "Yes", # 替换为你自己任务中的正类标签值
      compare = "difference"
    )
    
  • 兼容性排查
    如果调整上述参数后仍报错,检查iml包版本,升级到0.9.0及以上版本即可,旧版本iml对caret、tidymodels框架训练的分类模型的预测输出存在兼容性bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:57:14