Freigeben über


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

  1. Erstellen Sie eine C#-Konsolenanwendung namens "IrisFlowerClustering". Klicken Sie auf die Schaltfläche Weiter.

  2. Wählen Sie .NET 8 als zu verwendende Framework aus. Klicken Sie auf die Schaltfläche Erstellen .

  3. 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.

  4. 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äche OK aus, und wählen Sie dann im Dialogfeld Lizenzakzeptanz die Schaltfläche "Ich akzeptiere" aus, wenn Sie den Lizenzbedingungen für die aufgeführten Pakete zustimmen.

Vorbereiten der Daten

  1. 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.

  2. 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:

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und klicken Sie auf Hinzufügen>Neues Element.

  2. 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.

  3. 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:

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und klicken Sie auf Hinzufügen>Neues Element.

  2. 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.

  3. Ä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.