Imputation KNN avec R

Feb 20 2023
pré-traitement de vos données KNN signifie k-plus proches voisins, un algorithme non paramétrique (non paramétrique signifie que l'algorithme ne fait aucune hypothèse sur la distribution sous-jacente des données). Cet algorithme KNN est normalement utilisé pour les tâches de classification et de régression.

pré-traiter vos données

Photo par redcharlie | @ redcharlie1 sur Unsplash

KNN signifie k-plus proches voisins, un algorithme non paramétrique (non paramétrique signifie que l'algorithme ne fait aucune hypothèse sur la distribution sous-jacente des données). Cet algorithme KNN est normalement utilisé pour les tâches de classification et de régression. Les classifications des points sont faites en les comparant aux k points de données les plus proches dans l'ensemble d'apprentissage et en attribuant le point à l'étiquette de classe la plus courante parmi ces k voisins. KNN est une méthode de classification basée sur les données.

J'ai quelques données concernant les réservations, mais il y a un problème avec les données car il y a des valeurs manquantes ainsi que certaines valeurs qui ne semblent pas correctes.

Je vais extraire les données dans R, vérifier la qualité des données et imputer les données.

Commençons!

Ma configuration :


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") 

Je n'ai pas besoin d'appeler skimr via un appel de bibliothèque.

skimr::skim(booking)

Dans le visuel ci-dessus, en bas à droite, il y a un petit histogramme qui me montre une valeur de 999999 qui semble être hors de propos, je me demande si c'est un problème, définitivement une valeur aberrante.

Je veux regarder un visuel des données manquantes. Le résumé des données skimr :: skim ci-dessus m'indique qu'il y a 3 valeurs manquantes pour 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)

Nous devrons remplacer les valeurs dans les années 2001, 2002 et 2005. Les valeurs aberrantes ,valeurs 999999, puis je devrai imputer les valeurs manquantes.

L'imputation des valeurs manquantes consiste à remplacer les valeurs manquantes par des valeurs estimées. Il existe de nombreuses méthodes pour imputer les valeurs manquantes, mais j'utiliserai :

  • Imputation moyenne : remplacer les valeurs manquantes par la moyenne.
  • Imputation des K plus proches voisins : remplacez les valeurs manquantes par la moyenne des k plus proches voisins dans les données.

data_na <- booking %>%
  replace_with_na(replace = list(Nights = 999999))
data_na %>% skimr::skim()

Ça a l'air mieux, l'histogramme des nuits semble presque normalement distribué !

Voyons ce qu'il reste à rectifier :

library(naniar)
gg_miss_var(data_na)

      
                

Note:

J'ajoute la bibliothèque avant d'obtenir certains de ces graphiques de valeurs manquantes, le geom_miss_point utilise des bibliothèques : ggplot ainsi que naniar .

library(naniar)
ggplot(data = data_na) +
  geom_miss_point(mapping = aes(x=obs, 
y=Nights)) + 
labs(title = "Missing points",
color = "Year"
)

      
                

Je peux exécuter une imputation moyenne, puis l'écrémage à nouveau :

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))

      
                

Remarque : bind_shadow()ajoute un autre ensemble de colonnes, une pour chaque variable, indiquant si elle est manquante ou non.

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" )

Choisir k

Nous devons choisir une valeur pour k.

Si nous choisissons un petit nombre, la valeur imputée sera un peu instable (moyenne de quelques valeurs seulement).

Si nous choisissons une grande valeur de k, la valeur imputée devrait être beaucoup plus stable (la moyenne de beaucoup de données) mais nous incorporerons des informations provenant de certains cas assez éloignés de l'enregistrement en question.

Normalement, 5 est un bon nombre pour commencer, mais nous devons également examiner la taille de l'ensemble de données.

Conclusion

Nous devons toujours examiner attentivement nos données, les valeurs semblent-elles correctes, travaillons-nous avec des distributions de données similaires ou les valeurs aberrantes sont-elles courantes. Cela dépendra de l'expérience et de l'industrie.

Personnellement, j'aime l'imputation knn, mais l'entreprise pour laquelle nous effectuons ce travail doit toujours être d'accord avec le choix de l'imputation, car cela affectera le résultat final.

J'espère que vous avez apprécié cet article et que vous l'avez trouvé utile.

Veuillez me suivre pour plus d'articles sur R , Julia , Python et les statistiques appliquées !