Delen via


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

Deze zelfstudie laat zien hoe u ML.NET gebruikt om een clusteringmodel te bouwen voor de gegevensset irisbloemen.

In deze zelfstudie leert u het volgende:

  • Inzicht in het probleem
  • Selecteer de juiste machine learning-taak
  • De gegevens voorbereiden
  • De gegevens laden en transformeren
  • Een leeralgoritmen kiezen
  • Het model trainen
  • Het model gebruiken voor voorspellingen

Vereisten

Inzicht in het probleem

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 bloemblad. Voor deze zelfstudie wordt ervan uitgegaan dat het type van elke bloem onbekend is. U wilt de structuur van een gegevensset leren van de functies en voorspellen hoe een gegevensexemplaren in deze structuur passen.

Selecteer de juiste machine learning-taak

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

Een consoletoepassing maken

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

  2. Kies .NET 6 als het 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 maptoevoegen>. Typ 'Gegevens' en druk op Enter.

  4. Installeer het Microsoft.ML NuGet-pakket:

    Notitie

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

    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 de knop Installeren . Selecteer de knop OK in het dialoogvenster Voorbeeld van wijzigingen en selecteer vervolgens de knop Ik ga akkoord in het dialoogvenster Licentie-acceptatie 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 Data die u in de vorige stap hebt gemaakt. Zie de Wikipedia-pagina Irisbloemgegevensset en de pagina Irisgegevensset , die de bron van de gegevensset is, voor meer informatie over de irisgegevensset.

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

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

  • sepal length in centimeters
  • sepal width in centimeters
  • bloembladlengte in centimeters
  • bloembladbreedte in centimeters
  • type irisbloem

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

Gegevensklassen maken

Klassen maken voor de invoergegevens en de voorspellingen:

  1. Klik in Solution Explorer met de rechtermuisknop op het project en selecteervervolgens Nieuw itemtoevoegen>.

  2. Selecteer in het dialoogvenster Nieuw item toevoegen de optie Klasse en wijzig het veld Naam in IrisData.cs. Selecteer vervolgens de knop 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, waarmee de klassen IrisData en worden ClusterPredictiongedefinieerd, toe aan het bestand IrisData.cs :

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 de PredictedClusterId velden en Distances te binden aan respectievelijk 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 kolom Score bevat een matrix met kwadratische euclidische afstanden tot de cluster-zwaartepunten. De matrixlengte is gelijk aan het aantal clusters.

Notitie

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

Gegevens- en modelpaden definiëren

Terug naar het bestand Program.cs en voeg twee velden toe om de paden naar het gegevenssetbestand en het bestand om het model op te slaan:

  • _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 invoerpunten voor het laden van gegevens, modeltraining, voorspelling en andere taken. Dit is conceptueel vergelijkbaar met het gebruik DbContext in Entity Framework.

Het laden van gegevens instellen

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

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

De algemene MLContext.Data.LoadFromTextFile extensiemethode leid het schema van de gegevensset af van het opgegeven IrisData type en retourneert IDataView die kunnen worden gebruikt als invoer voor transformatoren.

Een leerpijplijn maken

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

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

Voeg het volgende toe nadat u de gegevens hebt geladen:

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

Met de stappen die in de voorgaande secties zijn toegevoegd, is de pijplijn voorbereid voor training, maar er zijn er geen uitgevoerd. Voeg onderaan het bestand de volgende regel 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 pijplijn van de transformer neemt 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);

De PredictionEngine is een gemaks-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 een ObjectPool van PredictionEngine objecten wordt gemaakt voor gebruik in uw toepassing. Raadpleeg deze handleiding over het gebruik PredictionEnginePool in een ASP.NET Core Web-API.

Notitie

PredictionEnginePool de service-extensie is momenteel in preview.

Maak de klasse voor het TestIrisData huiswerken van testgegevensexemplaren:

  1. Klik in Solution Explorer met de rechtermuisknop op het project en selecteervervolgens Nieuw itemtoevoegen>.

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

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

    static class TestIrisData
    

In deze zelfstudie wordt één irisgegevensexemplaar binnen deze klasse geïntroduceerd. 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 weten tot welk cluster het opgegeven item behoort, gaat u terug naar het bestand Program.cs en voegt u onderaan het bestand de volgende code toe:

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 en de kwadratische afstanden van dat exemplaar tot de clusterkernen bevat. De 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 gemaakt en dit gebruikt om voorspellingen te doen. U vindt de broncode voor deze zelfstudie in de GitHub-opslagplaats dotnet/samples .

Volgende stappen

In deze zelfstudie heeft u het volgende geleerd:

  • Inzicht in het probleem
  • Selecteer de juiste machine learning-taak
  • De gegevens voorbereiden
  • De gegevens laden en transformeren
  • Een leeralgoritmen kiezen
  • Het model trainen
  • Het model gebruiken voor voorspellingen

Bekijk onze GitHub-opslagplaats om verder te leren en meer voorbeelden te vinden.