Imputacja KNN z R
wstępne przetwarzanie Twoich danych
KNN oznacza k-najbliższych sąsiadów, algorytm nieparametryczny (nieparametryczny oznacza, że algorytm nie przyjmuje żadnych założeń dotyczących podstawowego rozkładu danych). Ten algorytm KNN jest zwykle używany do zadań klasyfikacji i regresji. Klasyfikacje punktów wykonuje się porównując je z k najbliższymi punktami danych w zbiorze uczącym i przypisując punktowi etykietę klasy, która jest najczęstsza wśród tych k sąsiadów. KNN to metoda klasyfikacji oparta na danych.
Mam pewne dane dotyczące rezerwacji, ale jest problem z danymi, ponieważ brakuje niektórych wartości, a także niektóre wartości, które nie wyglądają dobrze.
Przeciągnę dane do R, sprawdzę jakość danych i przypiszę dane.
Zacznijmy!
Moja konfiguracja:
library(knitr)
opts_chunk$set(fig.width=9, fig.height=7)
opts_chunk$set(comment="", fig.align="center", tidy=TRUE, fig.retina=2, cache = TRUE)
library(tidyverse)
library(broom)
library(naniar)
library(simputation)
library(VIM)
booking <- read.csv("https://raw.githubusercontent.com/NicJC/bookings_na/main/GuestNightsNA.csv")
Nie muszę dzwonić do skira przez połączenie z biblioteką.
skimr::skim(booking)
Na powyższej wizualizacji w prawym dolnym rogu znajduje się mały histogram, który pokazuje mi wartość 999999, która wydaje się być nie na miejscu. Zastanawiam się, czy to jest problem, zdecydowanie odstający.
Chcę spojrzeć na wizualizację brakujących danych. Powyższe podsumowanie danych skir::skim mówi mi, że brakuje 3 wartości dla Nights.
library(naniar)
vis_miss(booking)
library(naniar)
ggplot(data = booking) +
geom_miss_point(mapping = aes(x=obs,
y=Nights)) +
labs(title = "Missing data points by year") +
facet_wrap(~year)
Będziemy musieli podmienić wartości w latach 2001,2002 i 2005. Wartości odstające ,wartości 999999, a następnie będę musiał podpisać brakujące wartości.
Przypisywanie braków polega na zastąpieniu brakujących wartości wartościami szacunkowymi. Istnieje wiele metod wprowadzania brakujących wartości, ale użyję:
- Przypisanie średniej : zastąp brakujące wartości średnią.
- Imputacja K-najbliższego sąsiada : zastąp brakujące wartości średnią z k najbliższych sąsiadów w danych.
data_na <- booking %>%
replace_with_na(replace = list(Nights = 999999))
data_na %>% skimr::skim()
To wygląda lepiej, histogram Nocy wygląda prawie normalnie!
Spójrzmy, co pozostało do poprawienia:
library(naniar)
gg_miss_var(data_na)
Notatka:
Dodaję bibliotekę, zanim otrzymam niektóre z tych wykresów brakujących wartości, geom_miss_point używa bibliotek: ggplot oraz naniar .
library(naniar)
ggplot(data = data_na) +
geom_miss_point(mapping = aes(x=obs,
y=Nights)) +
labs(title = "Missing points",
color = "Year"
)
Mogę przeprowadzić średnie przypisanie, a następnie ponownie przejrzeć:
data_na %>%
mutate(Nights = impute_mean(Nights)) %>%
skimr::skim()
data_na %>%
bind_shadow() %>%
mutate(Nights = impute_mean(Nights)) %>%
ggplot() +
geom_point(mapping = aes(x =obs, y = Nights, col=Nights_NA))
Uwaga: bind_shadow()dodaje kolejny zestaw kolumn, po jednej dla każdej zmiennej, określając, czy jej brakuje, czy nie.
data_na %>%
bind_shadow() %>%
mutate(Nights = impute_mean(Nights))
data_na %>%
kNN(k=5) %>%
ggplot() +
geom_point(mapping = aes(x = obs,
y = Nights,
col=Nights_imp,
size = 1.2)) +
labs(title = "KNN5"
)
data_na %>%
kNN(k=50) %>%
ggplot() +
geom_point(mapping = aes(x = obs,
y = Nights,
col=Nights_imp,
size = 1.2)) +
labs(title = "KNN50"
)
Wybór k
Musimy wybrać wartość dla k.
Jeśli wybierzemy małą liczbę, to imputowana wartość będzie trochę niestabilna (średnia zaledwie kilku wartości).
Jeśli wybierzemy dużą wartość k, to imputowana wartość powinna być znacznie bardziej stabilna (średnia z wielu danych), ale uwzględnimy informacje z niektórych przypadków, które są dość odległe od danego rekordu.
Zwykle 5 to dobra liczba na początek, ale powinniśmy również przyjrzeć się rozmiarowi zbioru danych.
Wniosek
Zawsze musimy uważnie przyglądać się naszym danym, czy wartości wyglądają dobrze, czy pracujemy z podobnymi rozkładami danych, czy też często występują wartości odstające. Będzie to zależeć od eksperymentu i branży.
Osobiście lubię imputację knn, ale firma, dla której wykonujemy tę pracę, zawsze musi zgodzić się na wybór imputacji, ponieważ wpłynie to na ostateczny wynik.
Mam nadzieję, że podobał Ci się ten artykuł i okazał się przydatny.
Śledź mnie, aby uzyskać więcej artykułów na temat R , Julii , Pythona i stosowanych statystyk!

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































