程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用 caret 包 (varImp) 使用分类变量计算变量重要性时出错大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用 caret 包 (varImp) 使用分类变量计算变量重要性时出错?

开发过程中遇到使用 caret 包 (varImp) 使用分类变量计算变量重要性时出错的问题如何解决?下面主要结合日常开发的经验,给出你关于使用 caret 包 (varImp) 使用分类变量计算变量重要性时出错的解决方法建议,希望对你解决使用 caret 包 (varImp) 使用分类变量计算变量重要性时出错有所启发或帮助;

我一直在尝试使用 varImp 包中的 caret 函数计算具有混合尺度特征的模型的变量重要性。我尝试了多种方法,包括以数字方式重命名和编码我的关卡。在每种情况下,我都会收到以下错误:

Error in auc3_(actual,predicted,ranks) : 
  Not compatible with requested type: [type=character; target=double].

以下虚拟示例应说明我的观点(已编辑以反映@StupIDWolf 的更正):

library(caret)

#create small dummy dataset
set.seed(124)
dummy_data = data.frame(Label = factor(sample(c("a","b"),40,replace = TRUE)))
dummy_data$pred1 = ifelse(dummy_data$Label=="a",rnorm(40,-.5,2),.5,2))
dummy_data$pred2 = factor(ifelse(dummy_data$Label=="a",rbinom(40,1,0.3),0.7)))


# check varImp
control.lvq <- caret::trainControl(method="repeatedcv",number=10,repeats=3)
model.lvq <- caret::train(Label~.,data=dummy_data,method="lvq",preProcess="scale",trControl=control.lvq)
varImp.lvq <- caret::varImp(model.lvq,scale=FALSE)                       

使用不同模型(如 randomForest 和 SVM)时问题仍然存在。

如果有人知道解决方案或可以告诉我出了什么问题,我将不胜感激。

谢谢!

解决方法

当您在 lvq 上调用 varImp 时,它默认为 filterVarImp(),因为此模型没有特定的变量重要性。现在,如果您检查 help page:

对于两类问题,一系列的截止点被应用于 预测器数据来预测类别。敏感性和特异性 计算每个截止值并计算 ROC 曲线。

现在,如果您读取将数据输入 filterVarImp() 的 source code of varImp.train() ,它是原始数据帧,而不是预处理过程中产生的任何内容。

这意味着在原始数据中,如果你有一个变量是一个因子,它不能切割变量,它会抛出这样的错误:

filterVarImp(data.frame(dummy_data$pred2),dummy_data$Label)
Error in auc3_(actual,predicted,ranks) : 
  Not compatible with requested type: [type=character; target=double].

所以使用我的例子,就像你指出的那样,你需要对它进行一次热编码:

set.seed(111)
dummy_data = data.frame(Label = rep(c("a","b"),each=20))
dummy_data$pred1 = rnorm(40,rep(c(-0.5,0.5),each=20),2)
dummy_data$pred2 = rbinom(40,1,rep(c(0.3,0.7),each=20))
dummy_data$pred2 = factor(dummy_data$pred2)

control.lvq <- caret::trainControl(method="repeatedcv",number=10,repeats=3)

ohe_data = data.frame(
            Label = dummy_data$Label,model.matrix(Label ~ 0+.,data=dummy_data))

model.lvq <- caret::train(Label~.,data=ohe_data,method="lvq",preProcess="scale",trControl=control.lvq)

caret::varImp(model.lvq,scale=FALSE)  

ROC curve variable importance

       Importance
pred1      0.6575
pred20     0.6000
pred21     0.6000

如果您使用的模型没有特定的变量重要性方法,那么一种选择是您可以先计算变量重要性,然后再运行模型。

,

请注意,可以通过将序数特征(具有 d 个级别)替换为其 (d-1) 维指示符编码来规避此问题:

model.matrix(~dummy_data$pred2-1)[,1:(length(levels(dummy_data$pred2)-1)]

然而,为什么 varImp 不自动处理这个?此外,这有一个缺点,即它为每个 d-1 个指标产生一个重要性分数,而不是原始特征的一个统一重要性分数。

大佬总结

以上是大佬教程为你收集整理的使用 caret 包 (varImp) 使用分类变量计算变量重要性时出错全部内容,希望文章能够帮你解决使用 caret 包 (varImp) 使用分类变量计算变量重要性时出错所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: