Nettoyage des données

La sélection des fonctionnalités, le processus de recherche et de sélection des fonctionnalités les plus utiles dans un ensemble de données, est une étape cruciale du pipeline d’apprentissage automatique. Les fonctionnalités inutiles diminuent la vitesse d’apprentissage, diminuent l’interprétabilité du modèle et, surtout, diminuent les performances de généralisation sur l’ensemble de test. L’objectif est donc le nettoyage des données.

nettoyage des données

Le FeatureSelector inclut certaines des méthodes de sélection de fonctionnalités les plus courantes :

  • Fonctionnalités avec un pourcentage élevé de valeurs manquantes
  • Caractéristiques colinéaires (hautement corrélées)
  • Fonctionnalités sans importance dans un modèle arborescent
  • Fonctionnalités de faible importance
  • Fonctionnalités avec une seule valeur unique

Dans cet article, nous allons parcourir l’utilisation de FeatureSelector sur un exemple d’ensemble de données d’apprentissage automatique. Nous verrons comment cela nous permet de mettre en œuvre rapidement ces méthodes, permettant un flux de travail plus efficace.

Le sélecteur de fonctionnalités propose cinq méthodes pour rechercher les fonctionnalités à supprimer. Nous pouvons accéder à toutes les fonctionnalités identifiées et les supprimer manuellement des données, ou utiliser la fonction de suppression dans le sélecteur de fonctionnalités.

Ici, nous passerons en revue chacune des méthodes d’identification et montrerons également comment les 5 peuvent être exécutées en même temps. Le FeatureSelector dispose en outre de plusieurs capacités de traçage, car l’inspection visuelle des données est un élément crucial de l’apprentissage automatique.

Valeurs manquantes

La première méthode pour rechercher des entités à supprimer est simple : recherchez des entités avec une fraction de valeurs manquantes au-dessus d’un seuil spécifié. L’appel ci-dessous identifie les caractéristiques avec plus de 60 % de valeurs manquantes (le gras est la sortie).

fs.identify_missing(missing_threshold = 0.6)17 features with greater than 0.60 missing values.

Nous pouvons voir la fraction de valeurs manquantes dans chaque colonne d’un dataframe :

fs.missing_stats.head()

Pour voir les fonctionnalités identifiées pour suppression, nous accédons à l’attribut ops du FeatureSelector , un dict Python avec des fonctionnalités sous forme de listes dans les valeurs.

missing_features = fs.ops['missing']
missing_features[:5]
['OWN_CAR_AGE',
'YEARS_BUILD_AVG',
'COMMONAREA_AVG',
'FLOORSMIN_AVG',
'LIVINGAPARTMENTS_AVG']

Enfin, nous avons un graphique de la distribution des valeurs manquantes dans toutes les fonctionnalités :

fs.plot_missing()
Nettoyage des données nettoyage des données

Colonnes colinéaires

Les caractéristiques colinéaires sont des caractéristiques fortement corrélées les unes aux autres. Dans l’apprentissage automatique, ceux-ci entraînent une diminution des performances de généralisation sur l’ensemble de test en raison d’une variance élevée et d’une moindre interprétabilité du modèle.

La méthode identify_collinear trouve les caractéristiques colinéaires en fonction d’une valeur de coefficient de corrélation spécifiée. Pour chaque paire de caractéristiques corrélées, il identifie l’une des caractéristiques à supprimer (puisque nous n’avons besoin d’en supprimer qu’une) :

fs.identify_collinear(correlation_threshold = 0.98)21 features with a correlation magnitude greater than 0.98.

Une visualisation soignée que nous pouvons faire avec des corrélations est une carte thermique. Cela montre toutes les caractéristiques qui ont au moins une corrélation au-dessus du seuil :

fs.plot_collinear()
Nettoyage des données nettoyage des données

Comme auparavant, nous pouvons accéder à la liste complète des fonctionnalités corrélées qui seront supprimées, ou voir les paires de fonctionnalités hautement corrélées dans une base de données.

# list of collinear features to remove
collinear_features = fs.ops['collinear']
# dataframe of collinear features
fs.record_collinear.head()
Nettoyage des données nettoyage des données

Si nous voulons étudier notre ensemble de données, nous pouvons également créer un graphique de toutes les corrélations dans les données en transmettant plot_all = True à l’appel :

Nettoyage des données nettoyage des données

Colonnes à importance zéro

