No Hackeando o R de hoje, vamos continuar nossa exposição do pacote tidymodels, a partir daonde paramos no nosso post de semana passada. Para resumir, o método básico, chamado de workflow, depende apenas de uma receita, que descreve o processamento de dados, e um parsnip, que descreve o modelo que queremos utilizar e seus parâmetros.
Após realizarmos os passos acima, podemos tentar verificar a qualidade do nosso modelo através da reamostragem. Vamos começar com um exemplo da qualidade de imagens de células, do pacote modeldata. Os dados possuem uma classificação, que indica se a observação é boa ou ruim para o objetivo final do estudo. Como a amostra total é muito grande para ser classificada manualmente, nosso trabalho é montar um modelo que preveja corretamente a classificação a partir de variáveis mensuráveis, dada a amostra.
library(modeldata) library(tidymodels) data(cells)
Para iniciarmos, devemos separar nossa amostra em uma partição de treinamento e teste. Isso é feito facilmente pela função initial_split(). Note que removemos a coluna case, que não é interessante para nós, diretamente dentro da função, com linguagem do tidyverse. Ademais, o argumento strata é importante: como temos muito mais dados ruins do que bons, uma partição aleatória poderia conter dados ruins demais no treino ou no teste, dificultando a estimação. Ao utilizar o argumento, garantimos que ambas as partes possuam proporções 'razoáveis' de cada classe.
set.seed(123) cell_split <- initial_split(cells %>% select(-case), strata = class) cell_train <- training(cell_split) cell_test <- testing(cell_split)
Para a modelagem, faremos um modelo de random forest. Não entraremos nos detalhes de seu funcionamento, pois já falamos sobre esse modelo em um post mais antigo. Dentro do ambiente do tidymodels, podemos facilmente criar a random forest usando o pacote ranger:
rf_mod = rand_forest(trees = 1000) %>% set_engine("ranger") %>% set_mode("classification") rf_fit = rf_mod %>% fit(class ~ ., data = cell_train)
Após treinar o modelo, podemos testar ele com as funções do pacote yardstick. Abaixo, calculamos a acurácia das previsões:
rf_testing_pred = predict(rf_fit, cell_test) %>% bind_cols(predict(rf_fit, cell_test, type = "prob")) %>% bind_cols(cell_test %>% select(class)) rf_testing_pred %>% accuracy(truth = class, .pred_class)
Como podemos ver, o modelo é razoável, porém pode melhorar. Para isso, vamos utilizar a reamostragem, fazendo validação cruzada. O método é simples: criamos os folds, geramos um novo workflow, e o informamos que é para fazer o fit sobre cada um dos folds.
folds = vfold_cv(cell_train, v = 10) rf_wf = workflow() %>% add_model(rf_mod) %>% add_formula(class ~ .) rf_fit_rs = rf_wf %>% fit_resamples(folds)
Após isso, podemos utilizar a função collect_metrics() para verificar o resultado dos modelos sobre cada fold. O resultado mostra que nosso teste inicial acaba sendo sim um bom previsor.
collect_metrics(rf_fit_rs) .metric .estimator mean n std_err .config <chr> <chr> <dbl> <int> <dbl> <chr> 1 accuracy binary 0.833 10 0.00971 Preprocessor1_Model1 2 roc_auc binary 0.906 10 0.00901 Preprocessor1_Model1
________________________
(*) Para entender mais sobre a linguagem R e suas ferramentas, confira nosso Curso de Introdução ao R para análise de dados.