Estou encontrando um problema ao usar tidymodels com xgboost em um fluxo de trabalho. Após aplicar uma receita que inclui step_dummy()
converter variáveis categóricas em variáveis fictícias, recebo o seguinte erro ao tentar fazer previsões:
Error in `validate_column_names()`:
! The following required columns are missing: 'A', 'B', 'C', 'D'.
Aqui está uma versão simplificada do meu código:
library(tidymodels)
library(xgboost)
library(dplyr)
set.seed(123)
datensatz <- tibble(
outcome = rnorm(100, mean = 60, sd = 10),
A = factor(sample(c("h", "i", "j"), 100, replace = TRUE)),
B = factor(sample(c("e", "f", "g"), 100, replace = TRUE)),
C = factor(sample(1:3, 100, replace = TRUE)),
D = factor(sample(c("a", "b"), 100, replace = TRUE))
)
# splitting
data_split <- initial_split(datensatz, prop = 0.75)
train_data <- training(data_split)
test_data <- testing(data_split)
# Rezept
recipe_obj <- recipe(outcome ~ ., data = train_data) %>%
step_dummy(all_nominal(), -all_outcomes()) %>%
step_zv(all_predictors()) %>%
step_normalize(all_numeric_predictors())
prepared_recipe <- prep(recipe_obj)
test_data_prepared <- bake(prepared_recipe, new_data = test_data)
# XGBoost Modell Spezifikation
xgboost_spec <- boost_tree(
trees = 1000,
tree_depth = 6,
min_n = 10,
loss_reduction = 0.01,
sample_size = 0.8,
mtry = 0.8,
learn_rate = 0.01
) %>%
set_mode("regression") %>%
set_engine("xgboost", count = FALSE, colsample_bytree = 0.8)
# Workflow
workflow_obj <- workflow() %>%
add_recipe(recipe_obj) %>%
add_model(xgboost_spec)
# Modell trainieren
xgboost_fit <- fit(workflow_obj, data = train_data)
# Modellvorhersage auf den vorbereiteten Testdaten
predictions <- predict(xgboost_fit, new_data = test_data_prepared)
# Ergebnisse
predictions
# Error occurs here
Suspeito que o problema esteja relacionado ao fato de que step_dummy()
remove as colunas categóricas originais (A, B, C, D)
e as substitui por variáveis fictícias. No entanto, o fluxo de trabalho parece esperar as colunas originais ao fazer previsões.
Como posso resolver esse problema e garantir que a etapa de previsão use corretamente as variáveis fictícias criadas por step_dummy()
?
Informações adicionais:
I'm using the `xgboost engine` within the `tidymodels` framework.
The error message suggests that the workflow expects the original categorical variables, but these are no longer present after applying `step_dummy()`.
Se você estiver usando uma receita em um fluxo de trabalho, não precisará manualmente
prep()
ebake()
testar o conjunto de dados. Então você pode excluir as seguintes linhase prever com
predict(xgboost_fit, new_data = test_data)
em vez depredict(xgboost_fit, new_data = test_data_prepared)
Criado em 2024-08-30 com reprex v2.1.1