Les deux méthodes précédentes peuvent être appliquées à n’importe quel ensemble de données structurées et sont déterministes : les résultats seront les mêmes à chaque fois pour un seuil donné. La méthode suivante est conçue uniquement pour les problèmes d’apprentissage automatique supervisé où nous avons des étiquettes pour former un modèle et est non déterministe. La fonction identify_zero_importance recherche les fonctionnalités qui n’ont aucune importance selon un modèle d’apprentissage de la machine à gradient boostant (GBM).

Avec des modèles d’apprentissage automatique basés sur des arborescences, comme un ensemble de boosting, nous pouvons trouver l’importance des fonctionnalités. La valeur absolue de l’importance n’est pas aussi importante que les valeurs relatives, que nous pouvons utiliser pour déterminer les caractéristiques les plus pertinentes pour une tâche. Nous pouvons également utiliser les importances des fonctionnalités pour la sélection des fonctionnalités en supprimant les fonctionnalités d’importance nulle. Dans un modèle basé sur une arborescence, les fonctionnalités sans importance ne sont pas utilisées pour diviser les nœuds, et nous pouvons donc les supprimer sans affecter les performances du modèle.

Le FeatureSelector trouve les importances des fonctionnalités à l’aide de la machine de renforcement de gradient de la bibliothèque LightGBM. Les importances des caractéristiques sont moyennées sur 10 exécutions de formation du GBM afin de réduire la variance. En outre, le modèle est entraîné à l’aide d’un arrêt précoce avec un ensemble de validation (il existe une option pour désactiver cette option) pour éviter le surajustement des données d’entraînement.

Le code ci-dessous appelle la méthode et extrait les caractéristiques d’importance nulle :

# Pass in the appropriate parameters
fs.identify_zero_importance(task = 'classification',
eval_metric = 'auc',
n_iterations = 10,
early_stopping = True)
# list of zero importance features
zero_importance_features = fs.ops['zero_importance']
63 features with zero importance after one-hot encoding.

Les paramètres que nous passons sont les suivants :

  • task : soit « classification » soit « régression » correspondant à notre problème
  • eval_metric: métrique à utiliser pour l’arrêt anticipé (inutile si l’arrêt anticipé est désactivé)
  • n_iterations : nombre d’exécutions d’entraînement pour faire la moyenne des importances des fonctionnalités
  • early_stopping: si oui ou non utiliser l’arrêt précoce pour la formation du modèle

Cette fois, nous obtenons deux graphiques avec plot_feature_importances :

# plot the feature importances
fs.plot_feature_importances(threshold = 0.99, plot_n = 12)
124 features required for 0.99 of cumulative importance
Nettoyage des données nettoyage des données
Nettoyage des données nettoyage des données

En haut, nous avons les caractéristiques les plus importantes de plot_n (tracées en termes d’importance normalisée où le total est égal à 1).

En bas, nous avons l’importance cumulée par rapport au nombre de fonctionnalités. La ligne verticale est tracée au seuil de l’importance cumulée, dans ce cas 99 %.

Deux notes sont bonnes à retenir pour les méthodes basées sur l’importance :

  • L’entraînement de la machine d’amplification de gradient est stochastique, ce qui signifie que l’importance des fonctionnalités changera à chaque exécution du modèle

Cela ne devrait pas avoir d’impact majeur (les fonctionnalités les plus importantes ne deviendront pas soudainement les moindres) mais cela modifiera l’ordre de certaines fonctionnalités. Cela peut également affecter le nombre de caractéristiques d’importance nulle identifiées. Ne soyez pas surpris si l’importance des fonctionnalités change à chaque fois !

  • Pour entraîner le modèle d’apprentissage automatique, les fonctionnalités sont d’abord encodées à chaud. Cela signifie que certaines des fonctionnalités identifiées comme ayant une importance de 0 peuvent être des fonctionnalités codées à chaud ajoutées lors de la modélisation.

Colonnes à peu d'importance

La méthode suivante s’appuie sur la fonction d’importance zéro, en utilisant les importances des caractéristiques du modèle pour une sélection plus poussée. La fonction identifier_low_importance recherche les caractéristiques les moins importantes qui ne contribuent pas à une importance totale spécifiée.

Par exemple, l’appel ci-dessous trouve les fonctionnalités les moins importantes qui ne sont pas requises pour atteindre 99 % de l’importance totale :

fs.identify_low_importance(cumulative_importance = 0.99)123 features required for cumulative importance of 0.99 after one hot encoding.
116 features do not contribute to cumulative importance of 0.99.

Sur la base du tracé de l’importance cumulative et de ces informations, la machine d’amplification de gradient considère que de nombreuses fonctionnalités ne sont pas pertinentes pour l’apprentissage. Encore une fois, les résultats de cette méthode changeront à chaque entraînement.

Pour afficher toutes les importances des fonctionnalités dans un dataframe :

fs.feature_importances.head(10)
Nettoyage des données nettoyage des données

La méthode de faible importance emprunte à l’une des méthodes d’utilisation de l’analyse en composantes principales (ACP) où il est courant de ne conserver que le PC nécessaire pour conserver un certain pourcentage de la variance (par exemple, 95 %). Le pourcentage de l’importance totale pris en compte repose sur la même idée.

Les méthodes basées sur l’importance des caractéristiques ne sont vraiment applicables que si nous allons utiliser un modèle basé sur un arbre pour faire des prédictions. En plus d’être stochastiques, les méthodes basées sur l’importance sont une approche de boîte noire en ce sens que nous ne savons pas vraiment pourquoi le modèle considère les caractéristiques comme non pertinentes. Si vous utilisez ces méthodes, exécutez-les plusieurs fois pour voir comment les résultats changent, et créez peut-être plusieurs ensembles de données avec différents paramètres à tester !

Colonnes à valeur unique

La dernière méthode est assez basique : recherchez toutes les colonnes qui ont une seule valeur unique. Une fonctionnalité avec une seule valeur unique ne peut pas être utile pour le machine learning, car cette fonctionnalité a une variance nulle. Par exemple, un modèle arborescent ne peut jamais diviser une caractéristique avec une seule valeur (puisqu’il n’y a pas de groupes dans lesquels diviser les observations).

Il n’y a pas de paramètres à sélectionner ici, contrairement aux autres méthodes :

fs.identify_single_unique()4 features with a single unique value.

Nous pouvons tracer un histogramme du nombre de valeurs uniques dans chaque catégorie :

fs.plot_unique()
Nettoyage des données nettoyage des données

Un point à retenir est que les NaN sont supprimés avant le calcul des valeurs uniques dans Pandas par défaut.calculating unique values in Pandas by default.

Retirer les colonnes

Une fois que nous avons identifié les fonctionnalités à supprimer, nous avons deux options pour les supprimer. Toutes les fonctionnalités à supprimer sont stockées dans l’ops dict de FeatureSelector et nous pouvons utiliser les listes pour supprimer des fonctionnalités manuellement. Une autre option consiste à utiliser la fonction intégrée de suppression.

Pour cette méthode, nous transmettons les méthodes à utiliser pour supprimer des fonctionnalités. Si nous voulons utiliser toutes les méthodes implémentées, nous passons simplement methods = ‘all’.

# Remove the features from all methods (returns a df)
train_removed = fs.remove(methods = 'all')
['missing', 'single_unique', 'collinear', 'zero_importance', 'low_importance'] methods have been run

Removed 140 features.

Cette méthode renvoie une trame de données avec les fonctionnalités supprimées. Pour supprimer également les fonctionnalités encodées à chaud qui sont créées lors du machine learning :

train_removed_all = fs.remove(methods = 'all', keep_one_hot=False)Removed 187 features including one-hot features.

Il peut être judicieux de vérifier les fonctionnalités qui seront supprimées avant de poursuivre l’opération ! L’ensemble de données d’origine est stocké dans l’attribut data du FeatureSelector en tant que sauvegarde !

Pipeline du nettoyage des données

Plutôt que d’utiliser les méthodes individuellement, nous pouvons toutes les utiliser avec identify_all. Cela prend un dictionnaire des paramètres pour chaque méthode :

fs.identify_all(selection_params = {'missing_threshold': 0.6,    
'correlation_threshold': 0.98,
'task': 'classification',
'eval_metric': 'auc',
'cumulative_importance': 0.99})
151 total features out of 255 identified for removal after one-hot encoding.

Notez que le nombre total de fonctionnalités changera car nous avons réexécuté le modèle. La fonction de suppression peut ensuite être appelée pour supprimer ces fonctionnalités.

La classe Feature Selector implémente plusieurs opérations courantes pour supprimer des fonctionnalités avant d’entraîner un modèle de machine learning. Il offre des fonctions d’identification des fonctionnalités à supprimer ainsi que des visualisations. Les méthodes peuvent être exécutées individuellement ou toutes en même temps pour des flux de travail efficaces.

Les méthodes missing, collinear et single_unique sont déterministes, tandis que les méthodes basées sur l’importance des caractéristiques changent à chaque exécution. La sélection de fonctionnalités, tout comme le domaine de l’apprentissage automatique, est largement empirique et nécessite de tester plusieurs combinaisons pour trouver la réponse optimale. Il est recommandé d’essayer plusieurs configurations dans un pipeline, et le sélecteur de fonctionnalités offre un moyen d’évaluer rapidement les paramètres de sélection des fonctionnalités.