Imputacja oparta na drzewach

Obsługa brakujących danych z imputacją w R

Michal Oleszak

Machine Learning Engineer

Podejście do imputacji opartej na drzewach

Użyj modeli uczenia maszynowego do przewidywania brakujących wartości!

  • Podejście nieparametryczne: brak założeń o związkach między zmiennymi.
  • Wykrywa złożone wzorce nieliniowe.
  • Często lepsza skuteczność predykcyjna niż w prostych modelach statystycznych.

W tym kursie: pakiet missForest, oparty na randomForest

Obsługa brakujących danych z imputacją w R

Drzewa decyzyjne

Schemat drzewa decyzyjnego pokazujący, jak przykładowy model podejmuje decyzje. Model przypisuje różne prawdopodobieństwo cukrzycy różnym kombinacjom wartości Wzrostu i Wagi.

Obsługa brakujących danych z imputacją w R

Lasy losowe

Schemat przedstawiający działanie lasów losowych. Oryginalne dane tworzą trzy zestawy z próbkowaniem bootstrap i losowymi podzbiorami kolumn. Do każdego dopasowywane jest drzewo decyzyjne, a wyniki wszystkich drzew są na końcu agregowane.

Obsługa brakujących danych z imputacją w R

Algorytm missForest

  1. Wstępne uzupełnienie brakujących wartości za pomocą imputacji średnią.
  2. Posortowanie zmiennych rosnąco według liczby brakujących wartości.
  3. Dla każdej zmiennej x:
    • Dopasowanie lasu losowego do obserwowanej części x (używając innych zmiennych jako predyktorów).
    • Użycie go do przewidzenia brakującej części x.
  4. Powtarzanie kroku 3., aż imputowane wartości przestaną się znacząco zmieniać.
Obsługa brakujących danych z imputacją w R

missForest w praktyce

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
Obsługa brakujących danych z imputacją w R

Błąd imputacji

missForest() dostarcza oszacowanie błędu imputacji out-of-bag (OOB):

  • Znormalizowany pierwiastek błędu średniokwadratowego (NRMSE) dla zmiennych ciągłych.
  • Odsetek błędnie sklasyfikowanych wartości (PFC) dla zmiennych kategorycznych.

W obu przypadkach dobry wynik to wartość bliska 0, a wartości bliskie 1 wskazują słaby rezultat.

imp_res <- missForest(nhanes)
imp_res$OOBerror
      NRMSE         PFC 
0.147687025 0.003676471
Obsługa brakujących danych z imputacją w R

Błąd imputacji

missForest() dostarcza oszacowanie błędu imputacji out-of-bag (OOB):

  • Znormalizowany pierwiastek błędu średniokwadratowego (NRMSE) dla zmiennych ciągłych.
  • Odsetek błędnie sklasyfikowanych wartości (PFC) dla zmiennych kategorycznych.

W obu przypadkach dobry wynik to wartość bliska 0, a wartości bliskie 1 wskazują słaby rezultat.

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
Obsługa brakujących danych z imputacją w R

Kompromis między szybkością a dokładnością

Budowanie wielu lasów losowych może być czasochłonne.

Idea: poświęcić część dokładności i zmniejszyć rozmiar lasu, aby skrócić czas obliczeń.

  • Zmniejszenie liczby drzew w każdym lesie (argument ntree).
  • Zmniejszenie liczby zmiennych używanych do podziałów (argument mtry).

Wpływ na czas obliczeń różni się:

  • Redukcja ntree ma efekt liniowy.
  • Redukcja mtry bardziej przyspiesza obliczenia przy dużej liczbie zmiennych.
Obsługa brakujących danych z imputacją w R

Kompromis między szybkością a dokładnością w praktyce

Ustawienia domyślne:

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

Zmniejszone lasy:

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
Obsługa brakujących danych z imputacją w R

Czas na ćwiczenia!

Obsługa brakujących danych z imputacją w R

Preparing Video For Download...