Einleitung: Kann C# mit Python im ML-Bereich konkurrieren?
Die Welt des maschinellen Lernens (ML) war lange Zeit ausschließlich mit Python verbunden. Eine riesige Anzahl von Bibliotheken (scikit-learn, PyTorch, TensorFlow), eine aktive Community und eine Fülle von Lernmaterialien haben Python zur unangefochtenen Nummer eins gemacht. Allerdings fragen sich Entwickler, die mit C# und der .NET-Plattform arbeiten, oft: Kann ich mein gewohntes Werkzeug für ML-Aufgaben nutzen? Die Antwort lautet: Ja, das ist möglich, jedoch mit gewissen Einschränkungen.
In diesem Artikel betrachten wir, welche Werkzeuge das .NET-Ökosystem für maschinelles Lernen bereitstellt, wo ihre Stärken liegen und wo C# Python noch unterlegen ist. Der Artikel ist sowohl für .NET-Entwickler nützlich, die in die Welt des ML einsteigen möchten, als auch für Data Scientists, die nach Alternativen suchen.
ML.NET: Die native Bibliothek von Microsoft
Das wichtigste Werkzeug für maschinelles Lernen in C# ist ML.NET. Es handelt sich um eine plattformübergreifende Open-Source-Bibliothek, die von Microsoft speziell für das .NET-Ökosystem entwickelt wurde. Sie ermöglicht es, ML-Modelle direkt in C#-Anwendungen zu integrieren, ohne auf Python umsteigen zu müssen.
Wichtige Funktionen von ML.NET
- Training und Inferenz: ML.NET unterstützt sowohl das Training von Modellen von Grund auf als auch das Laden von vortrainierten Modellen.
- Typische Aufgaben: Klassifikation, Regression, Clustering, Ranking, Anomalieerkennung, Textanalyse (Sentimentanalyse).
- AutoML: Ein integrierter Mechanismus zur automatischen Auswahl des besten Algorithmus und der Hyperparameter (Automated Machine Learning).
- ONNX-Integration: Unterstützung des Open Neural Network Exchange (ONNX)-Formats zum Importieren von Modellen aus PyTorch oder TensorFlow.
Beispiel: Preisvorhersage (Regression) mit ML.NET
Betrachten wir ein einfaches Beispiel für das Training eines Modells zur Vorhersage von Immobilienpreisen basierend auf der Wohnfläche. Zuerst definieren wir die Datenklasse:
public class HousingData{ public float Size { get; set; } public float Price { get; set; }}
public class PricePrediction{ [ColumnName("Score")] public float Price { get; set; }}Jetzt schreiben wir den Code für das Training:
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($"Vorhergesagter Preis: {prediction.Price:F2}");Wie Sie sehen, ist die API für .NET-Entwickler intuitiv verständlich. Es ist jedoch wichtig zu verstehen: ML.NET unterstützt Deep Learning (neuronale Netze) nicht so flexibel wie Keras oder PyTorch.
TensorFlow.NET und der SciSharp Stack
Für Deep-Learning-Aufgaben in C# gibt es das Projekt TensorFlow.NET (TF.NET). Es handelt sich um ein .NET-Binding für das originale TensorFlow, mit dem Sie neuronale Netze in C# erstellen, trainieren und ausführen können. Zusammen mit den SciSharp-Bibliotheken (Keras.NET, NumSharp, Pandas.NET) bildet es ein Analogon zum Python-Stack für .NET.
Beispiel: Ein einfaches neuronales Netz mit TensorFlow.NET
using Tensorflow;using static Tensorflow.Binding;using NumSharp;
// Erstellen eines einfachen Sequential-Modellsvar model = keras.Sequential();model.add(keras.layers.Dense(128, activation: "relu", input_shape: new Shape(784)));model.add(keras.layers.Dense(10, activation: "softmax"));
// Kompilierungmodel.compile(optimizer: "adam", loss: "categorical_crossentropy", metrics: new[] { "accuracy" });
// Laden der MNIST-Daten (über NumSharp)var (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data();x