Tutorial: Kategorisieren von Schwertlilien unter Verwendung eines k-Means-Algorithmus mit ML.NET
In diesem Tutorial wird die Verwendung von ML.NET zum Erstellen eines -Clustering-Modells für den -Irisblumen-Datensatzveranschaulicht.
In diesem Tutorial lernen Sie, wie man:
- Verstehen des Problems
- Wählen Sie die entsprechende Machine Learning-Aufgabe aus.
- Vorbereiten der Daten
- Laden und Transformieren der Daten
- Auswählen eines Lernalgorithmus
- Trainieren des Modells
- Verwenden des Modells für Vorhersagen
Voraussetzungen
Verstehen des Problems
Dieses Problem besteht darin, den Satz von Irisblumen in verschiedenen Gruppen auf der Grundlage der Blumenmerkmale aufzuteilen. Diese Merkmale sind die Länge und Breite eines Sepals sowie die Länge und Breite eines Petals. Gehen Sie in diesem Lernprogramm davon aus, dass die Art jeder Blume unbekannt ist. Sie möchten die Struktur eines Datasets aus den Features erlernen und vorhersagen, wie eine Dateninstanz zu dieser Struktur passt.
Wählen Sie die entsprechende Machine Learning-Aufgabe aus.
Da Sie nicht wissen, zu welcher Gruppe jede Blume gehört, wählen Sie die Aufgabe des unbeaufsichtigten maschinellen Lernens aus. Verwenden Sie eine Clustering- Machine Learning-Aufgabe, um einen Datensatz in Gruppen so zu unterteilen, dass Elemente in derselben Gruppe einander ähneln als denen in anderen Gruppen.
Erstellen einer Konsolenanwendung
Erstellen Sie eine C#-Konsolenanwendung namens "IrisFlowerClustering". Klicken Sie auf die Schaltfläche Weiter.
Wählen Sie .NET 8 als zu verwendende Framework aus. Klicken Sie auf die Schaltfläche Erstellen .
Erstellen Sie ein Verzeichnis mit dem Namen Data in Ihrem Projekt, um die Dataset- und Modelldateien zu speichern:
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Hinzufügen>Neuer Ordner aus. Geben Sie „Daten“ ein und drücken Sie die EINGABETASTE.
Installieren Sie das NuGet-Paket Microsoft.ML:
Anmerkung
In diesem Beispiel wird die neueste stabile Version der erwähnten NuGet-Pakete verwendet, sofern nichts anderes angegeben ist.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie NuGet-Pakete verwalten aus. Wählen Sie als Paketquelle „nuget.org“ aus. Klicken Sie dann auf die Registerkarte Durchsuchen, suchen Sie nach Microsoft.ML, und klicken Sie anschließend auf Installieren. Wählen Sie im Dialogfeld
Vorschauänderungen die SchaltflächeOK aus, und wählen Sie dann im DialogfeldLizenzakzeptanz die Schaltfläche"Ich akzeptiere" aus, wenn Sie den Lizenzbedingungen für die aufgeführten Pakete zustimmen.
Vorbereiten der Daten
Laden Sie das iris.data--Dataset herunter, und speichern Sie ihn im ordner Data, den Sie im vorherigen Schritt erstellt haben. Weitere Informationen zum Schwertlilien-Dataset finden Sie im englischen Wikipedia-Artikel Iris flower data set und auf der Website Iris Data Set, der Quelle des Datasets.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei iris.data, und wählen Sie Eigenschaften aus. Ändern Sie unter Erweitert den Wert von In Ausgabeverzeichnis kopieren in Kopieren, wenn neuer.
Die datei iris.data enthält fünf Spalten, die Folgendes darstellen:
- Kelchblattlänge in Zentimetern
- Kelchblattbreite in Zentimetern
- Kronblattlänge in Zentimetern
- Petalbreite in Zentimetern
- Typ der Irisblume
Aus Gründen des Clusteringbeispiels ignoriert dieses Lernprogramm die letzte Spalte.
Erstellen von Datenklassen
Erstellen Sie Klassen für die Eingabedaten und die Vorhersagen:
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und klicken Sie auf Hinzufügen>Neues Element.
Wählen Sie im Dialogfeld Neues Element hinzufügen die Option Klasse aus, und ändern Sie das Feld Name in IrisData.cs. Klicken Sie anschließend auf Hinzufügen.
Fügen Sie der neuen Datei die folgende
using
Direktive hinzu:using Microsoft.ML.Data;
Entfernen Sie die vorhandene Klassendefinition, und fügen Sie der Datei IrisData.cs den folgenden Code hinzu, der die Klassen IrisData
und ClusterPrediction
definiert:
public class IrisData
{
[LoadColumn(0)]
public float SepalLength;
[LoadColumn(1)]
public float SepalWidth;
[LoadColumn(2)]
public float PetalLength;
[LoadColumn(3)]
public float PetalWidth;
}
public class ClusterPrediction
{
[ColumnName("PredictedLabel")]
public uint PredictedClusterId;
[ColumnName("Score")]
public float[]? Distances;
}
IrisData
ist die Eingabedatenklasse und enthält Definitionen für jedes Feature aus dem Dataset. Verwenden Sie das Attribut LoadColumn, um die Indizes der Quellspalten in der Datasetdatei festzulegen.
Die ClusterPrediction
-Klasse stellt die Ausgabe des Clustermodells dar, das auf eine IrisData
Instanz angewendet wird. Verwenden Sie das Attribut ColumnName, um die Felder PredictedClusterId
und Distances
an die Spalten PredictedLabel bzw. Score zu binden. Im Fall der Clusteringaufgabe haben diese Spalten die folgende Bedeutung:
- Die Spalte PredictedLabel enthält die ID des vorhergesagten Clusters.
- Die Spalte Score enthält ein Array mit den quadratischen euklidischen Abständen zum Clusterschwerpunkt. Die Arraylänge entspricht der Anzahl der Cluster.
Anmerkung
Verwenden Sie den float
Typ, um Gleitkommawerte in den Eingabe- und Vorhersagedatenklassen darzustellen.
Definieren von Daten- und Modellpfaden
Wechseln Sie zurück zur Datei Program.cs, und fügen Sie zwei Felder hinzu, die die Pfade zur Datasetdatei und zur Datei zum Speichern des Modells enthalten:
_dataPath
enthält den Pfad zur Datei mit dem Datensatz, der zum Trainieren des Modells verwendet wird._modelPath
enthält den Pfad zu der Datei, in der das trainierte Modell gespeichert ist.
Fügen Sie den folgenden Code unter den using
-Direktiven hinzu, um diese Pfade anzugeben:
string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");
ML-Kontext erstellen
Fügen Sie am Anfang der Datei Program.cs folgende zusätzliche using
-Anweisungen hinzu:
using Microsoft.ML;
using IrisFlowerClustering;
Ersetzen Sie die Console.WriteLine("Hello World!");
Zeile durch den folgenden Code:
var mlContext = new MLContext(seed: 0);
Die Microsoft.ML.MLContext Klasse stellt die Machine Learning-Umgebung dar und stellt Mechanismen zum Protokollieren und Einstiegspunkte für das Laden von Daten, Modellschulungen, Vorhersage und andere Aufgaben bereit. Dies ist konzeptionell vergleichbar mit der Verwendung von DbContext
im Entity Framework.
Einrichten des Ladens von Daten
Fügen Sie den folgenden Code unterhalb von MLContext
hinzu, um die Methode zum Laden von Daten einzurichten:
IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
Die generische MLContext.Data.LoadFromTextFile
-Erweiterungsmethode leitet das Datasetschema aus dem bereitgestellten IrisData
-Typ ab und gibt IDataView zurück, was als Eingabe für Transformatoren verwendet werden kann.
Erstellen einer Lernpipeline
Im Rahmen dieses Tutorials umfasst die Pipeline der Clusteraufgabe die zwei folgenden Schritte:
- Verketten geladener Spalten zu einer Spalte Features, die von einem Clustertrainer verwendet wird;
- Verwenden eines KMeansTrainer-Trainers, um das Modell mithilfe des Clusteralgorithmus k-means++ zu trainieren.
Fügen Sie folgendes nach dem Laden der Daten hinzu:
string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
.Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
.Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));
Der Code gibt an, dass das Dataset in drei Cluster aufgeteilt werden soll.
Trainieren des Modells
Die in den vorangegangenen Abschnitten hinzugefügten Schritte haben die Pipeline für das Training vorbereitet, es wurden jedoch keine ausgeführt. Fügen Sie unten in der Datei die folgende Zeile hinzu, um datenlade- und Modellschulungen durchzuführen:
var model = pipeline.Fit(dataView);
Speichern des Modells
An diesem Punkt verfügen Sie über ein Modell, das in eine ihrer vorhandenen oder neuen .NET-Anwendungen integriert werden kann. Um das Modell in einer ZIP-Datei zu speichern, fügen Sie den folgenden Code unter dem Aufruf der Methode Fit
hinzu:
using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
mlContext.Model.Save(model, dataView.Schema, fileStream);
}
Verwenden des Modells für Vorhersagen
Verwenden Sie für Vorhersagen die PredictionEngine<TSrc,TDst>-Klasse, die Instanzen des Eingabetyps über die Transformationspipeline annimmt und Instanzen des Ausgabetyps erzeugt. Fügen Sie die folgende Zeile hinzu, um eine Instanz dieser Klasse zu erstellen:
var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);
Die PredictionEngine ist eine Benutzerfreundlichkeits-API, mit der Sie eine Vorhersage für eine einzelne Instanz von Daten ausführen können. PredictionEngine
ist nicht threadsicher. Die Verwendung in Singlethread-oder Prototypumgebungen ist zulässig. Zur Verbesserung der Leistung und Threadsicherheit in Produktionsumgebungen verwenden Sie den PredictionEnginePool
-Dienst, der einen ObjectPool
aus PredictionEngine
-Objekten für die Verwendung in Ihrer gesamten Anwendung erstellt. Informationen zur Verwendung von PredictionEnginePool
in einer ASP.NET Core-Web-API finden Sie in dieser Anleitung.
Anmerkung
Die PredictionEnginePool
-Diensterweiterung ist derzeit als Vorschauversion verfügbar.
Erstellen Sie die TestIrisData
Klasse, um Dateninstanzen zu testen:
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und klicken Sie auf Hinzufügen>Neues Element.
Wählen Sie im Dialogfeld Neues Element hinzufügen die Option Klasse aus, und ändern Sie das Feld Name in TestIrisData.cs. Klicken Sie anschließend auf Hinzufügen.
Ändern Sie die Klasse so, dass sie wie im folgenden Beispiel statisch ist:
static class TestIrisData
Dieses Tutorial führt eine Irisdateninstanz innerhalb dieser Klasse ein. Sie können weitere Szenarien hinzufügen, um mit dem Modell zu experimentieren. Fügen Sie der TestIrisData
-Klasse den folgenden Code hinzu:
internal static readonly IrisData Setosa = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
Um den Cluster zu ermitteln, zu dem das angegebene Element gehört, wechseln Sie zurück zur Program.cs Datei, und fügen Sie den folgenden Code am Ende der Datei hinzu:
var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");
Führen Sie das Programm aus, um zu sehen, welcher Cluster die angegebene Dateninstanz enthält, und berechnen Sie die quadratischen Abstände von dieser Instanz zu den Cluster-Schwerpunkten. Ihre Ergebnisse sollten wie folgt aussehen:
Cluster: 2
Distances: 11.69127 0.02159119 25.59896
Glückwunsch! Sie haben nun erfolgreich ein maschinelles Lernmodell für das Iris-Clustering erstellt und verwendet, um Vorhersagen zu treffen. Den Quellcode für dieses Lernprogramm finden Sie im dotnet/samples GitHub-Repository.
Nächste Schritte
In diesem Tutorial haben Sie gelernt, wie man:
- Verstehen des Problems
- Wählen Sie die entsprechende Machine Learning-Aufgabe aus.
- Vorbereiten der Daten
- Laden und Transformieren der Daten
- Auswählen eines Lernalgorithmus
- Trainieren des Modells
- Verwenden des Modells für Vorhersagen
Schauen Sie sich das GitHub-Repository "dotnet/machinelearning" an, um weiter zu lernen und weitere Beispiele zu finden.