Préparation des données pour Azure Machine Learning
Avant de pouvoir créer un modèle Machine Learning, vous devez préparer les données que vous utiliserez pour l’entraîner et l’évaluer. Les données sont ingérées dans Azure Databricks à partir de leur source, souvent sous forme de fichiers de données. Si vous le souhaitez, vous pouvez créer des tables delta basées sur les fichiers de données pour simplifier l’exploration et l’analyse des données. Une fois les données ingérées, un scientifique des données les prépare pour le Machine Learning.
En règle générale, la préparation des données implique deux tâches clés :
- Nettoyage des données : identification et atténuation des problèmes dans les données qui affecteront leur utilité pour le Machine Learning.
- Ingénierie et prétraitement des caractéristiques : sélection et transformation des caractéristiques appropriées pour l’entraînement du modèle.
Nettoyage des données
Les étapes spécifiques requises pour nettoyer les données varient d’un projet à l’autre, mais les problèmes classiques que vous devez résoudre sont les suivants :
- Données incomplètes : les données incluent souvent des enregistrements dans lesquels des champs individuels sont manquants (souvent indiqués par la présence de valeurs NULL). Vous devez identifier les valeurs manquantes et les atténuer en :
- Les remplaçant par un remplacement approprié ; soit en interpolant une valeur dans une série, en utilisant une valeur moyenne (ou médiane), soit en créant une autre valeur appropriée.
- Supprimant complètement les lignes incomplètes (en supposant que cela laisse suffisamment de données représentatives appropriées pour la modélisation)
- Erreurs : il n’est pas rare que les données incluent des erreurs, dues à des erreurs de saisie de données ou à l’échec du traitement des données en amont. La recherche d’erreurs peut être difficile et implique généralement un examen approfondi des données à l’aide de requêtes et de visualisations pour résumer les données et rechercher des valeurs qui ne s’alignent pas sur la plupart des autres valeurs d’un champ donné.
- Valeurs hors norme : les valeurs hors norme sont des valeurs qui sont nettement en dehors (au-dessus ou en dessous) de la distribution statistique des données. Parfois, les valeurs hors norme sont une indication d’une erreur (par exemple, une personne peut avoir entré une valeur avec un zéro supplémentaire ou omis une virgule décimale), et parfois il s’agit de valeurs authentiques qui sont exceptionnellement élevées ou faibles par rapport à la plupart des observations. Dans les deux cas, les valeurs extrêmes hors norme peuvent avoir un impact négatif sur l’entraînement d’un modèle Machine Learning ; il est donc généralement préférable de les gérer en les réinitialisant à une valeur de seuil supérieure ou inférieure, ou en supprimant les enregistrements qui contiennent des valeurs hors norme du jeu de données.
- Types de données incorrects : les algorithmes Machine Learning peuvent être sensibles aux types de données affectés aux valeurs de caractéristique. Il est courant que les jeux de données qui étaient basés sur des fichiers texte contenant des erreurs ou des valeurs null soient incorrectement convertis en champs numériques dans un type de données chaîne, et souvent les valeurs qui représentent des valeurs entières discrètes peuvent être incorrectement converties en nombres décimaux (ou inversement). Vous devez examiner le schéma de vos données et affecter les types de données appropriés qui reflètent le plus fidèlement les valeurs des données.
- Données déséquilibrées : l’entraînement Machine Learning fonctionne mieux si les données d’entraînement ont une représentation adéquate pour toutes les différentes combinaisons de caractéristiques et d’étiquettes qui peuvent être rencontrées. Dans un jeu de données déséquilibré, les enregistrements qui incluent une valeur catégorielle particulière ou une combinaison de champs sont surreprésentés ; cela peut influencer l’algorithme d’entraînement et introduire un biais dans le modèle. Une technique courante pour atténuer ce problème consiste à suréchantillonner les valeurs sous-représentées par des lignes dupliquées incluses, ou à sous-échantillonner les lignes surreprésentées (en les supprimant du jeu de données).
Dans Azure Databricks, la façon la plus courante de détecter et de gérer ces types de problèmes consiste à écrire du code dans un notebook qui explore et manipule les données. La classe principale utilisée pour ce type de manipulation de données est le dataframe Spark.
Par exemple, le code suivant charge les données d’un fichier texte dans un dataframe :
df = spark.read.format("csv").option("header", "true").load("/myfolder/mydata.csv")
Sinon, si les données ont été chargées dans une table delta de l’espace de travail Azure Databricks, vous pouvez utiliser une requête SQL pour charger leurs données dans un dataframe :
df = spark.sql("SELECT * FROM mytable")
Une fois les données chargées dans un dataframe, vous pouvez utiliser ses méthodes et d’autres fonctions dans la bibliothèque Spark SQL pour explorer et transformer les données. Par exemple, le code suivant utilise la méthode dropna pour supprimer toutes les lignes qui incluent des valeurs null et affecte des types de données spécifiques aux colonnes du dataframe.
clean_data = df.dropna().select(col("column1").astype("string"),
col("column2").astype("float"))
Conseil
Pour plus d’informations sur les fonctionnalités de dataframe Spark, consultez la documentation du dataframe Spark.
Ingénierie et prétraitement des caractéristiques
Après vous être assuré que le jeu de données est complet et propre, vous pouvez commencer à préparer les caractéristiques pour le Machine Learning. L’ingénierie de caractéristiques est une approche itérative qui implique souvent des essais et des erreurs pour déterminer quelles colonnes de caractéristiques ont une valeur prédictive et comment représenter au mieux les caractéristiques. Les tâches courantes d’ingénierie et de prétraitement des caractéristiques sont les suivantes :
Dérivation de nouvelles caractéristiques : souvent, vous pouvez dériver de nouvelles caractéristiques plus prédictives à partir de caractéristiques existantes. Par exemple, supposons qu’un jeu de données inclut une colonne date et que vous pensez que la date complète peut ne pas être un facteur prédictif important pour identifier l’étiquette, mais que le jour de la semaine peut l’être. Vous pouvez créer une caractéristique day_of_week dérivée de la date et tester votre théorie.
Discrétisation des caractéristiques numériques : dans certains cas, une valeur numérique peut s’avérer plus prédictive lorsqu’elle est discrétisée dans des catégories qui représentent des plages de valeurs spécifiques. Par exemple, vous pouvez prendre les valeurs numériques d’une caractéristique de bas et les affecter dans des catégories faible, moyen et élevé en fonction des seuils appropriés.
Encodage des caractéristiques catégorielles : de nombreux jeux de données incluent des données catégorielles représentées par des valeurs de chaîne. Toutefois, la plupart des algorithmes de Machine Learning fonctionnent mieux avec des données numériques. Il est donc courant d’affecter des codes numériques pour représenter des catégories au lieu de chaînes. Par exemple, un jeu de données de détails de produit peut inclure une caractéristique couleur qui peut avoir la valeur « Vert », « Rouge » ou « Bleu ». Vous pouvez encoder ces valeurs à l’aide de codes entiers simples tels que 0 pour « Vert », 1 pour « Rouge » et 2 pour « Bleu ». Vous pouvez également utiliser une technique d’encodage à chaud unique dans laquelle vous créez une colonne pour chaque catégorie possible et affectez la valeur 1 ou 0 à chaque colonne en fonction de chaque ligne, comme suit :
Colonne de couleur d’origine Vert Rouge Blue Vert 1 0 0 Bleu 0 0 1 Rouge 0 1 0 Mise à l’échelle (normalisation) des valeurs numériques : les valeurs de données numériques sont souvent à des échelles ou des unités de mesure différentes les unes des autres. Les algorithmes de Machine Learning les traitent toutes comme des valeurs numériques absolues, et les caractéristiques avec des valeurs plus grandes peuvent souvent dominer l’entraînement du modèle. Pour résoudre ce problème, il est courant de mettre à l’échelle toutes les colonnes numériques afin que les valeurs individuelles d’une seule colonne conservent la même relation proportionnelle entre elles, mais que toutes les colonnes numériques soient sur une échelle similaire. Par exemple, supposons qu’un jeu de données contienne des valeurs de longueur et de poids mesurées en mètres et en kilogrammes. Vous pouvez convertir ces deux caractéristiques en une valeur mise à l’échelle comprise entre 0 et 1 comme suit :
length poids scaled_length scaled_weight 250.0 2.1 0.250 0.210 176.0 0.9 0.176 0,09
De nombreuses bibliothèques Machine Learning incluent des classes que vous pouvez utiliser pour effectuer des tâches courantes d’ingénierie de caractéristiques. Par exemple, la bibliothèque Spark MLlib inclut la classe StringIndexer, que vous pouvez utiliser pour effectuer un encodage simple basé sur des entiers pour les valeurs de chaîne.
from pyspark.ml.feature import StringIndexer
encoder = StringIndexer(inputCol="catCol", outputCol="catColCode")
encoded_data = encoder.fit(data).transform(data)
Notes
Il est utile d’expliquer l’exemple de code StringIndexer un peu plus en détail. Les classes Spark MLlib peuvent inclure des évaluateurs qui correspondent à un algorithme pour une opération de transformation spécifique à des exemples de données. Dans ce cas, StringIndexer adapte un algorithme d’encodage aux valeurs de chaîne discrètes de la colonne catCol du dataframe data pour déterminer les calculs spécifiques requis pour générer une nouvelle colonne catColCode contenant les valeurs encodées. La sortie d’un évaluateur est un transformateur qui encapsule la fonction définie par l’évaluateur et qui peut appliquer cette fonction aux données et générer un nouveau dataframe. Dans cet exemple, nous transmettons les mêmes données que celles utilisées pour déterminer la fonction d’encodage au transformateur résultant pour appliquer réellement l’encodage.
Dans Spark MLLib, vous pouvez chaîner une séquence d’évaluateurs et de transformateurs dans un pipeline qui effectue toutes les étapes d’ingénierie et de prétraitement des caractéristiques dont vous avez besoin pour préparer vos données. Le pipeline peut se terminer par un algorithme de Machine Learning qui joue le rôle d’évaluateur pour déterminer les opérations requises pour prédire une étiquette à partir des caractéristiques préparées. La sortie du pipeline est un modèle Machine Learning, qui est en fait un transformateur qui peut être utilisé pour appliquer la fonction de modèle aux caractéristiques d’un dataframe et prédire les valeurs d’étiquette correspondantes.