Tutoriel : Classer des fleurs d’iris en utilisant le clustering k-means avec ML.NET

Ce tutoriel montre comment utiliser ML.NET pour générer un modèle de clustering pour le jeu de données Iris.

Dans ce tutoriel, vous allez apprendre à :

  • Comprendre le problème
  • Sélectionner la tâche d’apprentissage automatique appropriée
  • Préparer les données
  • Charger et transformer les données
  • Choisir un algorithme d’apprentissage
  • Entraîner le modèle
  • Utiliser le modèle pour les prévisions

Prérequis

Comprendre le problème

Ce problème concerne la division de l’ensemble des iris en différents groupes basés sur les caractéristiques de la fleur. Ces caractéristiques sont la longueur et la largeur d’un sépale, ainsi que la longueur et la largeur d’un pétale. Pour ce tutoriel, supposons que le type de chaque fleur est inconnu. Vous souhaitez connaître la structure d’un jeu de données à partir des caractéristiques et prédire la façon dont une instance de données s’intègre à cette structure.

Sélectionner la tâche d’apprentissage automatique appropriée

Comme vous ne savez pas à quel groupe appartient chaque fleur, vous choisissez la tâche Apprentissage automatique non supervisé. Pour diviser un jeu de données en groupes de telle sorte que les éléments dans le même groupe soient plus similaires les uns aux autres qu’à ceux des autres groupes, utilisez une tâche d’apprentissage automatique de clustering.

Création d’une application console

  1. Créez une application console C# appelée « IrisFlowerClustering ». Cliquez sur le bouton Suivant.

  2. Choisissez .NET 6 comme framework à utiliser. Cliquez sur le bouton Créer.

  3. Créez un répertoire nommé Data dans votre projet pour enregistrer le jeu de données et les fichiers de modèle :

    Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet, puis sélectionnez Ajouter>Nouveau dossier. Tapez « Données » et appuyez sur Entrée.

  4. Installez le package NuGet Microsoft.ML :

    Notes

    Cet exemple utilise la dernière version stable des packages NuGet mentionnés, sauf indication contraire.

    Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet, puis sélectionnez Gérer les packages NuGet. Choisissez « nuget.org » comme Source du package, sélectionnez l’onglet Parcourir, recherchez Microsoft.ML, puis sélectionnez le bouton Installer. Cliquez sur le bouton OK dans la boîte de dialogue Aperçu des modifications, puis sur le bouton J’accepte dans la boîte de dialogue Acceptation de la licence si vous acceptez les termes du contrat de licence pour les packages répertoriés.

Préparer les données

  1. Téléchargez le jeu de données iris.data et enregistrez-le dans le dossier Data que vous avez créé à l’étape précédente. Pour plus d’informations sur le jeu de données Iris, consultez la page Wikipédia Iris de Fisher et la page Iris Data Set, qui est la source du jeu de données.

  2. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le fichier iris.data et sélectionnez Propriétés. Sous Avancé, définissez la valeur Copier dans le répertoire de sortie sur Copier si plus récent.

Le fichier iris.data contient cinq colonnes qui représentent :

  • la longueur des sépales en centimètres
  • la largeur des sépales en centimètres
  • la longueur des pétales en centimètres
  • la largeur des pétales en centimètres
  • le type d’iris

Dans le cadre de cet exemple de clustering, ce tutoriel ignore la dernière colonne.

Créer des classes de données

Créez des classes pour les données d’entrée et les prédictions :

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet, puis sélectionnez Ajouter>Nouvel élément.

  2. Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez Classe et définissez la valeur du champ Nom sur IrisData.cs. Ensuite, sélectionnez le bouton Ajouter.

  3. Ajoutez la directive using suivante au nouveau fichier :

    using Microsoft.ML.Data;
    

Supprimez la définition de classe existante et ajoutez le code suivant, qui définit les classes IrisData et ClusterPrediction, au fichier IrisData.cs :

public class IrisData
{
    [LoadColumn(0)]
    public float SepalLength;

    [LoadColumn(1)]
    public float SepalWidth;

    [LoadColumn(2)]
    public float PetalLength;

    [LoadColumn(3)]
    public float PetalWidth;
}

public class ClusterPrediction
{
    [ColumnName("PredictedLabel")]
    public uint PredictedClusterId;

    [ColumnName("Score")]
    public float[]? Distances;
}

IrisData est la classe des données d’entrée et a des définitions pour chaque caractéristique du jeu de données. Utilisez l’attribut LoadColumn pour spécifier les index des colonnes sources dans le fichier de jeu de données.

La classe ClusterPrediction représente la sortie du modèle de clustering appliqué à une instance IrisData. Utilisez l’attribut ColumnName pour lier les champs PredictedClusterId et Distances aux colonnes PredictedLabel et Score respectivement. Dans le cas de la tâche de clustering, ces colonnes ont la signification suivante :

  • La colonne PredictedLabel contient l’ID du cluster prédit.
  • La colonne Score contient un tableau avec les distances Euclidiennes au carré jusqu’aux centroïdes des clusters. La longueur du tableau est égale au nombre de clusters.

Notes

Utilisez le type float pour représenter les valeurs à virgule flottante dans les classes de données d’entrée et de prédiction.

Définir des chemins de données et de modèle

