Introduction : C# peut-il rivaliser avec Python en ML ?
Le monde du machine learning (ML) a longtemps été associé exclusivement à Python. Une vaste gamme de bibliothèques (scikit-learn, PyTorch, TensorFlow), une communauté active et une abondance de ressources pédagogiques ont fait de Python le leader incontesté. Cependant, les développeurs travaillant avec C# et la plateforme .NET se demandent souvent : puis-je utiliser un outil familier pour les tâches de ML ? La réponse est oui, vous le pouvez, mais avec certaines réserves.
Dans cet article, nous allons examiner les outils que l'écosystème .NET propose pour le machine learning, quels sont leurs points forts et où C# accuse encore un retard par rapport à Python. L'article sera utile aussi bien aux développeurs .NET souhaitant entrer dans le monde du ML qu'aux data scientists envisageant des alternatives.
ML.NET : La bibliothèque native de Microsoft
Le principal outil de machine learning en C# est ML.NET. Il s'agit d'une bibliothèque open-source multiplateforme développée par Microsoft spécifiquement pour l'écosystème .NET. Elle permet d'intégrer des modèles de ML directement dans des applications C# sans avoir à basculer vers Python.
Principales fonctionnalités de ML.NET
- Entraînement et Inférence : ML.NET prend en charge à la fois l'entraînement de modèles à partir de zéro et le chargement de modèles pré-entraînés.
- Tâches courantes : Classification, régression, clustering, classement, détection d'anomalies, analyse de sentiment textuel.
- AutoML : Un mécanisme intégré pour sélectionner automatiquement le meilleur algorithme et les hyperparamètres (Apprentissage Automatique Automatisé).
- Intégration ONNX : Prise en charge du format Open Neural Network Exchange (ONNX) pour importer des modèles depuis PyTorch ou TensorFlow.
Exemple : Prédiction de prix (Régression) avec ML.NET
Regardons un exemple simple d'entraînement d'un modèle pour prédire les prix de l'immobilier en fonction de la superficie. Tout d'abord, définissons la classe de données :
public class HousingData{ public float Size { get; set; } public float Price { get; set; }}
public class PricePrediction{ [ColumnName("Score")] public float Price { get; set; }}Écrivons maintenant le code d'entraînement :
using Microsoft.ML;
var context = new MLContext();var data = context.Data.LoadFromTextFile<HousingData>("housing.csv", separatorChar: ',');
var pipeline = context.Transforms.Concatenate("Features", new[] { "Size" }) .Append(context.Regression.Trainers.Sdca(labelColumnName: "Price"));
var model = pipeline.Fit(data);
var predictionEngine = context.Model.CreatePredictionEngine<HousingData, PricePrediction>(model);var prediction = predictionEngine.Predict(new HousingData { Size = 75f });
Console.WriteLine($"Predicted price: {prediction.Price:F2}");Comme vous pouvez le voir, l'API est intuitive pour un développeur .NET. Cependant, il est important de comprendre : ML.NET ne prend pas en charge l'apprentissage profond (réseaux de neurones) aussi flexiblement que Keras ou PyTorch.
TensorFlow.NET et la pile SciSharp
Pour les tâches d'apprentissage profond en C#, il existe le projet TensorFlow.NET (TF.NET). Il s'agit d'une liaison .NET avec le TensorFlow original, permettant de créer, d'entraîner et d'exécuter des réseaux de neurones en C#. Avec les bibliothèques SciSharp (Keras.NET, NumSharp, Pandas.NET), il forme un équivalent de la pile Python pour .NET.
Exemple : Réseau de neurones simple avec TensorFlow.NET
using Tensorflow;using static Tensorflow.Binding;using NumSharp;
// Create a simple Sequential modelvar model = keras.Sequential();model.add(keras.layers.Dense(128, activation: "relu", input_shape: new Shape(784)));model.add(keras.layers.Dense(10, activation: "softmax"));
// Compilationmodel.compile(optimizer: "adam", loss: "categorical_crossentropy", metrics: new[] { "accuracy" });
// Load MNIST data (via NumSharp)var (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data();x