Delen via


Zelfstudie: Irisbloemen categoriseren met behulp van k-means-clustering met ML.NET

In deze zelfstudie ziet u hoe u ML.NET gebruikt om een clusteringmodel te bouwen voor de irisbloemgegevensset.

In deze handleiding leer je hoe je:

  • Het probleem begrijpen
  • De juiste machine learning-taak selecteren
  • De gegevens voorbereiden
  • De gegevens laden en transformeren
  • Een leeralgoritmen kiezen
  • Het model trainen
  • Het model gebruiken voor voorspellingen

Vereiste voorwaarden

Het probleem begrijpen

Dit probleem gaat over het verdelen van de set irisbloemen in verschillende groepen op basis van de bloemkenmerken. Deze kenmerken zijn de lengte en breedte van een sepal en de lengte en breedte van een bloemblaadje. Voor deze zelfstudie wordt ervan uitgegaan dat het type bloem onbekend is. U wilt de structuur van een gegevensset leren van de functies en voorspellen hoe een gegevensexemplaren bij deze structuur passen.

De juiste machine learning-taak selecteren

Omdat u niet weet tot welke groep elke bloem behoort, kiest u de machine learning-taak zonder supervisie . Als u een gegevensset op een zodanige manier wilt verdelen dat elementen in dezelfde groep vergelijkbaar zijn met elkaar dan die in andere groepen, gebruikt u een machine learning-taak voor clustering .

Een consoletoepassing maken

  1. Maak een C# -consoletoepassing met de naam IrisFlowerClustering. Klik op de knop Volgende.

  2. Kies .NET 8 als framework dat u wilt gebruiken. Klik op de knop Maken.

  3. Maak een map met de naam Gegevens in uw project om de gegevensset en modelbestanden op te slaan:

    Klik in Solution Explorer met de rechtermuisknop op het project en selecteerNieuwe map>. Typ 'Gegevens' en selecteer Enter.

  4. Installeer het Microsoft.ML NuGet-pakket:

    Opmerking

    In dit voorbeeld wordt, tenzij anders vermeld, de meest recente stabiele versie van de NuGet-pakketten gebruikt.

    Klik in Solution Explorer met de rechtermuisknop op het project en klik op NuGet-pakketten beheren. Kies 'nuget.org' als pakketbron, selecteer het tabblad Bladeren , zoek naar Microsoft.ML en selecteer Installeren. Selecteer de knop OK in het dialoogvenster Voorbeeld van wijzigingen en selecteer vervolgens de knop Accepteren in het dialoogvenster Acceptatie van licenties als u akkoord gaat met de licentievoorwaarden voor de vermelde pakketten.

De gegevens voorbereiden

  1. Download de gegevensset iris.data en sla deze op in de map Gegevens die u in de vorige stap hebt gemaakt. Zie voor meer informatie over de irisgegevensset de Wikipedia-pagina irisbloemgegevensset en de pagina Irisgegevensset , die de bron van de gegevensset is.

  2. Klik in Solution Explorer met de rechtermuisknop op het iris.data-bestand en selecteer Eigenschappen. Wijzig onder Geavanceerd de waarde van Kopiëren naar Uitvoermap naar kopiëren indien nieuwer.

Het bestand iris.data bevat vijf kolommen die het volgende vertegenwoordigen:

  • Sepal length in centimeters
  • sepalen breedte in centimeters
  • lengte van bloemblaadjes in centimeters
  • De breedte van bloemblaadjes in centimeters
  • soort irisbloem

In deze zelfstudie wordt, voor het voorbeeld van clustering, de laatste kolom genegeerd.

Gegevensklassen maken

Maak klassen voor de invoergegevens en de voorspellingen:

  1. Klik in Solution Explorer met de rechtermuisknop op het project en selecteerNieuw item>.

  2. Selecteer klasse in het dialoogvenster Nieuw item toevoegen en wijzig het veld Naamin IrisData.cs. Selecteer vervolgens Toevoegen.

  3. Voeg de volgende using instructie toe aan het nieuwe bestand:

    using Microsoft.ML.Data;
    

Verwijder de bestaande klassedefinitie en voeg de volgende code toe, waarmee de klassen IrisData en ClusterPrediction, aan het IrisData.cs-bestand worden gedefinieerd:

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 is de invoergegevensklasse en bevat definities voor elke functie uit de gegevensset. Gebruik het kenmerk LoadColumn om de indexen van de bronkolommen in het gegevenssetbestand op te geven.

De ClusterPrediction klasse vertegenwoordigt de uitvoer van het clusteringmodel dat is toegepast op een IrisData exemplaar. Gebruik het kenmerk ColumnName om respectievelijk de PredictedClusterId en Distances velden te binden aan de kolommen PredictedLabel en Score . In het geval van de clustertaak hebben deze kolommen de volgende betekenis:

  • De kolom PredictedLabel bevat de id van het voorspelde cluster.
  • De scorekolom bevat een matrix met ge kwadraatte Euclidean-afstanden tot de zwaartepunten van het cluster. De matrixlengte is gelijk aan het aantal clusters.

Opmerking

Gebruik het float type om drijvende-kommawaarden in de invoer- en voorspellingsgegevensklassen weer te geven.

Gegevens- en modelpaden definiëren

