Trädbaserad imputation

Hantering av saknade värden med imputering i R

Michal Oleszak

Machine Learning Engineer

Trädbaserad imputationsmetod

Använd maskininlärningsmodeller för att förutsäga saknade värden!

  • Icke-parametrisk metod: inga antaganden om samband mellan variabler.
  • Kan fånga upp komplexa icke-linjära mönster.
  • Ger ofta bättre prediktiv prestanda än enkla statistiska modeller.

I den här kursen: paketet missForest, baserat på randomForest

Hantering av saknade värden med imputering i R

Beslutsträd

Ett schema över ett beslutsträd som visar hur en exempelmodell fattar beslut. Modellen tilldelar olika sannolikheter för diabetes beroende på kombinationer av värden för längd och vikt.

Hantering av saknade värden med imputering i R

Slumpskogar

Ett schema som visar hur slumpskogar fungerar. Originaldata ger tre baggade datamängder med slumpmässiga kolumnurval. Ett beslutsträd anpassas till varje datamängd och resultaten från alla träd aggregeras till slut.

Hantering av saknade värden med imputering i R

missForest-algoritmen

  1. Gör en initial uppskattning av saknade värden med medelvärdesimputation.
  2. Sortera variablerna i stigande ordning efter andelen saknade värden.
  3. För varje variabel x:
    • Anpassa en slumpskog till den observerade delen av x (med övriga variabler som prediktorer).
    • Använd den för att förutsäga den saknade delen av x.
  4. Upprepa steg 3 tills de imputerade värdena inte längre förändras nämnvärt.
Hantering av saknade värden med imputering i R

missForest i praktiken

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
Hantering av saknade värden med imputering i R

Imputationsfel

missForest() ger en uppskattning av imputationsfelet via out-of-bag (OOB):

  • Normaliserat rotvärdeskvadratmedelvärdesfel (NRMSE) för kontinuerliga variabler.
  • Andel felklassificerade poster (PFC) för kategoriska variabler.

I båda fallen innebär ett bra resultat ett värde nära 0, medan värden kring 1 indikerar dålig prestanda.

imp_res <- missForest(nhanes)
imp_res$OOBerror
      NRMSE         PFC 
0.147687025 0.003676471
Hantering av saknade värden med imputering i R

Imputationsfel

missForest() ger en uppskattning av imputationsfelet via out-of-bag (OOB):

  • Normaliserat rotvärdeskvadratmedelvärdesfel (NRMSE) för kontinuerliga variabler.
  • Andel felklassificerade poster (PFC) för kategoriska variabler.

I båda fallen innebär ett bra resultat ett värde nära 0, medan värden kring 1 indikerar dålig prestanda.

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
Hantering av saknade värden med imputering i R

Avvägning mellan hastighet och noggrannhet

Att bygga flera slumpskogar kan ta lång tid.

Idé: offra lite noggrannhet och minska skogarnas storlek för att korta ned beräkningstiden.

  • Minska antalet träd i varje skog (argumentet ntree).
  • Minska antalet variabler som används vid uppdelning (argumentet mtry).

Effekten på beräkningstiden varierar:

  • Att minska ntree har en linjär effekt.
  • Att minska mtry ger större hastighetsvinst när det finns många variabler.
Hantering av saknade värden med imputering i R

Avvägning mellan hastighet och noggrannhet i praktiken

Standardinställningar:

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

Reducerade skogar:

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
Hantering av saknade värden med imputering i R

Nu kör vi en övning!

Hantering av saknade värden med imputering i R

Preparing Video For Download...