蘑菇仙人 2024-04-20 12:17 采纳率: 96%
浏览 43
已结题

Error in { : task 1 failed - "设定的变量 类别同拟合的类别不相符"

 
shap <- explain(rf1J35J,X=deridata1J35J[c(1:33)],nsim=10,
                pred_wrapper = function(model,newdata){
                  predict(model, newdata = newdata, type = "prob")
                })
出错,Error in { : task 1 failed - "'x'必需为数值"。
将分类变量转数值
deridata1J35J[, "种族5"] <- as.numeric(as.character(deridata1J35J[, "种族5"]))
deridata1J35J[, "慢性心衰1"] <- as.numeric(as.character(deridata1J35J[, "慢性心衰1"]))
deridata1J35J[, "CKD.egfr1.1"] <- as.numeric(as.character(deridata1J35J[, "CKD.egfr1.1"]))
deridata1J35J[, "脓毒血症1"] <- as.numeric(as.character(deridata1J35J[, "脓毒血症1"]))
deridata1J35J[, "医嘱_袢利尿剂_first1"] <- as.numeric(as.character(deridata1J35J[, "医嘱_袢利尿剂_first1"]))
deridata1J35J[, "医嘱_机械通气_first1"] <- as.numeric(as.character(deridata1J35J[, "医嘱_机械通气_first1"]))
deridata1J35J[, "医嘱_升压药_first1"] <- as.numeric(as.character(deridata1J35J[, "医嘱_升压药_first1"]))
deridata1J35J[, "医嘱_万古霉素_first1"] <- as.numeric(as.character(deridata1J35J[, "医嘱_万古霉素_first1"]))

> shap <- explain(rf1J35J,X=deridata1J35J,nsim=10,
+                 pred_wrapper = function(model,newdata){
+                   predict(model, newdata = newdata, type = "prob")
+                 })
Error in { : 
  task 1 failed - "设定的变量‘种族5’, ‘慢性心衰1’, ‘CKD.egfr1.1’, ‘脓毒血症1’, ‘医嘱_袢利尿剂_first1’, ‘医嘱_机械通气_first1’, ‘医嘱_升压药_first1’, ‘医嘱_万古霉素_first1’的类别同拟合的类别不相符"

请问怎么解决呢?

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-20 12:18
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在尝试使用SHAP(SHapley Additive exPlanations)包来解释随机森林模型(rf1J35J)的预测结果。在R语言中,SHAP包可能对数据类型有特定的要求。根据错误信息,“设定的变量……的类别同拟合的类别不相符”,这通常意味着你的数据中有某些列在转换成数值后,与训练模型时的数据类型不匹配。

    首先,你需要确保所有处理过的分类变量在转换为数值后,它们的编码方式与训练模型时使用的编码方式一致。在你的例子中,你已经将一些列从字符转换为了数值,但仍然出现了错误。这可能是由于这些列原本就应该是数值型的,或者是编码方式不对。

    为了进一步分析,我们需要知道原始数据中这些变量的类别是如何编码的。如果你能提供更多信息,例如原始数据集中这些特征的类别标签,我可以给出更具体的建议。另外,如果你不确定如何检查原始数据集中的变量类型,可以使用str()函数查看数据框的结构。

    如果原始数据中这些变量就是字符串表示的类别,那么在转换时应该保留因子(factor)类型,并且在预测函数中指定预测值的类型是因子。

    这是一个示例代码,展示了如何保留因子类型并进行预测:

    # 假设你的数据中,"种族5"是一个因子变量,其类别为c("A", "B", "C")
    deridata1J35J$种族5 <- factor(deridata1J35J$种族5, levels = c("A", "B", "C"))
    
    # 创建一个函数来预测因子变量的概率
    pred_wrapper_factor <- function(model, newdata) {
      # 使用type="response"是因为我们想要概率而非类别
      predict(model, newdata = newdata, type = "response")
    }
    
    # 尝试使用这个新的预测包装器
    shap <- explain(rf1J35J, X = deridata1J35J, nsim = 10, 
                     pred_wrapper = pred_wrapper_factor)
    

    在这个例子中,我们假设了"种族5"是一个具有三个类别的因素变量。请确保将这个示例中的"种族5"替换为你实际遇到问题的变量名,同时相应地设置因子的水平。

    如果问题依然存在,请提供更多关于原始数据的信息,以便我能给出更准确的建议。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月20日

悬赏问题

  • ¥15 C#i编程中so-ir-192编码的字符集转码UTF8问题
  • ¥15 51嵌入式入门按键小项目
  • ¥30 海外项目,如何降低Google Map接口费用?
  • ¥15 fluentmeshing
  • ¥15 手机/平板的浏览器里如何实现类似荧光笔的效果
  • ¥15 盘古气象大模型调用(python)
  • ¥15 传人记程序做的plc 485从机程序该如何写
  • ¥15 已知手指抓握过程中掌指关节、手指各关节和指尖每一帧的坐标,用贝塞尔曲线可以拟合手指抓握的运动轨迹吗?
  • ¥50 libwebsockets 如何添加其他socket事件回调
  • ¥50 实现画布拖拽算子排布,通过flink实现算子编排计算,请提供思路