Revenez au fichier Program.cs et ajoutez deux champs pour contenir les chemins du fichier de jeu de données et du fichier pour enregistrer le modèle :

  • _dataPath contient le chemin du fichier avec le jeu de données utilisé pour l’apprentissage du modèle.
  • _modelPath contient le chemin du fichier où le modèle formé est stocké.

Ajoutez le code suivant sous les instructions using pour spécifier ces chemins :

string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");

Créer un contexte ML

Ajoutez les directives using supplémentaires suivantes en haut du fichier Program.cs :

using Microsoft.ML;
using IrisFlowerClustering;

Remplacez la ligne Console.WriteLine("Hello World!"); par le code suivant :

var mlContext = new MLContext(seed: 0);

La classe Microsoft.ML.MLContext représente l’environnement Machine Learning et fournit des mécanismes de journalisation et des points d’entrée pour le chargement des données, l’apprentissage du modèle, la prédiction et d’autres tâches. Cela s’apparente conceptuellement à l’aide DbContext dans Entity Framework.

Configurer le chargement des données

Ajoutez le code sous MLContext pour configurer la façon de charger des données :

IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');

La méthode d’extension générique MLContext.Data.LoadFromTextFile déduit du type IrisData fourni le schéma du jeu de données et retourne IDataView, qui peut être utilisé en entrée de transformateurs.

Créer un pipeline d’apprentissage

Pour ce tutoriel, le pipeline d’apprentissage de la tâche de clustering comprend les deux étapes suivantes :

  • concaténer des colonnes chargées en une seule colonne Fonctionnalités, utilisée par un formateur en clustering ;
  • utiliser un formateur KMeansTrainer pour former le modèle à l’aide de l’algorithme de clustering k-means++.

Ajoutez ceci après le chargement des données :

string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
    .Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
    .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));

Le code spécifie que le jeu de données doit être divisé en trois clusters.

Entraîner le modèle

Les étapes ajoutées dans les sections précédentes ont préparé le pipeline pour l’apprentissage, toutefois, aucune n’a été exécutée. Ajoutez la ligne suivante dans le bas du fichier pour effectuer le chargement des données et l’entraînement du modèle :

var model = pipeline.Fit(dataView);

Enregistrer le modèle

À ce stade, vous disposez d’un modèle qui peut être intégré à n’importe laquelle de vos applications .NET existantes ou nouvelles. Pour enregistrer votre modèle dans un fichier .zip, ajoutez le code suivant sous l’appel de la méthode Fit :

using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
    mlContext.Model.Save(model, dataView.Schema, fileStream);
}

Utiliser le modèle pour les prévisions

Pour effectuer des prédictions, utilisez la classe PredictionEngine<TSrc,TDst> qui prend des instances du type d’entrée via le pipeline de transformateur et produit des instances du type de sortie. Ajoutez la ligne suivante pour créer une instance de cette classe :

var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);

PredictionEngine est une API pratique qui vous permet d’effectuer une prédiction sur une seule instance de données. PredictionEngine n’est pas thread-safe. Il est acceptable de l’utiliser dans des environnements monothreads ou de prototype. Pour améliorer les performances et la sécurité des threads dans les environnements de production, utilisez le service PredictionEnginePool, qui crée un ObjectPool d’objets PredictionEngine à utiliser dans votre application. Consultez ce guide sur l’utilisation de PredictionEnginePool dans une API web ASP.NET Core.

Notes

L’extension de service PredictionEnginePool est disponible en préversion.

Créez la classe TestIrisData qui contiendra les instances de données de test :

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le projet, puis sélectionnez Ajouter>Nouvel élément.

  2. Dans la boîte de dialogue Ajouter un nouvel élément, sélectionnez Classe, puis remplacez la valeur du champ Nom par TestIrisData.cs. Ensuite, sélectionnez le bouton Ajouter.

  3. Modifiez la classe pour la rendre statique, comme dans l’exemple suivant :

    static class TestIrisData
    

Ce tutoriel présente une instance de données d’iris au sein de cette classe. Vous pouvez ajouter d’autres scénarios à tester avec le modèle. Ajoutez le code suivant à la classe TestIrisData :

internal static readonly IrisData Setosa = new IrisData
{
    SepalLength = 5.1f,
    SepalWidth = 3.5f,
    PetalLength = 1.4f,
    PetalWidth = 0.2f
};

Pour déterminer à quel cluster l’élément spécifié appartient, revenez au fichier Program.cs et ajoutez le code suivant dans le bas du fichier :

var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");

Exécutez le programme pour voir quel cluster contient l’instance de données spécifiée et les distances au carré à partir de cette instance jusqu’aux centroïdes des clusters. Vous devriez obtenir les résultats suivants :

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

Félicitations ! Vous venez de créer un modèle d’apprentissage automatique de clustering des iris et l’avez utilisé pour réaliser des prédictions. Vous trouverez le code source de ce tutoriel dans le dépôt GitHub dotnet/samples.

Étapes suivantes

Dans ce didacticiel, vous avez appris à :

  • Comprendre le problème
  • Sélectionner la tâche d’apprentissage automatique appropriée
  • Préparer les données
  • Charger et transformer les données
  • Choisir un algorithme d’apprentissage
  • Entraîner le modèle
  • Utiliser le modèle pour les prévisions

Consultez notre référentiel GitHub pour continuer l’apprentissage et obtenir d’autres exemples.