Partager via


Présentation de ML.NET et de son fonctionnement

ML.NET vous donne la possibilité d’ajouter le Machine Learning aux applications .NET, dans des scénarios en ligne ou hors connexion. Avec cette fonctionnalité, vous pouvez ensuite effectuer des prédictions automatiques à partir des données disponibles dans votre application. Les applications Machine Learning utilisent des modèles dans les données pour effectuer des prédictions plutôt que d’avoir besoin d’être explicitement programmées.

Le modèle Machine Learning est central dans ML.NET. Le modèle spécifie les étapes nécessaires pour transformer vos données d’entrée en prédiction. Avec ML.NET, vous pouvez entraîner un modèle personnalisé en spécifiant un algorithme, ou vous pouvez importer des modèles TensorFlow et ONNX préentraînés.

Une fois que vous avez un modèle, vous pouvez l’ajouter à votre application pour effectuer les prédictions.

ML.NET s’exécute sur Windows, Linux et macOS en tirant parti de .NET ou sur Windows en utilisant .NET Framework. Le mode 64 bits est pris en charge sur toutes les plateformes. Le mode 32 bits est pris en charge sur Windows, à l’exception des fonctionnalités TensorFlow, LightGBM et ONNX.

La tableau suivant illustre des exemples des types de prédiction possibles avec ML.NET.

Type de prédiction Exemple
Classification/catégorisation Classez automatiquement des commentaires de clients dans les catégories Positif et Négatif.
Régression/prédiction de valeurs continues Prévoyez le prix des maisons en fonction de la superficie et de l’emplacement.
Détection des anomalies Détectez des transactions bancaires frauduleuses.
Recommandations Suggérez des produits aux acheteurs en ligne en fonction de leurs achats précédents.
Série chronologique/de données séquentielles Prévoyez la météo ou les ventes de produits.
Classification d’images Catégorisez des pathologies dans des images médicales.
Classification de texte Catégoriser des documents en fonction de leur contenu.
Similitudes de phrases Mesurer la similarité de deux phrases.

Hello ML.NET World

Le code dans l’extrait suivant illustre l’application ML.NET la plus simple. Cet exemple crée un modèle de régression linéaire pour prédire les prix de maisons à partir des données de superficie et des prix immobiliers.

   using System;
   using Microsoft.ML;
   using Microsoft.ML.Data;

   class Program
   {
       public class HouseData
       {
           public float Size { get; set; }
           public float Price { get; set; }
       }

       public class Prediction
       {
           [ColumnName("Score")]
           public float Price { get; set; }
       }

       static void Main(string[] args)
       {
           MLContext mlContext = new MLContext();

           // 1. Import or create training data
           HouseData[] houseData = {
               new HouseData() { Size = 1.1F, Price = 1.2F },
               new HouseData() { Size = 1.9F, Price = 2.3F },
               new HouseData() { Size = 2.8F, Price = 3.0F },
               new HouseData() { Size = 3.4F, Price = 3.7F } };
           IDataView trainingData = mlContext.Data.LoadFromEnumerable(houseData);

           // 2. Specify data preparation and model training pipeline
           var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
               .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

           // 3. Train model
           var model = pipeline.Fit(trainingData);

           // 4. Make a prediction
           var size = new HouseData() { Size = 2.5F };
           var price = mlContext.Model.CreatePredictionEngine<HouseData, Prediction>(model).Predict(size);

           Console.WriteLine($"Predicted price for size: {size.Size*1000} sq ft= {price.Price*100:C}k");

           // Predicted price for size: 2500 sq ft= $261.98k
       }
   }

Workflow du code

Le diagramme suivant représente la structure du code de l’application ainsi que le processus itératif de développement du modèle :

  • Collecter et charger des données d’entraînement dans un objet IDataView
  • Spécifier un pipeline d’opérations pour extraire des caractéristiques et appliquer un algorithme de machine learning
  • Entraîner un modèle en appelant Fit() sur le pipeline
  • Évaluer le modèle et effectuer des itérations pour l’améliorer
  • Enregistrer le modèle au format binaire pour l’utiliser dans une application
  • Recharger le modèle dans un objet ITransformer
  • Effectuer des prédictions en appelant CreatePredictionEngine.Predict()

Workflow du développement d’application ML.NET, avec les composants pour la génération des données, le développement du pipeline, l’entraînement du modèle, l’évaluation du modèle et l’utilisation du modèle

Revoyons maintenant tous ces concepts un peu plus en détail.

Modèle Machine Learning

Un modèle ML.NET est un objet qui contient des transformations à effectuer sur vos données d’entrée pour produire la sortie prédite.

Basic

Le modèle de base, le plus simple, est la régression linéaire à deux dimensions, où une quantité continue est proportionnelle à une autre, comme dans l’exemple des prix de maisons ci-dessus.

Modèle de régression linéaire avec des paramètres de biais et de poids

Le modèle est simple : $Price = b + Size * w$. Les paramètres $b$ et $w$ sont estimés en ajustant une ligne sur un ensemble de paires de valeurs (size, price). Les données utilisées pour rechercher les paramètres du modèle sont appelées données d’entraînement. Les entrées d’un modèle Machine Learning sont des caractéristiques. Dans cet exemple, $Size$ est la seule caractéristique. Les valeurs certifiées vraies utilisées pour entraîner un modèle Machine Learning sont appelées des étiquettes. Ici, les étiquettes sont les valeurs $Price$ contenues dans le jeu de données d’entraînement.

Plus complexe

Un modèle plus complexe classe les transactions financières dans différentes catégories en fonction du texte de description de la transaction.

Chaque description de transaction est décomposée en un ensemble de caractéristiques, après suppression des mots et caractères redondants, et comptage des combinaisons de mots et caractères. L’ensemble des caractéristiques est ensuite utilisé pour entraîner un modèle linéaire basé sur l’ensemble des catégories trouvées dans les données d’entraînement. Plus une nouvelle description se rapproche d’une des descriptions figurant dans le jeu de données d’entraînement, plus elle a de chance d’être attribuée à la même catégorie.

Modèle de classification de texte

Le modèle de prix des maisons et le modèle de classification de texte sont tous les deux des modèles de type linéaire. Selon la nature de vos données et le problème à résoudre, vous pouvez également utiliser des modèles d’arbre de décision, des modèles additifs généralisés et d’autres modèles. Pour plus d’informations sur les modèles, consultez Tâches.

Préparation des données

Dans la plupart des cas, les données dont vous disposez ne peuvent pas être utilisées directement pour entraîner un modèle Machine Learning. Les données brutes doivent être préparées ou prétraitées afin de pouvoir ensuite être utilisées pour rechercher les paramètres de votre modèle. Par exemple, vous devrez peut-être convertir vos données de valeurs de chaîne en une représentation numérique, supprimer des informations redondantes dans vos données d’entrée, réduire ou développer les dimensions de vos données d’entrée, ou encore normaliser ou redimensionner vos données.

Les tutoriels ML.NET vous montrent différents pipelines de traitement des données (pour les données texte, d’image, numériques et de série chronologique) qui sont utilisés dans le cadre de tâches de machine learning spécifiques.

La rubrique Préparer vos données explique comment préparer des données de manière plus générale.

Vous trouverez toutes les transformations disponibles en annexe, dans la section des ressources.

Évaluation du modèle

Une fois que vous avez entraîné votre modèle, comment savoir si ses prédictions futures seront correctes ? Avec ML.NET, vous pouvez évaluer votre modèle par rapport à de nouvelles données de test.

Chaque type de tâche de machine learning présente des métriques qui permettent d’évaluer l’exactitude et la précision du modèle par rapport au jeu de données de test.

Dans notre exemple de prix des maisons, nous avons utilisé la tâche de régression. Pour évaluer le modèle, ajoutez le code suivant à l’exemple de code initial.

        HouseData[] testHouseData =
        {
            new HouseData() { Size = 1.1F, Price = 0.98F },
            new HouseData() { Size = 1.9F, Price = 2.1F },
            new HouseData() { Size = 2.8F, Price = 2.9F },
            new HouseData() { Size = 3.4F, Price = 3.6F }
        };

        var testHouseDataView = mlContext.Data.LoadFromEnumerable(testHouseData);
        var testPriceDataView = model.Transform(testHouseDataView);

        var metrics = mlContext.Regression.Evaluate(testPriceDataView, labelColumnName: "Price");

        Console.WriteLine($"R^2: {metrics.RSquared:0.##}");
        Console.WriteLine($"RMS error: {metrics.RootMeanSquaredError:0.##}");

        // R^2: 0.96
        // RMS error: 0.19

Les métriques d’évaluation indiquent une erreur relativement faible, et une forte corrélation entre la sortie prédite et la sortie du test. Facile, n’est-ce pas ? En réalité, vous aurez davantage de réglages à faire pour parvenir à des métriques de modèle satisfaisantes.

Architecture de ML.NET

Cette section décrit les modèles architecturaux de ML.NET. Si vous êtes un développeur .NET qualifié, certains de ces modèles vous sont déjà familiers, et d’autres moins.

Au démarrage de toute application ML.NET, il y a un objet MLContext. Cet objet singleton contient des catalogues. Un catalogue est une fabrique pour les composants de chargement et d’enregistrement des données, des transformations, des entraîneurs et de l’utilisation du modèle. Chaque objet du catalogue a des méthodes permettant de créer les différents types de composants.

Tâche Catalogue
Enregistrement et chargement des données DataOperationsCatalog
Préparation des données TransformsCatalog
Classification binaire BinaryClassificationCatalog
Classification multiclasse MulticlassClassificationCatalog
Détection des anomalies AnomalyDetectionCatalog
Clustering ClusteringCatalog
Prévisions ForecastingCatalog
Classement RankingCatalog
régression ; RegressionCatalog
Recommandation RecommendationCatalog
série chronologique TimeSeriesCatalog
Utilisation du modèle ModelOperationsCatalog

Vous pouvez accéder aux méthodes de création dans chacune des catégories ci-dessus. Dans Visual Studio, les catalogues s’affichent via IntelliSense.

IntelliSense pour les entraîneurs de régression

Générer le pipeline

Au sein de chaque catalogue, il existe un jeu de méthodes d’extension que vous pouvez utiliser pour créer un pipeline d’entraînement.

var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })
    .Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "Price", maximumNumberOfIterations: 100));

Dans l’extrait de code, Concatenate et Sdca sont deux méthodes figurant dans le catalogue. Chaque méthode crée un objet IEstimator qui est ajouté au pipeline.

À ce stade, les objets ont été créés, mais aucune exécution ne s’est produite.

Entraîner le modèle

Une fois que les objets dans le pipeline ont été créés, les données peuvent être utilisées pour entraîner le modèle.

var model = pipeline.Fit(trainingData);

L’appel de Fit() déclenche l’utilisation des données d’entraînement d’entrée pour estimer les paramètres du modèle. Ce processus est l’entraînement du modèle. Souvenez-vous que le modèle de régression linéaire affiché plus haut avait deux paramètres de modèle : le biais et le poids. Après l’appel de Fit(), les valeurs des paramètres sont connues. (La plupart des modèles ont beaucoup plus de paramètres que cela.)

Pour plus d’informations sur l’entraînement du modèle, consultez Entraîner votre modèle.

L’objet modèle obtenu implémente l’interface ITransformer. Autrement dit, le modèle transforme les données d’entrée en prédictions.

IDataView predictions = model.Transform(inputData);

