Carvalho Ribeiro Blog
  • Info

Conteúdo

  • O que é uma matriz de confusão
  • Qual o objetivo
  • De onde vem a demanda
  • Como fazer
  • Pra onde vai quem é o cliente
  • Qual o resultado

Avaliar resultados de modelo preditivo com matriz de confusão

Modelos
Author

Marcelo Carvalho dos Anjos

Published

August 3, 2022

Vídeo tema para este post em Avaliar resultados de modelo preditivo com matriz de confusão

O que é uma matriz de confusão

  • Tabela que facilita a visualização das previsões corretas e as erradas em modelos de classificação.

  • Possibilita a interpretação dos resultados sobre diversos pontos de vista desde que tenhamos os valores reais e os valores previstos pelo modelo.

    Matriz de confusão
    • TP - verdadeiros positivos: Casos em que previmos que o paciênte tem a doença e ele realmente tem.

    • TN - verdadeiro negativos: Casos em que previmos que o paciênte não tem a doença e ele realmente não tem.

    • FP - falso positivo: Previmos que sim, mas na verdade ele não tem a doença. também conhecido como “erro do tipo 1”.

    • FN - falso negativo: Previmos que não, mas na verdade ele tem a doença. também conhecido como “erro do tipo 2”.

Qual o objetivo

  • Por ser visual ajuda a responder rapidamente será que meu modelo teve um bom desempenho, onde deu errado, como posso corrigir ?

  • As diversas saídas de previõe permite a criação de indicadores que serão uteis nos ajustes mais adequados conforme a necessidade do trabalho que está sendo desenvolvido.

De onde vem a demanda

  • Em 1904 Karl Pearson criou a tabela de contingência. Por que precisamos e uma matriz de confusao se tevem a acuracidade ?

  • Imagine prever quantas pessoas estao infectadas com um virus contagioso antes de apresentar sintomas e isola-las da populacao saudavel.

Como fazer

Para reproduzir os códigos abaixo serão necessários os pacotes tidyverse , tidymodels e janitor
O principal pacote que será usando para analisar uma matriz de confusão é o pacote yardstick que já é carregado quando chamamos o pacote tidymodels.

#packages
library(tidyverse)
library(tidymodels)

#check
two_class_example |>  filter(Class1 >0.5)  |>  janitor::tabyl(truth)
  truth   n   percent
 Class1 227 0.8194946
 Class2  50 0.1805054
#exemplo de tabela cruzada usando janitor
two_class_example |>  
  janitor::tabyl(truth, predicted) |>  
  janitor::adorn_totals(where = c("col", "row"))  |>  
  janitor::adorn_title()
        predicted             
  truth    Class1 Class2 Total
 Class1       227     31   258
 Class2        50    192   242
  Total       277    223   500
#trocando nomes
two_class_example |>
  conf_mat(truth =truth, estimate =predicted, dnn =c("vlr_previsto","vlr_real"))
            vlr_real
vlr_previsto Class1 Class2
      Class1    227     50
      Class2     31    192
#plot heatmap
two_class_example |>
  conf_mat(truth = truth, estimate = predicted) |>
  autoplot(type = "heatmap")

#acuracia- prop de acertos do modelo total de acerto / total previu
two_class_example |>
  accuracy(truth= truth, estimate = predicted)
# A tibble: 1 × 3
  .metric  .estimator .estimate
  <chr>    <chr>          <dbl>
1 accuracy binary         0.838
#sensibilidade ou recall é a proporção de casos positivos classif corretamente
#Raio X de aeroporto prioriza sensitivity
#diagnóstico de cancer também pois o não diagnóstico resulta em atraso no tratamento
two_class_example |>
  yardstick::sens(truth= truth, estimate = predicted)
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 sens    binary         0.880
#Recall métrica útil nos casos em que o Falso Negativo supera o falso positivol
#importante em casos médicos em que não importa se disparamos um alarme 
#falso, mas os casos positivos reais não devem passar despercebidos!
#Em nosso exemplo, Recall seria uma métrica melhor porque não queremos dar alta 
#acidentalmente a uma pessoa infectada e deixá-la se misturar com a população 
#saudável,espalhando o vírus contagioso. 
#Agora você pode entender por que a acuracidade foi uma métrica ruim para modelo.
two_class_example |>
  recall(truth= truth, estimate = predicted)
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 recall  binary         0.880
#kappa
two_class_example |>
  kap(truth= truth, estimate = predicted)
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 kap     binary         0.675
#npv
two_class_example |>
  npv(truth= truth, estimate = predicted)
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 npv     binary         0.861
#ppv
two_class_example |>
  ppv(truth= truth, estimate = predicted)
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 ppv     binary         0.819
#A precisão é util nos casos em que os falsos positivos são uma preocupação 
#maior do que os falsos negativos.
#A precisão é importante em sistemas de recomendação de música ou vídeo, 
#sites de comércio eletrônico, etc. Resultados errados podem levar à perda de 
#clientes e prejudicar o negócio.
two_class_example |>
  precision(truth= truth, estimate = predicted)
# A tibble: 1 × 3
  .metric   .estimator .estimate
  <chr>     <chr>          <dbl>
1 precision binary         0.819
#spec
two_class_example |>
  spec(truth= truth, estimate = predicted)
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 spec    binary         0.793
#roc_curve
two_class_example |>
  roc_curve(truth, Class1 ) |> autoplot()

#roc_auc
two_class_example |>
  roc_auc(truth, Class1 )
# A tibble: 1 × 3
  .metric .estimator .estimate
  <chr>   <chr>          <dbl>
1 roc_auc binary         0.939
Diferença entre incidência e prevalencia

Incidencia é o número de casos recém-diagnosticados de uma doença. Número de novos casos de uma doença dividido pelo número de pessoas em risco para a doença. Se, ao longo de um ano, cinco mulheres são diagnosticadas com câncer de mama, de uma população total de 200 mulheres do estudo (que não têm câncer de mama no início do período de estudo), então diríamos que a incidência de câncer de mama câncer nesta população foi de 0,025. (ou 2.500 por 100.000 mulheres-anos de estudo)

Prevalência é o número total de casos da doença existentes em uma população. A taxa de prevalência é o número total de casos de uma doença existente em uma população dividido pela população total. Assim, se uma medida de câncer é feita em uma população de 40.000 pessoas e 1.200 foram recentemente diagnosticadas com câncer e 3.500 estão vivendo com câncer, então a prevalência de câncer é de 0,118. (ou 11.750 por 100.000 pessoas)

Fonte: Departament of health - NY State at https://www.health.ny.gov/diseases/chronic/basicstat.htm

Pra onde vai quem é o cliente

  • A próxima etapa é o ajuste, finalização e comunicação do modelo.

Qual o resultado

  • Aperfeiçoar as técnicas de avaliação de performance de modelos poupando tempo e dinheiro.

  • Facilitar o processo de busca por melhorias nos modelos de previsão.

  • Melhorar a comunicação dos resultados.