IA/ML.NET : Embarquez du Machine Learning dans vos applications .NET

Vous êtes développeur .NET et intéressé par le Machine Learning ? Cet article vous permettra de découvrir comment créer des modèles prédictifs en C# grâce au récent framework Machine Learning de Microsoft appelé ML.NET. Actuellement, il est encore en preview et disponible sur Windows, Linux et Mac OS grâce au .NET Core. Si vous souhaitez en savoir plus sur les bases du Machine Learning je vous recommande la lecture de l’un de mes précédents articles sur ce sujet.
Vous trouverez le code complet de l’application console sur mon repo github.
Petit conseil de grand-mère pour bien débuter en Machine Learning !
Faire du Machine Learning peut paraître très compliqué dans certaines situations, notamment lorsqu’il s’agit de comprendre ce qui se passe réellement afin d’améliorer les résultats. On a tendance à choisir un algorithme et à prier pour que ça marche. Une fois que les résultats sont plutôt satisfaisants, on se dit ça y est, on tient quelque chose, on peut donc garder ce modèle !
Au final, on a un modèle dont on ne comprend pas grand chose et qui fait “soit-disant” le boulot à un instant T. Mais qu’en sera-t-il dans 6 mois lorsque beaucoup plus données auront été infusées dans votre SI ? Avez-vous pensé à continuellement mettre à jour votre modèle prédictif en fonction des nouveaux cas, des nouveaux patterns, etc. ?
N’oubliez pas, faire du Machine Learning c’est comme pratiquer un art martial, il faut continuellement apprendre de nouvelles situations afin d’éviter d’être surpris par son adversaire.
Le ML.NET dans tout ça ?
Ce framework disponible sur Windows, MacOS et Linux vous permettra de débuter tout doucement en faisant abstraction de tout ce qui relève de la tuyauterie, car ce n’est pas vraiment important au début. Ce qui compte, c’est de savoir ce que voulez, ce qui est fait et comment c’est fait. Les subtilités du langage de programmation importe peu au début du moment que le job est fait.
De plus ce framework a l’avantage de rendre simple toutes les phases de développement du Machine Learning en introduisant la notion de pipeline :
MLNET Pipeline main component
Voici le lien github du repository officiel si vous souhaitiez jeter un œil au code source ou contribuer.
Un peu de code
Dans l’un de mes précédents articles sur le machine learning en python, nous avons créé un modèle régressif qui permettait de prédire le montant des ventes d’une boisson appelée Mémoria en fonction de l’âge moyen des consommateurs, de la température et de la probabilité qu’ils aient déjà été sous traitement. Reprenons ce même jeu de données et essayons de développer ce modèle en C# grâce au ML.NET.
Créez une application console .net core depuis votre VS ou bien à l’aide de la commande suivante :
dotnet new console
Ensuite, rajoutez le package nugget Microsoft.ml à votre projet. Pour les fous du terminal comme moi, voici la commande :
dotnet add package Microsoft.ml
Le fichier csv que vous avez récemment téléchargé est représenté en ML.NET comme suit :
public class Sell { [Column("1")] public float Age; [Column("2")] public float CityCode; [Column("3")] public float Amount; [Column("4")] public float Temperature; [Column("5")] public float TreatedProbability; }
L’attribut column permet (mais pas que) d’indiquer la position de la colonne dans le fichier csv. Ensuite, voici le code qui permet de construire le pipeline et de générer le modèle :
public static Task<PredictionModel<Sell, SellPrediction>> Build(CancellationToken Token) { return Task.Factory.StartNew(() => { //Creation du pipeline var pipeline = new LearningPipeline(); //Chargement du fichier d'entrainement pipeline.Add(new TextLoader(Files.LoadTrainDataSet()).CreateFrom&lt;Sell&gt;(useHeader: true, separator: ',')); //Load data //Selection de la colonne à prédire (Y) pipeline.Add(new ColumnCopier(("Amount", "Label"))); //Selection des colonnes aidant à prédire (X) pipeline.Add(new ColumnConcatenator("Features", "Age", "CityCode", "Temperature", "TreatedProbability")); //select features (X) //Selection de l'algorithme utilisé pour la prédiction pipeline.Add(new FastTreeRegressor()); //Lancement du processus d'entrainement return pipeline.Train<Sell, SellPrediction>(); }); }
Ça y est, en quelque lignes de code on a pu charger les données, sélectionner nos Xi et Yi puis entrainer le modèle en faisant une régression. Nous avons choisi d’effectuer une régression basée en quelque sorte, sur des arbres de décision à construction dynamique. Mais rien de vous empêche de choisir d’autres algorithmes ou même de créer vos propres algorithmes en implantant l’interface ILearningPipelineItem.
La classe SellPrediction contient les données en sortie c’est-à-dire la valeur prédite.
Sauvegarder le modèle
Pour sauvegarder le modèle sur votre disque ou dans un blob storage par exemple, il vous suffit d’utiliser la méthode WriteAsync qui prend soit un chemin sous forme de chaine soit un flux (Stream).
Dans l’exemple de code précédent, le modèle entrainé que nous avons généré est sauvegardé sur le disque sous forme de fichier compressé zip. Si vous décompressez ce fichier, vous constaterez qu’il contient d’autres fichiers binaires représentant votre modèle.
Voici le code complet de la fonction main :
static async Task Main(string[] args) { using (var source = new CancellationTokenSource()) { var model = await MemoriaAgent.Build(source.Token); var evaluation = await model.Evaluate(); Console.WriteLine($" Root Mean Square Error : {evaluation.Rms}"); Console.WriteLine($" Coef of determination : {evaluation.RSquared}"); var test = new Sell { Temperature = 7, Age = 72, TreatedProbability = 0.7741935483870968f, CityCode = 1 }; var prediction = model.Predict(test); Console.WriteLine($"Prediction is {prediction.Amount}"); Console.WriteLine($"Saving the model..."); await model.SaveAsync(source.Token); Console.WriteLine($"Reloading the model..."); var loadedModel = await PredictionModel.ReadAsync<Sell, SellPrediction>(Files.LoadStorePath()); prediction = loadedModel.Predict(test); Console.WriteLine($"Prediction using previous test data is {prediction.Amount}"); } }
Sauvegarder c’est bien mais déployer c’est encore mieux
Vous pouvez déployer le modèle sauvegardé où voulez du moment que la plateforme supporte le .Net Core. Que cela soit sur du docker, dans une Azure fonction ou une web api, votre fichier zip peut être rechargé n’importe où et utiliser directement pour des futures prédictions. Mais attention, n’oubliez pas le conseil de grand-mère au tout début, un service Machine Learning déployé doit être mis à jour continuellement afin d’assurer la précision des résultats au cours du temps compte tenu des paramètres changeants.
Pour aller plus loin
Il est possible de consulter le graphe d’expérimentation à chaque traitement et de consommer les événements associés à ce dernier. Vous pouvez également personnaliser la manière dont les données sont chargées et transformées. Je vous invite à jeter un œil aux exemples du repository officiel pour plus d’informations.