Imputação baseada em árvores

Tratamento de Dados Ausentes com Imputações em R

Michal Oleszak

Machine Learning Engineer

Abordagem de imputação baseada em árvores

Use modelos de Machine Learning para prever valores ausentes!

  • Abordagem não paramétrica: sem suposições sobre relações entre variáveis.
  • Captura padrões não lineares complexos.
  • Geralmente tem melhor desempenho preditivo que modelos estatísticos simples.

Neste curso: pacote missForest, baseado em randomForest

Tratamento de Dados Ausentes com Imputações em R

Árvores de decisão

Um diagrama de árvore de decisão, mostrando como um modelo pode tomar decisões. O modelo atribui diferentes probabilidades de Diabetes a combinações de Altura e Peso.

Tratamento de Dados Ausentes com Imputações em R

Random forests

Um esquema de como funcionam random forests. Os dados originais geram três conjuntos por bagging com subconjuntos aleatórios de colunas. Ajusta-se uma árvore de decisão a cada um e, no fim, os resultados são agregados.

Tratamento de Dados Ausentes com Imputações em R

Algoritmo missForest

  1. Faça um palpite inicial para valores ausentes com imputação pela média.
  2. Ordene as variáveis em ordem crescente pela quantidade de ausências.
  3. Para cada variável x:
    • Ajuste um random forest à parte observada de x (usando outras variáveis como preditoras).
    • Use-o para prever a parte ausente de x.
  4. Repita o passo 3 até que os valores imputados quase não mudem mais.
Tratamento de Dados Ausentes com Imputações em R

missForest na prática

nhanes %>% is.na() %>% colSums()
Age     Gender     Weight     Height   Diabetes    TotChol      Pulse PhysActive 
  0          0          9          8          1         85         32         26
library(missForest)
imp_res <- missForest(nhanes)
nhanes_imp  <- imp_res$ximp
nhanes_imp %>% is.na() %>% colSums()
Age     Gender     Weight     Height   Diabetes    TotChol      Pulse PhysActive 
  0          0          0          0          0          0          0          0
Tratamento de Dados Ausentes com Imputações em R

Erro de imputação

missForest() fornece uma estimativa de erro OOB (out-of-bag) da imputação:

  • NRMSE (normalized root mean squared error) para variáveis contínuas.
  • Proporção de classificações incorretas (PFC) para variáveis categóricas.

Em ambos os casos, bom desempenho leva a valor próximo de 0; valores perto de 1 indicam resultado ruim.

imp_res <- missForest(nhanes)
imp_res$OOBerror
      NRMSE         PFC 
0.147687025 0.003676471
Tratamento de Dados Ausentes com Imputações em R

Erro de imputação

missForest() fornece uma estimativa de erro OOB (out-of-bag) da imputação:

  • NRMSE (normalized root mean squared error) para variáveis contínuas.
  • Proporção de classificações incorretas (PFC) para variáveis categóricas.

Em ambos os casos, bom desempenho leva a valor próximo de 0; valores perto de 1 indicam resultado ruim.

imp_res <- missForest(nhanes, variablewise = TRUE)
imp_res$OOBerror
    MSE       PFC       MSE       MSE       PFC       MSE       MSE       MSE 
0.00000   0.00000 285.79563  40.42142   0.00735   0.53444 129.03609   0.17576
Tratamento de Dados Ausentes com Imputações em R

Compromisso entre velocidade e acurácia

Treinar múltiplos random forests pode levar tempo.

Ideia: abrir mão de um pouco de acurácia e reduzir o tamanho da floresta para diminuir o tempo de computação.

  • Reduza o número de árvores em cada floresta (argumento ntree).
  • Reduza o número de variáveis usadas nas divisões (argumento mtry).

O impacto no tempo de execução varia:

  • Reduzir ntree tem efeito linear.
  • Reduzir mtry acelera mais quando há muitas variáveis.
Tratamento de Dados Ausentes com Imputações em R

Compromisso velocidade × acurácia na prática

Configurações padrão:

start_time <- Sys.time()
imp_res <- missForest(nhanes)
end_time <- Sys.time()
print(imp_res$OOBerror)
print(end_time - start_time)
      NRMSE         PFC 
0.147687025 0.003676471
Time difference of 5.496582 secs

Florestas reduzidas:

start_time <- Sys.time()
imp_res <- missForest(nhanes,
                      ntree = 10,
                      mtry = 2)
end_time <- Sys.time()
print(imp_res$OOBerror)
print(end_time - start_time)
      NRMSE         PFC 
0.162420139 0.007425743
Time difference of 0.516367 secs
Tratamento de Dados Ausentes com Imputações em R

Vamos praticar!

Tratamento de Dados Ausentes com Imputações em R

Preparing Video For Download...