class: center, middle, inverse, title-slide # Introdução ao Machine Learning com R ## Dataprep e Workflows ###
### julho de 2020 --- # Conteúdo - recipes (recipe -> prep -> bake/juice) - Principais problemas na variável resposta e nas features - features categóricas - encoding (one-hot, dummy, etc) - transformar em número se ordinal - multicolinearidade - vars constantes - alta cardinalidade (muitas categorias) - categorias pouco frequentes (step_other) - escala - assimetria - valores faltantes - valores novos - workflow --- # Recipes Todos os modelos, de uma forma ou de outra, representam interpretações possíveis da relação entre Uma matriz `\(X\)` de variáveis independentes e a coluna `\(Y\)` de variáveis independentes. Muitas vezes os dados brutos precisam passar por várias transformações até chegar na matrix `\(X\)`. Por exemplo, é conveniente tratar os valores omissos. O pacote `recipes` fornece uma maneira de organizar essa transformação dos dados brutos. ```r library(recipes) receita <- recipes(resposta ~ variavel_dependente1 + variavel_dependente2, data = dados_brutos) %>% step_naomit() ``` Podemos selecionar as variávels nas quais queremos mexer escrevendo os nomes delas ou usando as funções `all_numeric()`, `all_nominal()`, `all_predictors()`, `àll_outcomes()`, entre outras. Você pode ver o resultado com `receita %>% prep() %>% juice()`. --- # prep(), bake() e juice() --- # Valores omissos .pull-left[ **o que é: ** valores omissos são céluals preenchidas com NA. A menos que você tenha um jeito pré-definido de como tratar esse caso, muitas vezes o melhor é removê-los. **por que fazer**: 1) para que o motor de regressão não faça isso sozinho sem te avisar; 2) para que a variável resposta não entre como vazia. ] .pull-right[ **step**: `step_naomit()` ] --- # Valores omissos .pull-left[ **o que é: ** valores omissos são céluals preenchidas com NA. Se você quiser, pode trocar os NAs de uma coluna números pelo seu valor médio ou mediano. **por que fazer**: 1) para que os NAs não diminuam muito a sua amostra. 2) para não perder informação de outras colunas. 3) para identificar padrão nos valores omissos. ] .pull-right[ **step**: `step_medianimpute()`, `step_meanimpute()`, `step_unknown()` ] --- # Normalização .pull-left[ **o que é: ** é a transformação da variável para ter média próxima de zero e dispersão próxima de 1. **por que fazer**: 1) para penalização LASSO funcionar; 2) para evitar problemas numéricos; ] .pull-right[ **step**: `step_center()`, `step_scale()` ] --- # Simetrização .pull-left[ **o que é: ** é a transformação da variável para ter forma aproximadamente simétrica. **por que fazer**: 1) para a estabilidade dos modelos lineares; 2) menos peso para valores aberrantes (pontos de alavanca); 3) variável resposta precisa ser simétrica para a loss `rmse` não priorizar valores aberrantes. ] .pull-right[ **step**: `step_YeoJohnson()`, `step_BoxCox()`, `step_log()` ] --- # Multicolinearidade .pull-left[ **o que é: ** variáveis que são muito similares confundem os modelos. Uma variável "atrapalha" a outra. Em regressão os \beta's se dividem entre as variáveis correlacionadas. **por que fazer**: 1) para evitar modelos que com redundâncias; 2) para evitar problemas numéricos ] .pull-right[ **step**: `step_corr()`, `step_lincomb()` ] --- # Categorias novas .pull-left[ **o que é: ** são categorias que não estavam presente na hora do ajuste do modelo. **por que fazer**: 1) para o modelo não se negar a criar predições; ] .pull-right[ **step**: `step_novel()` ] --- # Categorias raras .pull-left[ **o que é: ** são categorias com baixa frequência na hora do ajuste do modelo. **por que fazer**: 1) para evitar criar colunas com pouca informação (overfitting); 2) para não haver problemas no momento da validação cruzada; ] .pull-right[ **step**: `step_other()`, `step_nzv()`, `step_zv()` ] --- # Dummy .pull-left[ **o que é: ** Muitos modelos só sabem lidar com números. Categorias precisam virar números, explicitamente ou por trás dos panos. Uma variável binária do tipo "Sim" ou "Não"; "A" ou "B" etc precisa virar uma coluna 1 ou 0. **por que fazer**: 1) para ter mais clareza sobre o passo a passo da modelagem; 2) porque alguns modelos só trabalham dessa forma; ] .pull-right[ **step**: `step_dummy()` ] --- # One-hot .pull-left[ **o que é: ** Muitos modelos só sabem lidar com números. Categorias precisam virar números, explicitamente ou por trás dos panos. Uma variável categorizada do tipo "Sim", "Não" ou "Talvez"; "A", "B" ou "C" etc precisa virar duas ou mais colunas de 1 e 0. **por que fazer**: 1) para ter mais clareza sobre o passo a passo da modelagem; 2) porque alguns modelos só trabalham dessa forma; ] .pull-right[ **step**: `step_dummy()` <img src="static/img/one-hot-encoding.png" width="1352" /> ] --- # Workflow <img src="static/img/workflow.png" width="700" /> --- # Workflow Workflows resumem várias etapas em um único código, tornando mais simples ajustar, reajustar e colocar modelos em produção. ```r preparacao <- recipe(resposta ~ explicativa, data = dados_brutos) %>% step_naomit() %>% step_scale(all_numeric()) modelo_linear <- logistic_reg() fluxo_modelagem <- workflow() %>% add_recipe(preparacao) %>% add_model(modelo_linear) fit(fluxo_modelagem, dados_brutos) ```