EDA sous un angle différent

image

Nous ne parlerons pas de nourriture, mais d’ analyse exploratoire des données (EDA ), qui est un prélude obligatoire à tout ML sévère.

Soyons honnêtes, le processus est plutôt ennuyeux et afin d'obtenir au moins quelques informations significatives sur nos données, vous devez passer suffisamment de temps à utiliser activement votre bibliothèque de visualisation préférée.

Imaginez maintenant que nous sommes assez paresseux (mais curieux) et suivrons ce postulat tout au long de cet article.

Sur cette base, nous nous posons la question suivante: existe-t-il un outil si délicat dans la nature qui permettrait simplement d'appuyer sur CTRL + ENTRÉE dans votre IDE préféré et d'afficher sur un seul écran (sans faire défiler vers le bas et d'innombrables facettes microscopiques) une image complète avec des informations utiles sur notre jeu de données?

En même temps, nous gardons à l'esprit une pensée différente - si un tel instrument existe, il ne remplacera pas l'EDA classique, mais il nous sera d'une grande aide dans les cas où vous n'avez pas à consacrer des heures à la visualisation pour souligner rapidement les principaux modèles de nos données.

La structure de cet article:

  1. Petit prétraitement
  2. Visualisation des prédicteurs
  3. Discrétisation des variables
  4. Correlationfunnel
  5. Corrélations croisées classées
  6. easyalluvial

Nous terminons avec l'introduction et prenons comme base un exemple pratique.

Exemple d'approche
Au départ, je voulais prendre un tableau de données obscur, mais à la fin j'ai réalisé que, par exemple, ce ne serait pas très bon - les modèles trouvés peuvent sembler peu évidents et donc controversés, mais notre objectif est de préparer le tableau avec des algorithmes qui n'ont pas d'informations a priori et nous montreront ce que nous le savons déjà, confirmant ainsi notre viabilité.


Le Titanic m'a paru le plus pratique à titre d'exemple, sa taille n'est pas trop petite comme Iris, il a des variables non informatives, il est bien étudié et a des prédicteurs clairs et, surtout, une base historique.

De plus, j'ai trouvé un article sur Habré où l'auteur a effectué un EDA plutôt méticuleux de cet ensemble de données et sur la base des photos, j'ai démontré les résultats. Ce sera une sorte de référence.

Lien vers l'article avec un grand nom pour notre "Baseline_EDA":
Titanic sur Kaggle: Vous ne lirez pas cet article à la fin .

Afin de ne pas se soucier de télécharger / lire des fichiers csv depuis le réseau, nous capturons immédiatement l'ensemble de données d'origine de CRAN

install.packages("titanic") data("titanic_train",package="titanic") 

Bref prétraitement


Cet exemple est tellement encerclé dans le réseau par le prétraitement de haut en bas que je ne vais pas particulièrement engloutir ce sujet, je fais des choses basiques: j'extrais le nom de la gonoratora (titre) comme un prédicteur important et je l'utilise pour combler les écarts d'âge.

 library(tidyverse) titanic_train %>% str d <- titanic_train %>% as_tibble %>% mutate(title=str_extract(Name,"\\w+\\.") %>% str_replace(fixed("."),"")) %>% mutate(title=case_when(title %in% c('Mlle','Ms')~'Miss', #   title=='Mme'~ 'Mrs', title %in% c('Capt','Don','Major','Sir','Jonkheer', 'Col')~'Sir', title %in% c('Dona', 'Lady', 'Countess')~'Lady', TRUE~title)) %>% mutate(title=as_factor(title), Survived=factor(Survived,levels = c(0,1),labels=c("no","yes")), Sex=as_factor(Sex), Pclass=factor(Pclass,ordered = T)) %>% group_by(title) %>% #  -      mutate(Age=replace_na(Age,replace = median(Age,na.rm = T))) %>% ungroup #             table(d$title,d$Sex) 

titremâlefemme
Monsieur5170
Madame0126
Mlle0185
Maître400
Monsieur80
Rev60
Dr61
Dame02

Tous les yaourts ne sont pas également sains ...


Habituellement, au début de l'analyse, je mets de côté les variables non informatives (je mets de côté et ne supprime pas définitivement, car lorsque j'obtiens le maximum du modèle, l'ingénierie pour certaines des variables en attente donne un certain pourcentage du gain de qualité du modèle).

Les métriques pour évaluer «l'utilité» d'une variable sont freqRatio (le rapport des fréquences de la valeur la plus populaire par rapport à la deuxième valeur en fréquence) et percentUnique (puissance ou cardinalité - la proportion d'un nombre unique de valeurs par rapport au nombre total de valeurs)
Une aide détaillée peut être vue à partir du package caret
?caret::nearZeroVar

 (feat.scan <- caret::nearZeroVar(x = d,saveMetrics = T) %>% rownames_to_column("featName") %>% as_tibble) 

image

Il est plus pratique pour moi de surveiller les variables dans un plan bidimensionnel (en enregistrant les deux axes de sorte que les points ne se superposent pas dans un petit tas en raison de points aberrants).
Je ne me suis jamais demandé si cette étape était l'EDA, mais en écrivant cet article, j'ai pensé: nous menons maintenant une analyse exploratoire de l'utilité des prédicteurs, leur évaluation visuelle, alors pourquoi n'est-ce pas l'EDA?

 # install.packages("ggrepel") library(ggrepel) ggplot(feat.scan,aes(x=percentUnique,y=freqRatio,label=featName,col=featName))+ geom_point(size=2)+ geom_text_repel(data = feat.scan,size=5)+scale_x_log10()+scale_y_log10()+theme_bw() 

image

Nous considérons les prédicteurs aberrants comme non informatifs en termes de puissance (axe X) ou de rapport de fréquence (axe Y) et, en conséquence, mis de côté:
PassengerId Nom; Ticket Cabine

 useless.feature <- c("PassengerId","Name","Ticket","Cabin") d <- d %>% select_at(vars(-useless.feature)) 

Cet univers est discret


Afin de comprendre comment les bibliothèques répertoriées ci-dessous préparent les données - dans cette section, nous montrons avec de petits exemples ce qui se passe dans ces bibliothèques au stade de la préparation des données.

À la première étape, il est nécessaire de regrouper toutes les données dans un seul type - souvent, les données d'un même ensemble peuvent être catégoriques et numériques, de plus, les nombres peuvent avoir des valeurs aberrantes et les données catégorielles peuvent être des catégories rares.

Pour convertir des variables continues en variables catégorielles, nous pouvons décomposer nos nombres en bacs avec une certaine période d'échantillonnage.

L'exemple le plus simple de décomposition en 5 bacs:

 iris %>% as_tibble %>% mutate_if(is.numeric,.funs = ggplot2::cut_number,n=5) 

image

Pour obtenir la force et la directivité des relations des éléments individuels entre les prédicteurs, une deuxième astuce est utilisée - un encodage à chaud

 library(recipes) iris %>% as_tibble %>% mutate_if(is.numeric,cut_number,n=5) %>% recipe(x = .) %>% step_dummy(all_nominal(),one_hot = T) %>% prep %>% juice %>% glimpse 

Au lieu de 5 prédicteurs, nous en avons maintenant 23, mais binaires:

image

En général, les astuces de conversion s'arrêtent là, mais le travail de 2 bibliothèques sur 3 pour notre EDA «non classique» commence par ces étapes.

Ensuite, je présente la fonctionnalité de 3 bibliothèques de visualisation:

  1. Correlationfunnel - montre l'effet des valeurs individuelles des prédicteurs sur une cible (c'est-à-dire, vous pouvez l'appeler apprentissage supervisé par l'EDA)
  2. Lares - montre l'effet des valeurs des prédicteurs individuels sur les autres valeurs individuelles des autres prédicteurs (c'est-à-dire, vous pouvez l'appeler apprentissage non supervisé EDA)
  3. easyalluvial - montre la relation cumulative des valeurs groupées des prédicteurs «X» supérieurs par cible (c'est-à-dire, vous pouvez l'appeler apprentissage supervisé par l'EDA)

Il est évident que leur fonctionnalité est différente, par conséquent, en faisant la démonstration de ces bibliothèques, je citerai les conclusions de l'auteur de l' article de notre "Baseline_EDA" en fonction de la fonctionnalité décrite ci-dessus de ce paquet. (Par exemple, si l'auteur montre la dépendance de l'âge à la survie, je vais insérer une telle citation dans le Correlationfunnel, si l'âge est dans la classe, puis à Lares, etc.)

La première bibliothèque est sur scène.

tunnel de corrélation


correlationfunnel va accélérer l'analyse exploratoire des données (EDA)
image

La méthodologie est bien décrite dans la vignette de la bibliothèque; je vais donner un fragment de calcul de la corrélation par des valeurs binaires

image

La bibliothèque suppose la présence d'une cible (variable dépendante) dans nos données et immédiatement sur une image montre la force et la direction de la relation et se classe également par ordre décroissant de cette force formant un entonnoir visuel (en fait, c'est de là que vient le nom).

Les fonctions de binarisation intégrées à la bibliothèque vous permettent de réduire les petites catégories en Autres.

Comme la bibliothèque ne fonctionne pas avec des variables entières, nous les convertirons en numérique et reviendrons sur notre Titanic.

 #install.packages("correlationfunnel") library(correlationfunnel) d <- d %>% mutate_if(is.integer,as.numeric) d %>% binarize(n_bins = 5,thresh_infreq = .02,one_hot = T) %>% #    correlate(target = Survived__yes) %>% plot_correlation_funnel() # "interactive = T" - plotly! 

image

Sur l'axe X, nous avons la force et la direction de la corrélation, sur l'axe Y, nos prédicteurs sont classés par ordre décroissant. Le premier reflète toujours l'objectif comme il a la plus forte corrélation avec lui-même (-1; 1).

Vérifions comment les conclusions de ce graphique se chevauchent avec les conclusions de l'auteur de notre "Baseline_EDA".
Le graphique suivant confirme la théorie selon laquelle plus la classe de cabine des passagers est élevée, plus les chances de survie sont grandes. (Par "ci-dessus", je veux dire l'ordre inverse, car la première classe est plus élevée que la seconde et, surtout, la troisième.)
L'entonnoir montre que la classe est le troisième prédicteur en termes de force de corrélation, et en effet, dans la 3ème classe, la corrélation inverse, dans la 1ère, le fort positif.
Comparez les chances de survie des hommes et des femmes. Les données confirment la théorie exprimée précédemment.

(En général, on peut déjà dire que les principaux facteurs du modèle seront le sexe du passager)

L'entonnoir montre que le sexe du passager est le 2e selon le degré de corrélation, le sexe féminin est corrélé à la survie, le sexe masculin est corrélé à la mort.
Vous pouvez également tester l'hypothèse que les plus jeunes survivent, car ils se déplacent plus vite, nagent mieux, etc.

Comme vous pouvez le voir, une dépendance explicite n'est pas visible ici.

L'entonnoir parle vraiment de la faible signification de ce prédicteur (je me souviens que le gonorant / titre contient l'âge, c'est pourquoi l'âge n'est pas si important), mais même ici, l'entonnoir montre qu'il y a plus de chances de survivre dans les catégories «moins l'infini - 20 ans» (c'est-à-dire les enfants ) et 30-38 (personnes riches, éventuellement 1 classe).
Introduisons un indicateur tel que le pourcentage de survie et examinons sa dépendance à l'égard des groupes qui se sont révélés à l'étape précédente

(le groupe de l'auteur signifie le titre).

L'entonnoir confirme pleinement les conclusions de l'auteur
Examinons maintenant les informations qui peuvent être obtenues à partir du nombre de proches sur le navire.

Il est très probable que l'absence de parents, ainsi qu'un grand nombre, affecte négativement la survie.

SibSP dans l'entonnoir dit clairement la même chose.

Et bien sûr, en plus des conclusions de l'auteur, ici vous pouvez voir d'autres schémas, je laisse le plaisir de la contemplation au lecteur

Lares


Trouvez des informations grâce aux corrélations croisées classées

image

L'auteur de cette bibliothèque est allé encore plus loin - il montre les dépendances non seulement sur la cible, mais aussi sur tout.

Les corrélations croisées classées expliquent non seulement les relations d'une entité cible spécifique avec les autres, mais la relation de toutes les valeurs de vos données dans un format tabulaire facile à utiliser et à comprendre.

Il convertit automatiquement les colonnes catégorielles en numériques avec un encodage à chaud (1 et 0) et d'autres regroupements intelligents tels que des étiquettes «autres» pour les valeurs peu fréquentes et les nouvelles fonctionnalités obsolètes.


En utilisant le lien ci-dessus, vous pouvez voir un exemple où l'auteur alimente le jeu de données Star Wars dans son package et montre les dépendances trouvées, je suis resté sur sa page, très bien.

Essayons notre exemple.

 # ,     : # devtools::install_github("laresbernardo/lares") library(lares) corr_cross(df = d,top = 30) 

image

En plus de l'intersection avec les conclusions basées sur des citations, dans Correlationfunnell, nous présentons quelques citations que nous pouvons voir ici indépendamment de la cible:
D'autres modèles peuvent également être trouvés. Il existe une corrélation négative entre l'âge et la classe, ce qui est probablement dû aux passagers plus âgés qui pourraient plus souvent s'offrir une cabine plus chère.

Dans la citation ci-dessus, l'auteur tire une telle conclusion sur l'analyse de corrélation de 2 champs au total, mais au vu de One-Hot-Encoding, cela est évident à partir de la forte corrélation positive entre Age + P_Class_1.
De plus, le prix du billet et la classe sont étroitement liés (coefficient de corrélation élevé), ce qui est assez attendu.

Troisième ligne ci-dessus: Tarif + P_Classe_1

En plus de recouper les conclusions de l'auteur, ici on peut souligner des choses beaucoup plus intéressantes, je laisserai aussi le plaisir de la contemplation au lecteur.

En plus de la sélection facultative des X idées les plus puissantes, vous pouvez également refléter l'image entière et la place de ces points importants dans la masse totale

 corr_cross(df = d,type=2) 

image

easyalluvial


Exploration de données avec des parcelles alluviales

image

Ici, comme dans les 2 packages précédents, l'auteur effectue une binarisation des variables numériques au début, mais ensuite ses chemins avec ces bibliothèques divergent: au lieu de {One-HotEncoding + correlation}, la bibliothèque présente le X supérieur des prédicteurs les plus intéressants (l'utilisateur décide lesquels transférer) ) par valeurs, formant des flux dont la couleur dépend de la cible, et la largeur du flux sur le nombre d'observations dans ce flux.

Les variables numériques sont décomposées en catégories HH (High High), MH (Medium High), M (Medium), ML (Medium Low), LL (Low Low)

Tout d'abord, prenons les prédicteurs les plus significatifs basés sur le graphique de correlationfunnel:

 cor.feat <- c("title","Sex","Pclass","Fare") 

Ensuite, nous faisons un calendrier

 # install.packages("easyalluvial") library(easyalluvial) al <- d %>% select(Survived,cor.feat) %>% alluvial_wide(fill_by = "first_variable") add_marginal_histograms(p = al,data_input = d,keep_labels = F) 

image

Pour les citations de l'auteur, nous redessinons le graphique en utilisant les prédicteurs appropriés

 cor.feat <- c("Sex","Pclass","Age") al <- d %>% select(Survived,cor.feat) %>% alluvial_wide(fill_by = "first_variable") add_marginal_histograms(p = al,data_input = d,keep_labels = F) 

image

Par exemple, le graphique suivant montre clairement que les principaux groupes de survivants sont des femmes de première et deuxième années de tous âges.

Le graphique montre également que les femmes survivantes de 3e année ne sont pas non plus un petit groupe

Et parmi les hommes, tous les garçons de moins de 15 ans ont survécu, sauf la troisième classe de service et une petite proportion d'hommes plus âgés et principalement de la première classe.

Ce qui précède est confirmé, mais encore une fois, nous voyons les flux d'hommes de classe 3 survivants dans la catégorie d'âge LL, ML.

Tout ce qui précède concernait le paquet «easyalluvial», mais l'auteur a écrit un deuxième paquet «parcats» qui, en haut de l'intrigue, rend le graphique ci-dessus interactif (comme dans le titre de cette section).
Cela permet non seulement de voir le contexte de l'infobulle, mais aussi de réorienter les flux pour une meilleure perception visuelle. (malheureusement, alors que la bibliothèque n'est pas très optimisée et qu'elle ralentit sur titanic)

 # install.packages("parcats") library(parcats) cor.feat <- c("title","Sex","Pclass","Fare") a <- d %>% select(Survived,cor.feat) %>% alluvial_wide(fill_by = "first_variable") parcats(p = a,marginal_histograms = T,data_input = d) 

image

Bonus


La bibliothèque easyalluviale, en plus de l'analyse exploratoire des données, peut également être utilisée comme interprète pour les modèles de boîte noire (modèles analysant les paramètres dont on ne peut pas comprendre - par quelle logique le modèle donne une réponse basée sur certains prédicteurs).

Lien vers l'article de l'auteur: Visualisez la réponse du modèle avec des graphiques alluviaux
Et la particularité est que de toutes les bibliothèques que j'ai vues, le maximum sur un graphique expliquait la réponse de la boîte noire dans un système de coordonnées pas plus de 2 dimensions (une pour chaque prédicteur), la couleur expliquait la réponse.

La bibliothèque easyalluvial vous permet de faire cela sur plus de 2 prédicteurs en même temps (bien sûr, il vaut mieux ne pas se laisser emporter).

Par exemple, entraînons une forêt aléatoire sur notre tableau de données et reflétons l'explication d'une forêt aléatoire à l'aide de 3 prédicteurs.

 library(ranger) m <- ranger(formula = Survived~.,data = d,mtry = 6,min.node.size = 5, num.trees = 600, importance = "permutation") library(easyalluvial) (imp <- importance(m) %>% as.data.frame %>% easyalluvial::tidy_imp(imp = .,df=d)) #      #  N-     (   .  !)   dspace <- get_data_space(df = d,imp,degree = 3) #     pred = predict(m, data = dspace) alluvial_model_response(pred$predictions, dspace, imp, degree = 3) 

De plus, l'auteur a un connecteur pour les modèles CARET (je ne sais pas dans quelle mesure cela considère maintenant les tidymodels)

 library(caret) trc <- trainControl(method = "none") m <- train(Survived~.,data = d,method="rf",trControl=trc,importance=T) alluvial_model_response_caret(train = m,degree = 4,bins=5,stratum_label_size = 2.8) 

image

Conclusion


Encore une fois, je répète que je n'appelle pas au remplacement de l'EDA classique, mais je conviens que c'est bien quand il existe une alternative qui fait gagner beaucoup de temps, d'autant plus que les gens sont naturellement assez paresseux, et c'est, comme vous le savez, le moteur du progrès :)

Source: https://habr.com/ru/post/fr480532/


All Articles