class: inverse, center, middle background-image: url(img/logo.png) background-position: 50% 15% background-size: 30% # <br><br> Machine Learning ### Workshop Ciência de Dados ### OOBr + Constat --- ### Sobre nós .pull-left[ <img src=img/perfil.png width="330"> <br><br><br>Contato:
<a href="mailto:elias.junior_@outlook.com">elias.junior_@outlook.com</a>
<a href="http://github.com/eliasrribeiro">@eliasrribeiro</a> ] .pull-right[ <img src=img/perfil2.png width="330"> <br><br><br>Contato:
<a href="mailto:samuel.martins7@hotmail.com">samuel.martins7@hotmail.com</a>
<a href="http://github.com/SammyMar">@SammyMar</a> ] --- class: middle ### Sobre o OOBr .pull-left[ - Plataforma interativa de **monitoramento**, **análises de dados públicos** (da saúde, socioeconômicos e ambientais) cientificamente embasadas e **disseminação de informações** relevantes na área da saúde materno-infantil. - Ser referência de informações acessíveis e confiáveis sobre saúde materno-infantil e ser um suporte importante para a tomada de decisões na área. - Equipe multidisciplinar da UFES, USP e FACENS. - Financiado pela Fundação Bill & Melinda Gates, CNPq e FAPES. ] .pull-right[ <img src="img/logo2.png" width="100%" style="display: block; margin: auto;" /> ] --- class: middle .pull-left[ ### Painéis OOBr <img src="img/paineis.png" width="100%" style="display: block; margin: auto;" /> ] .pull-right[ ### Livro e tutoriais OOBr <img src="img/tutoriais.png" width="100%" style="display: block; margin: auto;" /> ] .center[ ####
[https://observatorioobstetricobr.org](https://observatorioobstetricobr.org) ] --- class: inverse, middle ### Materiais de Referência .pull-left[ <a href = "https://web.stanford.edu/~hastie/ISLRv2_website.pdf"> <img src="static/img/islr.png" style=" display: block; margin-left: auto; margin-right: auto;"></img> </a> ] .pull-right[ <a href = "https://loja.curso-r.com/introduc-o-ao-machine-learning.html"> <img src="img/cursor.jpg" width = 80% style=" display: block; margin-left: auto; margin-right: auto;"></img> </a> ] --- class: inverse, middle ## Machine Learning --- class: middle ### Ciência de Dados <img src="img/Unicórnios-em-Data-Science (FONTE Ricardo Cappra e Gabriel Lages).png" width="60%" style="display: block; margin: auto;" /> Fonte : Ricardo Cappa e Gabriel Lages --- class: middle <img src="img/cliclo_dados.png" width="70%" style="display: block; margin: auto;" /> Fonte : Ciência de Dados na Educação Pública --- class: middle ### O que é Machine Learning ? - Criado em 1959, por Arthur Samuel - Aprendizado de Máquina - Conjunto de técnicas e estratégias para análise de dados que visa gerar estimativas mais precisas para uma quantidade ou fenômeno (Max Kuhn, 2014) --- class: middle <img src="img/machinelearning.png" width="90%" style="display: block; margin: auto;" /> Fonte : Ironhack Blog --- class: middle ### Exemplos de aplicação - Streamings (Netflix, Spotify, etc) - Bancos (Fraude, Crédito, etc) - Diagnóstico por pixels em uma imagem - Carro autônomo - Pesquisas --- class: inverse, middle ### Aprendizado Não Supervisionado vs Aprendizado Supervisionado --- class: middle .pull-left[ ### Supervisionado - Metodos de Classificação e Regressão; - O `\(\textit{Dataset }\)` é separado em treino e teste, onde o é feito o treinamento na base treino para posteriormente serem feitos os testes de predição e avaliação da qualidade do ajuste na base teste. ] .pull-right[ ### Não Supervisionado - Não ocorre o treinamento pela ausência da variável `\(\textit{target}\)`; - Busca de padrões ou grupos com características em comum. ] .center[ #### Qual abordagem usar então? ] --- class: middle ### Modelos não Supervisionados - Clusterização ou Agrupamentos: - Métodos hierárquicos; - Métodos por particionamento. .pull-left[ <img src=img/agrupamentos.png width="300"> ] .pull-right[ <img src=img/pca.png width="330"> ] --- class: middle ### Agrupamentos Partimos do pressuposto que existem grupos ou clusters, com base em critérios ou características, que dão origem ao conjunto de dados. Podemos separar em três principais métodos de separação desses clusters: - Métodos Hierárquicos: - Baseado na distância dos pontos entre si. - Métodos por Particionamentos: - Baseado na distância entre os pontos e os centróides --- class: middle ### Agrupamento hierárquico .center[ Agrupa os dados em grupos baseando-se na distância entre os pontos (Euclidiana por exemplo), até que observações mais próximas estejam alocadas em seus respectivos grupos. Inicialmente como entrada para algoritmos de agrupamento hierárquico, é realizada uma matriz de distâncias, ou dissimilaridade, com base na métrica de distância escolhida. ] .center[ .pull-left[ <img src=img/distancia_euclidiana.png width="500"> ] .pull-right[ <img src=img/manhattan.png width="270"> ] ] --- class: middle ### Agrupamento hierárquico Há duas abordagens para os agrupamentos hierárquicos, sendo elas: aglomerativa e divisiva. Sendo a aglomerativa mais difundida em virtude de seu custo computacional inferior. Os seguintes são métodos de abordagem aglomerativa: - Método dos vizinhos mais próximos; - Método dos vizinhos mais distantes; - Método da média das distâncias; - Método do centróide; - Método de Ward. --- class: middle ### Dendrograma .pull-left[De forma a facilitar a visualização da alocação dos dados em grupos faremos um dendrograma. Que nada mais é que um mapeamento de quais pontos estão mais próximos e quais não estão. Seguimos os seguintes passos: - Calcule as distâncias entre os pontos; - Una os pontos mais próximos; - Finalize quando todos os elementos estão contemplados e pertencem a algum grau de agrupamento.] .pull-right[ <img src=img/pontos.png width="950"> <img src=img/pontos2.png width="300"> ] --- class: middle ### Dendrograma Podemos usar como ponto de corte para número de clusters quando o 'salto' de uma coluna para outra nas colunas de distâncias é relativamente alto. .center[ .pull-left[ <img src="machine_learning_files/figure-html/unnamed-chunk-7-1.png" width="100%" /> ] .pull-right[ <img src="machine_learning_files/figure-html/unnamed-chunk-8-1.png" width="100%" /> ] ] --- class: middle #### O que deu errado? Possíveis fontes de variação: - Métrica de distância; - Regra de cálculo de distância entre dois grupos de pontos. É indicado testar diferentes interações para cada um dos parâmetros para visualizar como essas diferentes formas interferem nos resultados obtidos, como o parâmetro 'method'. Se trocarmos a distância para distância de Manhattan: <img src="machine_learning_files/figure-html/figures-side2-1.png" width="50%" /><img src="machine_learning_files/figure-html/figures-side2-2.png" width="50%" /> --- class: middle ### Métodos por Particionamento (K-means) K-means ou K-médias, são modelos que se baseiam na presença de centróides, repartindo o conjunto de dados em grupos, onde cada observação é agregada no cluster com centróide mais próximo. Os centróides são alocados de forma a minimizar a soma dos quadrados das distâncias entre os pontos e seus respectivos centros. Formalmente: Dado `\(\textbf{X} = (x_1,x_2,...,x_n)\)`, onde cada `\(x_i\)` é um vetor d-dimensional, e `\(k\)` equivalente ao número de grupos, sendo `\(\textbf{S} = \{S_1,S_2,...,S_k\}\)` cada um desses grupos, queremos: `$$\underset{S}{\textrm{arg min}}\sum^k_{i=1}\sum_{x \in S_i} || x -\mu_i||^2$$` <img src="machine_learning_files/figure-html/figures-side-1.png" width="50%" /><img src="machine_learning_files/figure-html/figures-side-2.png" width="50%" /> --- class: middle ### K-means E se usarmos outro tipo de dados? qual seria o resultado? Testaremos com um conjunto de dados gerado no R. .pull-left[ <img src="machine_learning_files/figure-html/unnamed-chunk-9-1.png" width="100%" /> ] . --- class: middle ### K-means E se usarmos outro tipo de dados? qual seria o resultado? Testaremos com um conjunto de dados gerado no R. .pull-left[ <img src="machine_learning_files/figure-html/unnamed-chunk-10-1.png" width="100%" /> ] .pull-right[ <img src="machine_learning_files/figure-html/unnamed-chunk-11-1.png" width="100%" /> ] --- class: middle #### o que deu errado? O k-means se baseia na distância dos pontos para com os centróides, logo, tipos de grupos como esses ele possui dificuldades para classificação, o melhor método no caso seria utilizar o modelo de classificação hierárquico. Veja como fica: .pull-left[ <img src="machine_learning_files/figure-html/unnamed-chunk-12-1.png" width="100%" /> ] .pull-right[ <img src="machine_learning_files/figure-html/unnamed-chunk-13-1.png" width="100%" /> ] --- class: inverse, middle # Aplicação dos Métodos de Agrupamento --- class: middle ### Objetivo Realizar análise de agrupamento dos municípios brasileiros com relação aos indicadores obstétricos (Ex: Porcentagem de Prematuridade, Porcentagem de Cesárea, etc.), avaliando os melhores indicadores para os agrupamentos e identificar os municípios que apresentam os piores e melhores índices. O exemplo em questão se trata do trabalho de conclusão de curso da aluna Mariana Machado, a qual fez parte do OObr. Os dados foram obtidos pela Plataforma de Ciência de Dados aplicada à Saúde (PCDaS) da Fundação Oswaldo Cruz (Fiocruz) do banco de dados SINASC do ano de 2019. No âmbito desse exemplo, utilizaremos apenas os métodos trabalhados no primeiro dia da oficina, e não todos os aplicados no trabalho fonte. Para visualização de todos os métodos, o trabalho se encontra disponível no site do OObr. [(link)](https://observatorioobstetricobr.org/publicacoes/trabalho-aprendizado-estatistico-nao-supervisionado-aplicado-aos-indicadores-obstetricos-dos-municipios-do-brasil/) --- class: middle ### Métodos Utilizados Agrupamentos por Particionamento: - K-médias (K-means) Agrupamentos Hierárquicos: - Média das Distâncias - Centróide - Vizinho Mais Distante - Vizinho Mais Próximo - Ward --- class: middle ### Indicadores Antes de realmente falarmos dos indicadores, temos que entender o conceito por trás deles: - Prematuridade: Parto com idade gestacional inferior a 37 semanas. - Gestação Múltipla: Gestação de dois ou mais fetos simultâneos. - Parto Cesárea: Parto onde extração do feto é por intervenção cirúrgica. - Consulta de Pré-Natal: Acompanhamento médico durante a gravidez. Ideal de 7 consultas durante o período pré-natal - Apgar: Escala proposta pela médica Virgínia Apgar que atribui pontuação a 5 sinais do recém-nascido (Frequência cardíaca, respiração, tônus muscular, irritabilidade reflexa e cor da pele). A escala varia de 0 a 10. Sendo feita no primeiro minuto após o nascimento (Apgar do primeiro minuto) e 5 minutos após(Apgar do quinto minuto). - Anomalia congênita: Alterações estruturais ou funcionais geradas na vida intrauterina. --- class: middle ### Indicadores Os indicadores são obtidos por percentual válido, de forma a desconsiderar os dados faltantes. Sendo eles: - Percentual válido de prematuridade - Percentual válido de gestações múltiplas - Percentual válido de partos cesáreas - Percentual válido de nascidos com nenhuma consulta pré-natal - Percentual válido de nascidos com 7 ou mais consultas de pré-natal - Percentual válido de Apgar do 1º minuto menor que 7 - Percentual válido de Apgar do 5º minuto menor que 7 - Percentual válido de nascidos com anomalia congênita - Percentual válido de nascidos com peso menor que 2500 gramas - Percentual válido de nascidos do sexo feminino --- class: middle ### Dados .center[ <img src=img/tabela3.png width="700"> ] --- class: middle, inverse #Agrupamentos --- class: middle ## Particionamento .center[ <img src=img/tabelakmedias.png width="700"> <img src=img/cotovelokmedias.png width="500"> ] --- class: middle ### Hierárquicos .center[ <img src=img/validacaohierarquico.png width="500"> ] --- class: inverse, middle #Avaliação dos Métodos --- class: middle ### Métricas Como não há conhecimento prévio sobre a real divisão dos dados, as métricas de avaliação para o modelo consideram apenas as variáveis disponíveis nos dados. As utilizadas no estudo foram: - Davies-Bouldin (DB): Ideia geral fornecer a média da similaridade entre cada grupo e seu grupo mais similar dentre os clusters obtidos. Calculando a distância média de suas observações a um valore referencial, podendo ser um medóide ou centróide. (Menor) - Dunn (D): Razão entre a separação dos grupos e a variância dentro deles. (Maior) - Silhueta (S): Considera a distância de cada ponto às observações do mesmo grupo e aos demais clusters formados. (Maior) - Calinski-Harabasz (CH): Considera a variância intragrupo de cada cluster gerado considerando a distância quadrática de cada observação ao seu valor referência, podendo esse valor ser um centróide ou medóide.(Maior) --- Class: middle ### Particionamento <img src=img/validacaoparticao.png width="700"> --- class: middle ### Hierárquico .center[ <img src=img/tabelahierarquico.png width="550"> ] --- class: inverse, middle #Resultados --- class: middle ### Resultados .center[<img src=img/resultado.png width="800">] --- class: middle ### Resultados .center[<img src=img/mapa.png width="550">] --- class: middle ### Resultados Após todo o agrupamento das variáveis foi realizada uma árvore de decisão para análise de variáveis mais significativas para o modelo. .center[<img src=img/arvore.png width="500"> <img src=img/capitais.png width="300"> ] --- class: middle ### Resultados .center[<img src=img/nascidos.png width="800">] --- class: middle ### Resultados .center[<img src=img/boxplot.png width="800">] --- class: inverse,middle ## Aprendizado Supervisionado --- class: middle .pull-left[ ### Regressão - Quantidade de Vendas - Porcentagem - Preço - Peso ] .pul-right[ ### Classificação - Bom pagador/não é bom pagador - Diagnóstico de alguma doença/sem doença - Pixels em imagem é cancerígeno/não é cancerígeno - Sentimento bom/sentimento ruim ] --- class: middle ### Aprendizado Supervisionado Em tese, queremos encontrar uma função `\(f()\)` de forma que `\(y\approx f(x)\)`. Exemplos : - ___Exemplo 1___: Queremos prever a quantidade de vendas de um produto X baseado em qual mídia ele foi divulgado e qual foi o investimento sobre o mesmo. - ___Exemplo 2___: Queremos classificar se uma pessoa vai ou não atrasar uma parcela baseado no tipo de contrato que ela fez e o valor da parcela do financiamento. Nos exemplos: `\(vendas = f(midia, investimento)\)` `\(inadimplência = f(valor da parcela, tipo de contrato)\)` Fonte: Exemplos obtidos no material do Curso-R. --- class: middle ### Modelo de regressão linear `\(f(x) = \beta_0 + \beta_1 x_1 + \beta_2x_2\)` <img src="static/img/0_D7zG46WrdKx54pbU.gif" style="position: width: 60%; "> .footnote[ Fonte: [https://alykhantejani.github.io/images/gradient_descent_line_graph.gif](https://alykhantejani.github.io/images/gradient_descent_line_graph.gif) ] --- class: middle ### Modelo de Regressão Logística `\(log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1x_1 + \beta_2x_2\)` <img src="static/img/gif_reg_logistica_otimizacao.gif" style=" width: 60%; "> Fonte: Material Curso-R --- class: middle ### Desempenho vs Interpretabilidade <img src="machine_learning_files/figure-html/unnamed-chunk-14-1.png" width="600" /> Fonte: Material Curso-R --- class: inverse,middle ## Conceitos --- class: middle ### Pré-processamento dos dados - Transformações não lineares nas variáveis preditoras (log, raiz quadrada, BoxCox) - Tranformação em variáveis Dummy (para variáveis categóricas) - Reamostragens - Interações entre variáveis - Normalização em variáveis numéricas --- class: middle ### Treino e Teste <img src="img/treino-teste.webp" width="40%" style="display: block; margin: auto;" /> Fonte da imagem: MAp --- class: middle ### Overfitting (Sobreajuste) - Regressão Polinomial com aumento do polinômio $$f(x)=\beta_0+\beta_1x_i+\beta_2x_i^2+\cdots+\beta_9x_i^9 $$  Fonte: Material Curso-R --- class: middle ### Hiperparâmetros - Hiperparâmetros são parâmetros de modelos que devem ser definidos antes de treinar o modelo. - Usados para controlar o processo de aprendizado. - Exemplos : **Random Forest**, **Redes Neurais**, **XGBoost**. - __Grid Search__ é uma técnica usada para testar todas as combinações possíveis de hiperparâmetros. --- class: middle ### Regularização - LASSO - Parâmetro regularizador para controlar a complexidade do modelo, evitando o sobreajuste. - Função de Custo do modelo de regressão linear: `$$RMSE = \sqrt{\frac{1}{N}\sum(y_i - \hat{y_i})^2} = \sqrt{\frac{1}{N}\sum(y_i - \color{red}{(\hat{\beta}_0 + \hat{\beta}_1x_{1i} + \dots + \hat{\beta}_px_{pi})})^2}$$` - Penalização do modelo de regressão linear: `$$RMSE_{regularizado} = RMSE + \color{red}{\lambda}\sum_{j = 1}^{p}|\beta_j|$$` - Função Custo do modelo de regressão logística: `$$D = \frac{-1}{N}\sum[y_i \log\hat{y_i} + (1 - y_i )\log(1 - \hat{y_i})]$$` - Penalização do modelo de regressão logística: `$$D_{regularizado} = D + \color{red}{\lambda}\sum_{j = 1}^{p}|\beta_j|$$` --- class:middle ### Cross-validation (Validação Cruzada) - Objetivo: encontrar o melhor conjunto de hiperparâmetros. <img src="img/cross.png" width="70%" style="display: block; margin: auto;" /> Fonte: ebc.cat --- class: middle .pull-left[ ### Validação por tempo <img src="img/cross_series.jpg" width="90%" style="display: block; margin: auto;" /> - __modeltime.resample__ ] .pull-right[ ### Validação por espaço <img src="img/cross_space.gif" width="90%" style="display: block; margin: auto;" /> - __spacialsample__ ] --- class: middle ## Medidas para modelos de regressão **Métrica** de erro: **R**oot **M**ean **S**quared **E**rror. $$ RMSE = \sqrt{\frac{1}{N}\sum(y_i - \hat{y_i})^2} $$ .pull-left[ MAE: Mean Absolute Error $$ MAE = \frac{1}{N}\sum|y_i - \hat{y_i}| $$ ] .pull-right[ R2: R-squared $$ R^2 = 1 - \frac{\sum(y_i - \color{salmon}{\hat{y_i}})^2}{\sum(y_i - \color{royalblue}{\bar{y}})^2} $$ ] --- class:middle ### Medidas para modelos de classificação ### Matriz de confusão <table class="table table-bordered" style="font-size: 20px; width: auto !important; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="empty-cells: hide;border-bottom:hidden;" colspan="1"></th> <th style="border-bottom:hidden;padding-bottom:0; padding-left:3px;padding-right:3px;text-align: center; padding-right: 4px; padding-left: 4px; background-color: white !important;" colspan="2"><div style="border-bottom: 1px solid #ddd; padding-bottom: 5px; ">Observado</div></th> </tr> <tr> <th style="text-align:left;background-color: white !important;text-align: center;"> Predito </th> <th style="text-align:left;background-color: white !important;text-align: center;"> Negativo </th> <th style="text-align:left;background-color: white !important;text-align: center;"> Positivo </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;background-color: white !important;text-align: center;width: 3in; font-weight: bold;"> Negativo </td> <td style="text-align:left;background-color: white !important;text-align: center;width: 3in; "> Verdadeiro Negativo (TN) </td> <td style="text-align:left;background-color: white !important;text-align: center;width: 2in; "> Falso Negativo (FN) </td> </tr> <tr> <td style="text-align:left;background-color: white !important;text-align: center;width: 3in; font-weight: bold;"> Positivo </td> <td style="text-align:left;background-color: white !important;text-align: center;width: 3in; "> Falso Positivo (FP) </td> <td style="text-align:left;background-color: white !important;text-align: center;width: 2in; "> Verdadeiro Positivo (TP) </td> </tr> </tbody> </table> ### Medidas de desempenho $$ \begin{array}{lcc} \mbox{acurácia} & = & \frac{TP + TN}{TP + TN + FP + FN}\\\\ \mbox{precisão} & = & \frac{TP}{TP + FP}\\\\ \mbox{sensibilidade} &=& \frac{TP}{TP + FN}\\\\ \mbox{especificidade} &=& \frac{TN}{TN + FP}\\\\ \end{array} $$ --- class: middle ### Curva ROC e AUC .pull-left[ <img src="img/CurvaROC.png" width="90%" style="display: block; margin: auto;" /> ] .pull-right[ <img src="img/ROC.png" width="90%" style="display: block; margin: auto;" /> ] --- class: inverse,middle ### Árvores de Decisão --- class: middle ### Árvores de Decisão <img src="img/arvores.png" width="90%" style="display: block; margin: auto;" /> --- class: middle ### Ganho de Informação (information gain) $$ \mbox{GI} = N . Imp(nó) - N(esq) . Imp(esq) - N(dir) . Imp(dir) $$ ### Medidas de Impureza mais comuns .center[ <img src="static/img/impurezas.png" style="width: 83%;"/> ] Fonte: Material Curso-R --- class: middle ### Exemplo usando o GINI .center[ <img src="static/img/gini_exemplo.png" style="width: 100%;"/> ] Fonte: Material Curso-R --- class: middle ### Hiperparâmetros - Quantidade mínima de observações dentro de um nó. - Profundidade - Parâmetro mínimo de complexidade (ganho de informação) --- class: inverse, middle ### XGBoost --- class: middle ### XGBoost (Extreme Gradient Boosting) - Generalização do Gradient Bosting - Combinação de várias árvores de decisão construídas sequencialmente usando a informação da árvora passada - Utiliza o algoritmo de descida de gradiente minimizando a função perda da árvore anterior - Poderoso computacionalmente - Variáveis categóricas precisam ser transformas em dummy - Trata automaticamente valores faltantes e __multicolinearidade__ --- class: middle ### Hiperparâmetros - Quantidade mínima de observações dentro de um nó - Profundidade - Quantidade de variáveis sorteadas por árvore - Número de árvores - Tamanho do passo - Parâmetro Regularizador (semelhante ao parâmetro de complexidade) - Proporção de linhas para sortear por árvore --- class: middle ### XGBoost <img src="static/img/xgboost_tuned_vs_untuned.gif" style="width: 100%;"/> Fonte: Material Curso-R --- class: inverse, middle ### Aplicação modelo XGBoost --- class: middle ### Predição de casos de COVID-19 em gestantes e puérperas - SIVEP-Gripe - Casos COVID-19 vs Não COVID-19. - Classificar casos "não especificados". - Dados filtrados e tratados. - Análises estatísticas para decisão das variáveis junto com a Obstetrícia. - __{TIDYMODELS}__ --- class: middle No
```r library(tidymodels) data <- readRDS("data.rds") table(data$classi_fin) ``` ``` ## ## covid-19 não-covid ## 18996 2257 ``` --- class: middle ### Bases treino e teste ```r set.seed(123) srag_split <- initial_split( data, prob = 0.7 ) srag_train <- training(srag_split) srag_test <- testing(srag_split) ``` --- class: middle ### Pré-Processamento ```r #Recipes xgb_rec <- recipe(classi_fin ~ ., data = srag_train) %>% step_normalize(idade) %>% themis::step_smotenc(classi_fin,seed = 69) %>% step_dummy(all_nominal(), -classi_fin) ``` - Varios tipos de step - transformações (BoxCox,polinomial,raiz quadrada), inputação pela média, reamostragens, nivelar classes de uma variável, categorizar faltantes (NA) etc.. --- class: middle ### Pré-Processamento <style type="text/css"> .scroll-100 { max-height: 200px; overflow-y: auto; background-color: inherit; } </style> ```r #Recipes xgb_rec_data <- recipe(classi_fin ~ ., data = srag_train) %>% step_normalize(idade) %>% themis::step_smotenc(classi_fin,seed = 69) %>% step_dummy(all_nominal(), -classi_fin) %>% prep() %>% bake(new_data=NULL) table(xgb_rec_data$classi_fin) ``` ```{.scroll-100} ## ## covid-19 não-covid ## 14250 14250 ``` --- class: middle ### Especificação ```r xgb_spec <- boost_tree( trees = 1000, tree_depth = tune(), min_n = tune(), loss_reduction = tune(), sample_size = tune(), mtry = tune(), learn_rate = tune(), ) %>% set_engine("xgboost") %>% set_mode("classification") ``` --- class: middle ### Workflow ```r xgb_wf <- workflow() %>% add_recipe(xgb_rec) %>% add_model(xgb_spec) ``` --- class: middle .pull-left[ ### Grid ```r xgb_grid <- grid_max_entropy( tree_depth(), min_n(), loss_reduction(), sample_size = sample_prop(), finalize(mtry(), srag_train), learn_rate(), size = 30 ) ``` - __grip_expand__ : você limita o espaço ] .pull-right[ ### Cross-Validation ```r set.seed(456) srag_folds <- vfold_cv( srag_train, v = 10, repeats = 5 ) ``` ] --- class: middle ### Tunning ```r xgb_metrics <- metric_set(roc_auc, sensitivity, specificity, npv, ppv) doParallel::registerDoParallel() set.seed(1011) xgb_res <- xgb_wf %>% tune_grid( resamples = srag_folds, grid = xgb_grid, metrics = xgb_metrics, control = control_grid(save_pred = TRUE) ) ``` --- class: middle <style type="text/css"> pre { max-height: 300px; overflow-y: auto; } pre[class] { max-height: 100px; } </style> ### Melhores Hiperparâmetros ```r # metrics collect_metrics(xgb_res) ``` ``` ## # A tibble: 150 × 12 ## mtry min_n tree_depth learn_rate loss_…¹ sampl…² .metric .esti…³ mean n ## <int> <int> <int> <dbl> <dbl> <dbl> <chr> <chr> <dbl> <int> ## 1 5 29 11 7.38e-9 1.05e-5 0.731 npv binary 0.436 50 ## 2 5 29 11 7.38e-9 1.05e-5 0.731 ppv binary 0.962 50 ## 3 5 29 11 7.38e-9 1.05e-5 0.731 roc_auc binary 0.881 50 ## 4 5 29 11 7.38e-9 1.05e-5 0.731 sensit… binary 0.892 50 ## 5 5 29 11 7.38e-9 1.05e-5 0.731 specif… binary 0.704 50 ## 6 2 20 3 3.75e-4 2.24e-4 0.210 npv binary 0.330 50 ## 7 2 20 3 3.75e-4 2.24e-4 0.210 ppv binary 0.957 50 ## 8 2 20 3 3.75e-4 2.24e-4 0.210 roc_auc binary 0.851 50 ## 9 2 20 3 3.75e-4 2.24e-4 0.210 sensit… binary 0.835 50 ## 10 2 20 3 3.75e-4 2.24e-4 0.210 specif… binary 0.686 50 ## # … with 140 more rows, 2 more variables: std_err <dbl>, .config <chr>, and ## # abbreviated variable names ¹loss_reduction, ²sample_size, ³.estimator ## # ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names ``` --- class: middle ### Melhores Hiperparâmetros ```r # best hyperparameters show_best(xgb_res, "roc_auc") ``` ``` ## # A tibble: 5 × 12 ## mtry min_n tree_depth learn_rate loss_…¹ sampl…² .metric .esti…³ mean n ## <int> <int> <int> <dbl> <dbl> <dbl> <chr> <chr> <dbl> <int> ## 1 10 29 12 1.31e-2 2.40e-1 0.743 roc_auc binary 0.891 50 ## 2 4 31 14 2.61e-3 1.27e-5 0.680 roc_auc binary 0.891 50 ## 3 3 38 7 4.71e-3 3.31e-9 0.513 roc_auc binary 0.890 50 ## 4 8 2 10 3.41e-8 2.18e-8 0.499 roc_auc binary 0.890 50 ## 5 6 18 7 1.43e-3 9.12e-5 0.818 roc_auc binary 0.890 50 ## # … with 2 more variables: std_err <dbl>, .config <chr>, and abbreviated ## # variable names ¹loss_reduction, ²sample_size, ³.estimator ## # ℹ Use `colnames()` to see all variable names ``` --- class: middle ### Melhores Hiperparâmetros ```r # best auc best_auc <- select_best(xgb_res, "roc_auc"); best_auc ``` ``` ## # A tibble: 1 × 7 ## mtry min_n tree_depth learn_rate loss_reduction sample_size .config ## <int> <int> <int> <dbl> <dbl> <dbl> <chr> ## 1 10 29 12 0.0131 0.240 0.743 Preprocessor1_Mo… ``` --- class: middle ### Finalização do Modelo ```r # Best model -------------- final_xgb <- finalize_workflow( xgb_wf, best_auc ) # Final fit model --------- final_fit <- last_fit( final_xgb, srag_split, ) collect_metrics(final_fit) ``` ``` ## # A tibble: 2 × 4 ## .metric .estimator .estimate .config ## <chr> <chr> <dbl> <chr> ## 1 accuracy binary 0.906 Preprocessor1_Model1 ## 2 roc_auc binary 0.886 Preprocessor1_Model1 ``` --- class: middle ### Gráfico importância das variáveis ```r library(vip) ### Gráfico de pontos final_xgb %>% fit(data = srag_train) %>% pull_workflow_fit() %>% vip(geom = "point") ``` <img src="machine_learning_files/figure-html/unnamed-chunk-39-1.png" width="100%" /> ] --- class: middle ### Gráfico importância das variáveis ```r final_fit %>% pluck(".workflow",1) %>% pull_workflow_fit() %>% vip::vip(num_features=20) ``` <img src="machine_learning_files/figure-html/unnamed-chunk-40-1.png" width="100%" /> --- class: middle ### Curva ROc ```r final_fit %>% collect_predictions() %>% roc_curve(classi_fin,`.pred_covid-19`) %>% autoplot() ``` <img src="machine_learning_files/figure-html/unnamed-chunk-41-1.png" width="160%" /> --- class: middle ### Matriz de confusão ```r conf_mat( data = final_fit$.predictions[[1]], truth = classi_fin, estimate = .pred_class ) %>% autoplot(type = "heatmap") ``` <img src="machine_learning_files/figure-html/unnamed-chunk-42-1.png" width="100%" height="120%" /> --- class: middle ### Medidas de desempenho .pull-left[ ```r library(gt) preds <- final_fit %>% collect_predictions() summary(conf_mat(preds, classi_fin, .pred_class)) %>% dplyr::select(-.estimator) %>% gt() %>% fmt_number(columns = 2, decimals = 4) ``` ] .pull-right[
.metric
.estimate
accuracy
0.9061
kap
0.5627
sens
0.9305
spec
0.7025
ppv
0.9631
npv
0.5473
mcc
0.5684
j_index
0.6329
bal_accuracy
0.8165
detection_prevalence
0.8628
precision
0.9631
recall
0.9305
f_meas
0.9465
] --- class: middle ### Aplicação nos dados não especificados ```r model <- final_xgb %>% fit(data) saveRDS(model,"modelo_xgb.rds") dados_nespecificado <- readRDS("dados_nespecificado.rds") pred <- predict(model,dados_nespecificado) dados_nespecificado$classi_fin_pred <- pred$.pred_class table(dados_nespecificado$classi_fin_pred) ``` ``` ## ## covid-19 não-covid ## 13721 4039 ``` --- class: middle ### New Treshold ```r library(probably) thresholds <- preds %>% threshold_perf(classi_fin, `.pred_covid-19`, thresholds = seq(0, 1, by = 0.0025)) best_thresh <- thresholds %>% filter(.metric == "j_index") %>% filter(.estimate == max(.estimate)) %>% pull(.threshold) %>% max() classes <- levels(preds$.pred_class) preds_new <- preds %>% mutate(.new_pred_class = as.factor(ifelse(`.pred_covid-19` >= best_thresh,classes[1],classes[2]), levels = c("covid-19", "não-covid"))) final_fit$.predictions[[1]]$`.new_pred_class` = preds_new$.new_pred_class ``` --- class:middle ### Nova matriz de confusão <img src="machine_learning_files/figure-html/unnamed-chunk-47-1.png" width="100%" /> --- class:middle #### Comparação dos dois
.metric
old_threshold
new_threshold
accuracy
0.9061
0.8877
kap
0.5627
0.5241
sens
0.9305
0.9050
spec
0.7025
0.7430
ppv
0.9631
0.9671
npv
0.5473
0.4834
mcc
0.5684
0.5403
j_index
0.6329
0.6479
bal_accuracy
0.8165
0.8240
detection_prevalence
0.8628
0.8357
precision
0.9631
0.9671
recall
0.9305
0.9050
f_meas
0.9465
0.9350
--- class: inverse, middle .center[ ## <br>Obrigado! ] .pull-left[ <div class="figure" style="text-align: center"> <img src="img/butantan.png" alt="Foto: OOBr no Instituto Butantan." width="100%" /> <p class="caption">Foto: OOBr no Instituto Butantan.</p> </div> ] .pull-right[ <br><br>OOBr na web:
<a href="mailto:observatorioobstetricobr@gmail.com">observatorioobstetricobr@gmail.com</a>
[@observatorioobr](https://twitter.com/observatorioobr)
[@observatorioobr](https://instagram/observatorioobr) ]