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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:26:01