Ga terug naar het Program.cs bestand en voeg twee velden toe om de paden naar het gegevensbestand en naar het bestand waarin het model wordt opgeslagen.

  • _dataPath bevat het pad naar het bestand met de gegevensset die wordt gebruikt om het model te trainen.
  • _modelPath bevat het pad naar het bestand waarin het getrainde model is opgeslagen.

Voeg de volgende code toe onder de using instructies om deze paden op te geven:

string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");

ML-context maken

Voeg de volgende aanvullende using instructies toe aan het begin van het bestand Program.cs :

using Microsoft.ML;
using IrisFlowerClustering;

Vervang de Console.WriteLine("Hello World!"); regel door de volgende code:

var mlContext = new MLContext(seed: 0);

De Microsoft.ML.MLContext klasse vertegenwoordigt de machine learning-omgeving en biedt mechanismen voor logboekregistratie en toegangspunten voor het laden van gegevens, modeltraining, voorspelling en andere taken. Dit is vergelijkbaar met het gebruik DbContext in Entity Framework.

Gegevens laden instellen

Voeg de volgende code toe onder de MLContext code om de manier in te stellen om gegevens te laden:

IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');

Met de algemene extensiemethode wordt het schema van de gegevensset afgeleid van het opgegeven type en retourneert , dat kan dienen als invoer voor transformatoren.

Een leerpijplijn maken

Voor deze zelfstudie bestaat de leerpijplijn van de clustertaak uit twee volgende stappen:

  • voeg kolommen samen in één kolom Functies , die door een clustering trainer wordt gebruikt;
  • KMeansTrainer een trainer gebruiken om het model te trainen met behulp van het k-means++-clustering-algoritme.

Voeg het volgende toe na het laden van de gegevens:

string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
    .Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
    .Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));

De code geeft aan dat de gegevensset moet worden gesplitst in drie clusters.

Het model trainen

De stappen die in de voorgaande secties zijn toegevoegd, hebben de pijplijn voor training voorbereid, maar er zijn geen uitgevoerd. Voeg de volgende regel onder aan het bestand toe om gegevens te laden en modeltraining uit te voeren:

var model = pipeline.Fit(dataView);

Het model opslaan

Op dit moment hebt u een model dat kan worden geïntegreerd in een van uw bestaande of nieuwe .NET-toepassingen. Als u uw model wilt opslaan in een .zip-bestand, voegt u de volgende code toe onder het aanroepen van de Fit methode:

using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
    mlContext.Model.Save(model, dataView.Schema, fileStream);
}

Het model gebruiken voor voorspellingen

Als u voorspellingen wilt doen, gebruikt u de PredictionEngine<TSrc,TDst> klasse die exemplaren van het invoertype via de transformatorpijplijn gebruikt en exemplaren van het uitvoertype produceert. Voeg de volgende regel toe om een exemplaar van die klasse te maken:

var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);

PredictionEngine is een handige API, waarmee u een voorspelling kunt uitvoeren op één exemplaar van gegevens. PredictionEngine is niet thread-safe. Het is acceptabel om te gebruiken in omgevingen met één thread of prototype. Voor verbeterde prestaties en threadveiligheid in productieomgevingen gebruikt u de PredictionEnginePool service, waarmee u objecten ObjectPoolPredictionEngine maakt voor gebruik in uw toepassing. Raadpleeg deze handleiding voor het gebruik PredictionEnginePool in een ASP.NET Core Web-API.

Opmerking

PredictionEnginePool de service-extensie is momenteel beschikbaar als preview-versie.

Maak de TestIrisData klasse om testgegevensexemplaren te bevatten.

  1. Klik in Solution Explorer met de rechtermuisknop op het project en selecteerNieuw item>.

  2. Selecteer in het dialoogvenster Nieuw item toevoegen de optie Klasse en wijzig het veld Naamin TestIrisData.cs. Selecteer vervolgens Toevoegen.

  3. Wijzig de klasse in statisch, zoals in het volgende voorbeeld:

    static class TestIrisData
    

In deze zelfstudie introduceert u een irisgegevensexemplaar binnen deze klasse. U kunt andere scenario's toevoegen om te experimenteren met het model. Voeg de volgende code toe aan de TestIrisData klasse:

internal static readonly IrisData Setosa = new IrisData
{
    SepalLength = 5.1f,
    SepalWidth = 3.5f,
    PetalLength = 1.4f,
    PetalWidth = 0.2f
};

Als u wilt achterhalen waartoe het opgegeven item behoort, gaat u terug naar het Program.cs bestand en voegt u de volgende code toe onder aan het bestand:

var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");

Voer het programma uit om te zien welk cluster het opgegeven gegevensexemplaar bevat en om de vierkante afstanden van dat exemplaar naar de zwaartepunten van de clusters te zien. Uw resultaten moeten er ongeveer als volgt uitzien:

Cluster: 2
Distances: 11.69127 0.02159119 25.59896

Gefeliciteerd! U hebt nu een machine learning-model voor irisclustering gebouwd en gebruikt om voorspellingen te doen. U vindt de broncode voor deze zelfstudie in de GitHub-opslagplaats dotnet/samples .

Volgende stappen

In deze tutorial leerde je hoe je:

  • Het probleem begrijpen
  • De juiste machine learning-taak selecteren
  • De gegevens voorbereiden
  • De gegevens laden en transformeren
  • Een leeralgoritmen kiezen
  • Het model trainen
  • Het model gebruiken voor voorspellingen

Bekijk de GitHub-opslagplaats dotnet/machinelearning om door te gaan met leren en meer voorbeelden te vinden.