Introduction : C# dans le monde de l'apprentissage automatique
Le monde de l'apprentissage automatique (ML) est fortement associé à Python : TensorFlow, PyTorch, scikit-learn — voilà la boîte à outils principale du data scientist. Cependant, l'écosystème .NET et le langage C# offrent une voie alternative. La plateforme ML.NET de Microsoft permet d'intégrer le ML directement dans les applications métier en C#, sans avoir à réécrire le code en Python. Mais est-ce vraiment pratique ? Dans cet article, nous analyserons les possibilités réelles, les limites et écrirons du code fonctionnel en C# pour l'apprentissage automatique.
Sur le site pythonlib.ru, nous parlons souvent de Python, mais aujourd'hui, nous examinons le problème sous un autre angle. C# est un langage fortement typé et performant, et son utilisation pour le ML peut être justifiée dans des environnements d'entreprise où il existe déjà du code legacy en .NET.
Principales possibilités de ML.NET : que sait faire C# ?
ML.NET est une bibliothèque multiplateforme open source. Elle prend en charge les algorithmes classiques : régression, classification, clustering, ainsi que l'apprentissage profond via l'intégration avec TensorFlow et ONNX.
1. Classification de textes (Analyse de sentiment)
L'exemple le plus populaire est l'analyse de sentiment. ML.NET permet d'entraîner un modèle en C# sans appeler de scripts externes.
using Microsoft.ML;using Microsoft.ML.Data;
// 1. Définir le schéma des donnéespublic class SentimentData{ public string Text { get; set; } public bool Label { get; set; }}
public class SentimentPrediction{ [ColumnName("PredictedLabel")] public bool Prediction { get; set; } public float Probability { get; set; }}
// 2. Charger les données et entraîner le modèlevar context = new MLContext();IDataView data = context.Data.LoadFromTextFile<SentimentData>("data.tsv", separatorChar: '\\t');
var pipeline = context.Transforms.Text.FeaturizeText("Features", nameof(SentimentData.Text)) .Append(context.BinaryClassification.Trainers.SdcaLogisticRegression());
var model = pipeline.Fit(data);
// 3. Faire une prédictionvar predictionEngine = context.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);var result = predictionEngine.Predict(new SentimentData { Text = "C# is great for ML!" });Console.WriteLine($"Sentiment: {(result.Prediction ? "Positive" : "Negative")}");Ce code est totalement autonome. Vous n'avez pas besoin de Python, ni de requêtes REST vers des services externes. Tout fonctionne dans le cadre d'un seul processus .NET.
2. Intégration avec TensorFlow et ONNX
Si vous avez besoin d'un réseau de neurones (par exemple, pour la reconnaissance d'images), ML.NET peut charger un modèle pré-entraîné TensorFlow ou ONNX et l'utiliser pour l'inférence.
var pipeline = context.Transforms.LoadImages("Image", folder, "ImagePath") .Append(context.Transforms.ResizeImages("Image", 224, 224)) .Append(context.Transforms.ExtractPixels("Input", "Image")) .Append(modelTensorFlow);
var prediction = pipeline.Fit(data).CreatePredictionEngine<ImageData, ImagePrediction>(data);var result = prediction.Predict(new ImageData { ImagePath = "cat.jpg" });Un point important : l'entraînement d'un réseau de neurones complexe en C# est actuellement impossible — pour cela, il faut utiliser Python. Mais le chargement et l'utilisation d'un modèle prêt à l'emploi sont un scénario 100% fonctionnel.
Limites de C# pour le ML : pourquoi Python est-il toujours meilleur ?
Malgré tous ses avantages, C# perd face à Python sur plusieurs aspects clés.
1. Taille de la communauté et des bibliothèques
Le nombre de packages NuGet pour le ML est des centaines de fois inférieur à celui de PyPI. Si vous avez besoin de quelque chose de non standard (par exemple, un nouvel algorithme issu d'un article de 2024), il y a de fortes chances que cela n'existe qu'en Python. ML.NET est mis à jour une fois par trimestre, alors que scikit-learn et PyTorch le sont presque en continu.
2. Entraînement des modèles (Training)
ML.NET gère très bien les tâches sur des données tabulaires (régression, classification). Mais pour