如何在tidymodels中获取分类SVM的变量重要性图(VIP)
解决分类SVM模型VIP绘制的"estimate应该是数值向量"报错问题
错误原因
使用置换法(permute)计算变量重要性时,vip需要模型返回数值型的预测结果来计算roc_auc指标,但你的pred_wrapper返回的是分类标签(字符/因子类型),导致estimate变成字符向量,触发报错。
修正方案
修改pred_wrapper函数,让它返回模型预测的正类概率,而非类别标签。对于kernlab引擎的SVM分类模型,调用predict时指定type = "prob",提取正类(这里是"1")的概率值。同时需要在模型引擎设置中启用概率预测功能。
完整修正代码
library(vip) library(MASS) library(tidymodels) data(Boston, package = "MASS") # 创建分类结果变量 df <- Boston |> mutate(is_big = factor(if_else(medv > 22, 1, 0))) # 将数据划分为训练集和测试集 set.seed(7) splits <- initial_split(df) train <- training(splits) test <- testing(splits) # 用recipe进行预处理 rec <- recipe( formula = is_big ~ ., data = train ) svm_spec <- svm_rbf(margin = 0.0937, cost = 20, rbf_sigma = 0.0208) %>% set_engine("kernlab", prob.model = TRUE) %>% # 启用概率预测支持 set_mode("classification") # 整合到工作流 svr_fit <- workflow() %>% add_recipe(rec) %>% add_model(svm_spec) %>% fit(data = train) svr_fit %>% extract_fit_parsnip() %>% vip( method = "permute", nsim = 5, target = "is_big", metric = "roc_auc", event_level = "second", geom = "point", pred_wrapper = function(object, newdata) { # 返回正类"1"的预测概率,生成数值向量 kernlab::predict(object, newdata, type = "prob")[, "1"] }, train = train )
关键调整点
- 在
set_engine参数中添加prob.model = TRUE:让kernlab的SVM模型支持概率预测(默认不启用该功能)。 - 重写
pred_wrapper函数:调用predict时指定type = "prob",提取正类"1"对应的概率列,确保返回值为数值向量,满足roc_auc指标的计算要求。
内容的提问来源于stack exchange,提问作者itsMeInMiami
相关产品推荐
相关产品推荐