Utiliser le modèle

Vous pouvez transformer les données d’entrée en prédictions soit en bloc, soit entrée par entrée. Dans l’exemple des prix de maisons, nous avons fait les deux : en bloc pour l’évaluation du modèle et un par un pour effectuer une nouvelle prédiction. Examinons le cas des prédictions uniques.

var size = new HouseData() { Size = 2.5F };
var predEngine = mlContext.CreatePredictionEngine<HouseData, Prediction>(model);
var price = predEngine.Predict(size);

La méthode CreatePredictionEngine() a une classe d’entrée et une classe de sortie. Les noms de champs ou les attributs de code déterminent les noms des colonnes de données utilisées durant l’entraînement du modèle et la prédiction de données. Pour plus d’informations, consultez Effectuer des prédictions avec un modèle entraîné.

Schéma et modèles de données

Les objets DataView sont au cœur du pipeline de machine learning de ML.NET.

Chaque transformation dans le pipeline a deux schémas : un schéma d’entrée (noms de données, types et tailles que la transformation s’attend à voir dans son entrée) et un schéma de sortie (noms de données, types et tailles générés suite à l’exécution de la transformation).

Si le schéma de sortie d’une transformation dans le pipeline ne correspond pas au schéma d’entrée de la transformation suivante, ML.NET lève une exception.

Un objet vue de données contient des colonnes et des lignes. Chaque colonne a un nom, un type et une longueur. Par exemple, les colonnes d’entrée dans l’exemple des prix de maisons sont Size et Price. Elles ont toutes deux un type et représentent des quantités scalaires plutôt que des quantités de vecteur.

Exemple d’objet vue de données dans ML.NET avec les données de prédiction des prix de maisons

Tous les algorithmes ML.NET recherchent une colonne d’entrée de type vectorielle. Par défaut, cette colonne vectorielle est appelée Fonctionnalités. C’est pourquoi nous avons concaténé la colonne Taille en une nouvelle colonne appelée Fonctionnalités dans l’exemple de prix de maison.

var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size" })

Tous les algorithmes créent également des colonnes après avoir effectué une prédiction. Les noms fixes de ces nouvelles colonnes dépendent du type d’algorithme de machine learning. Pour la tâche de régression, l’une des nouvelles colonnes s’appelle Score comme illustré dans l’attribut des données de prix.

public class Prediction
{
    [ColumnName("Score")]
    public float Price { get; set; }
}

Pour plus d’informations sur les colonnes de sortie des différentes tâches de machine learning, consultez le guide Tâches de machine learning.

Une propriété importante des objets DataView est leur évaluation tardive. Les objets vue de données sont uniquement chargés et traités pendant l’entraînement et l’évaluation du modèle, et durant la prédiction de données. Lors des phases d’écriture et de test de votre application ML.NET, vous pouvez utiliser le débogueur Visual Studio pour avoir un aperçu d’un objet vue de données en appelant la méthode Preview.

var debug = testPriceDataView.Preview();

Vous pouvez voir la variable debug dans le débogueur et examiner son contenu. N’utilisez pas la méthode Preview dans le code de production, car elle dégrade considérablement les performances.

Déploiement de modèle

Dans les applications réelles, votre code d’entraînement et d’évaluation du modèle sera séparé de votre code de prédiction. En fait, ces deux activités sont souvent effectuées par des équipes distinctes. L’équipe de développement du modèle peut enregistrer le modèle pour une utilisation dans l’application de prédiction.

mlContext.Model.Save(model, trainingData.Schema,"model.zip");

Étapes suivantes

  • Suivez plusieurs tutoriels pour apprendre à créer des applications avec différentes tâches de machine learning en utilisant des jeux de données plus réalistes.

  • Vous pouvez approfondir vos connaissances en consultant les guides pratiques.

  • Si vous en avez envie, vous pouvez directement vous plonger dans la documentation de référence des API.