Erro usando predict para xgboost

Olá pessoal!

Tenho uma dúvida que pode ser bastante básica, mas está me impedindo de avançar.
Fiz a tunagem dos parâmetros do XGBoost, porém, tenho dúvida como realizar previsões com novos dados a partir dele.

Por exemplo, fazendo:
predict(modelo_final, new_data = new_data_val, type = “prob”)

Acontece o erro:

Erro: Assigned data ifelse(is.na(new_data[[i]]), object$new_level, as.character(new_data[[i]])) must be compatible with existing data.
x Existing data has 16281 rows.
x Assigned data has 0 rows.
i Only vectors of size 1 are recycled.

Alguém já se deparou com esse tipo de erro?

Agradeço desde já.

segundo o erro " Assigned data has 0 rows." parece que o new_data_val tem zero linhas.
se for possível, construa um exemplinho minimal que reproduza o erro pra gente discutir melhor!

Oi Athos!
Minha primeira dúvida aqui, então vou tentar trazer mais informações, e me perdoe se não for muito claro.

Estou usando a base ‘adults’.

Criei minha recipe conforme o código abaixo:
adult_receita ← recipe(resposta ~ ., data = adult_train) %>%
step_rm(id, native_country) %>%
step_unknown(-all_numeric()) %>%
step_impute_mode(workclass, occupation) %>%
step_novel(all_nominal(), -all_outcomes()) %>%
step_log(all_numeric()) %>%
step_normalize(all_numeric()) %>%
step_zv(all_predictors()) %>%
step_dummy(all_nominal(), -all_outcomes())

Encontrei os hiperparâmetros:
adult_xgb_model ← boost_tree(
mtry = adult_select_best$mtry,
trees = adult_select_best$trees,
min_n = adult_select_best$min_n,
tree_depth = adult_select_best$tree_depth,
loss_reduction = adult_select_best$loss_reduction,
learn_rate = adult_select_best$learn_rate,
sample_size = adult_select_best$sample_size
) %>%
set_mode(“classification”) %>%
set_engine(“xgboost”)

O worflow está assim:
adult_wf ← workflow() %>%
add_model(adult_xgb_model) %>%
add_recipe(adult_receita)

adult_last_fit ← adult_wf %>%
last_fit(
split = adult_initial_split,
control = control_grid(save_pred = TRUE, verbose = FALSE, allow_par = TRUE),
metrics = metric_set(roc_auc)
)

Então finalizei o worflow:
adult_xgb_best_params ← select_best(adult_tune_grid, “roc_auc”)
adult_wf ← adult_wf %>% finalize_workflow(adult_xgb_best_params)

E construí o modelo final:
adult_modelo_final ← adult_wf %>% fit(adult)

Então, quis passar uma nova base de dados nesse modelo, chamada adult_val e deixar apenas o id e uma coluna com as probabilidades, conforme o código abaixo:

adult_val_sumbissao ← adult_val %>%
mutate(
more_than_50k = predict(adult_modelo_final, new_data = adult_val, type = “prob”)$.pred_>50K
) %>%
select(id, more_than_50k)

Então, o erro do post original acontece.

Conferi, mas o adult_val (chamei de new_data_val no post anterior) está completo com as 16281 linhas

Felipe, o objeto adult_val nao veio no código. Poderia passar a parte do código que gera o adult_val e o adult_train, por gentileza?

Athos,
Agradeço muito a disponibilidade, mas consegui resolver aqui.
Faltava apenas passar um skip = TRUE no step_unknown.

1 Curtida