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
Maak een C# -consoletoepassing met de naam IrisFlowerClustering. Klik op de knop Next
Kies .NET 6 als het framework dat u wilt gebruiken. Klik op de knop Maken.
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.
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
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.
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:
Klik in Solution Explorer met de rechtermuisknop op het project en selecteervervolgens Nieuw itemtoevoegen>.
Selecteer in het dialoogvenster Nieuw item toevoegen de optie Klasse en wijzig het veld Naam in IrisData.cs. Selecteer vervolgens de knop Toevoegen .
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 ClusterPrediction
gedefinieerd, 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:
Klik in Solution Explorer met de rechtermuisknop op het project en selecteervervolgens Nieuw itemtoevoegen>.
Selecteer in het dialoogvenster Nieuw item toevoegen de optie Klasse en wijzig het veld Naam in TestIrisData.cs. Selecteer vervolgens de knop Toevoegen .
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.