我想计算由 tidymodels 工作流程制成的模型的 FIRM 重要性分数。对于正则表达式,我将使用 iris 数据集并尝试预测观察结果是否为 setosa。
library(tidymodels)
library(readr)
library(vip)
#clean data
iris <- iris %>%
mutate(class = case_when(Species == 'setosa' ~ 'setosa',
TRUE ~ 'other'))
iris$class = as.factor(iris$class)
iris <- subset(iris, select = -c(Species))
#split data into training and testing
iris_split = initial_split(iris, prop = 0.8)
cv_splits = vfold_cv(training(iris_split), v = 5)
#preprocessing
iris_recipe = recipe(class ~., data = iris) %>%
step_center(Sepal.Length) %>%
prep()
#specify MARS model
model = rand_forest(
mode = "classification",
mtry = tune(),
trees = 50
) %>%
set_engine("ranger", importance = "impurity")
#tuning parameters
tuning_grid = grid_regular(mtry(range=c(1,4)), levels = 4)
iris_wkfl = workflow() %>%
add_recipe(iris_recipe) %>%
add_model(model)
iris_tune = tune_grid(iris_wkfl,
resamples = cv_splits,
grid = tuning_grid,
metrics = metric_set(accuracy))
best_params = iris_tune %>%
select_best(metric = "accuracy")
best_model = finalize_workflow(iris_wkfl, best_params) %>%
parsnip::fit(data = training(iris_split)) %>%
pull_workflow_fit()
vip(best_model, method = "firm")
最后一行从 pdp 包中产生错误。
get_training_data.default(object) 中的错误:无法从对象中提取训练数据。train
请使用调用中的参数提供原始训练数据partial
。
以下行正确吗?还是我需要先使用我的配方提供转换后的训练数据?我想确保 vip 在计算重要性分数时应用我的配方。我知道错误说“原始训练数据”,但我不确定 pdp 是否知道我的工作流程。
vip(best_model, method = "firm", train = training(iris_split))