Självstudie: Kategorisera irisblommor med k-means-klustring med ML.NET
Den här självstudien visar hur du använder ML.NET för att skapa en klustringsmodell för datauppsättningen irisblomma.
I den här guiden får du lära dig att:
- Förstå problemet
- Välj lämplig maskininlärningsuppgift
- Förbereda data
- Läsa in och transformera data
- Välja en inlärningsalgoritm
- Träna modellen
- Använda modellen för förutsägelser
Krav
Förstå problemet
Det här problemet handlar om att dela upp uppsättningen irisblommor i olika grupper baserat på blomegenskaperna. Dessa funktioner är längden och bredden på en sepal och längden och bredden på ett kronblad. I den här självstudien förutsätter vi att typen av varje blomma är okänd. Du vill lära dig strukturen för en datauppsättning från funktionerna och förutsäga hur en datainstans passar den här strukturen.
Välj lämplig maskininlärningsuppgift
Eftersom du inte vet vilken grupp varje blomma tillhör väljer du den oövervakade maskininlärningsuppgiften . Om du vill dela upp en datauppsättning i grupper på ett sådant sätt att element i samma grupp liknar varandra mer än de i andra grupper använder du en maskininlärningsuppgift för klustring .
Skapa ett konsolprogram
Skapa ett C# -konsolprogram med namnet "IrisFlowerClustering". Klicka på knappen Nästa.
Välj .NET 6 som ramverk att använda. Klicka på knappen Skapa.
Skapa en katalog med namnet Data i projektet för att lagra datauppsättningen och modellfilerna:
I Solution Explorer högerklickar du på projektet och väljer Lägg till>ny mapp. Skriv "Data" och tryck på Retur.
Installera Microsoft.ML NuGet-paketet:
Anteckning
I det här exemplet används den senaste stabila versionen av De NuGet-paket som nämns om inget annat anges.
I Solution Explorer högerklickar du på projektet och väljer Hantera NuGet-paket. Välj "nuget.org" som paketkälla, välj fliken Bläddra , sök efter Microsoft.ML och välj knappen Installera . Välj knappen OK i dialogrutan Förhandsgranska ändringar och välj sedan knappen Jag accepterar i dialogrutan Godkännande av licens om du godkänner licensvillkoren för de paket som anges.
Förbereda data
Ladda ned datauppsättningen iris.data och spara den i mappen Data som du skapade i föregående steg. Mer information om datauppsättningen iris finns på Wikipedia-sidan för Iris-blomsterdatauppsättningen och sidan Iris-datauppsättning , som är källan till datauppsättningen.
I Solution Explorer högerklickar du på filen iris.data och väljer Egenskaper. Under Avancerat ändrar du värdet för Kopiera till utdatakatalog till Kopiera om nyare.
Filen iris.data innehåller fem kolumner som representerar:
- sepallängd i centimeter
- sepalbredd i centimeter
- kronbladslängd i centimeter
- kronbladsbredd i centimeter
- typ av irisblomma
För klustringsexemplet ignorerar den här självstudien den sista kolumnen.
Skapa dataklasser
Skapa klasser för indata och förutsägelserna:
I Solution Explorer högerklickar du på projektet och väljer sedan Lägg till>nytt objekt.
I dialogrutan Lägg till nytt objekt väljer du Klass och ändrar fältet Namn till IrisData.cs. Välj sedan knappen Lägg till .
Lägg till följande
using
direktiv i den nya filen:using Microsoft.ML.Data;
Ta bort den befintliga klassdefinitionen och lägg till följande kod, som definierar klasserna IrisData
och ClusterPrediction
, i filen 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
är indataklassen och har definitioner för varje funktion från datauppsättningen. Använd attributet LoadColumn för att ange index för källkolumnerna i datauppsättningsfilen.
Klassen ClusterPrediction
representerar utdata från klustringsmodellen som tillämpas på en IrisData
instans. Använd attributet ColumnName för att binda fälten PredictedClusterId
och Distances
till kolumnerna PredictedLabel respektive Score . När det gäller klustringsaktiviteten har dessa kolumner följande betydelse:
- Kolumnen PredictedLabel innehåller ID:t för det förutsagda klustret.
- Poängkolumnen innehåller en matris med kvadratiska euklidiska avstånd till klustrets centroider. Matrislängden är lika med antalet kluster.
Anteckning
Använd typen float
för att representera flyttalsvärden i indata- och förutsägelsedataklasserna.
Definiera data- och modellsökvägar
Gå tillbaka till filen Program.cs och lägg till två fält för att lagra sökvägarna till datauppsättningsfilen och till filen för att spara modellen:
_dataPath
innehåller sökvägen till filen med datauppsättningen som används för att träna modellen._modelPath
innehåller sökvägen till filen där den tränade modellen lagras.
Lägg till följande kod under using-instruktionerna för att ange dessa sökvägar:
string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");
Skapa ML-kontext
Lägg till följande ytterligare using
direktiv överst i filen Program.cs :
using Microsoft.ML;
using IrisFlowerClustering;
Ersätt raden Console.WriteLine("Hello World!");
med följande kod:
var mlContext = new MLContext(seed: 0);
Klassen Microsoft.ML.MLContext representerar maskininlärningsmiljön och tillhandahåller mekanismer för loggning och startpunkter för datainläsning, modellträning, förutsägelse och andra uppgifter. Detta är jämförbart konceptuellt med användning DbContext
i Entity Framework.
Konfigurera datainläsning
Lägg till följande kod under MLContext
för att konfigurera sättet att läsa in data:
IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
Den generiska MLContext.Data.LoadFromTextFile
tilläggsmetoden härleder datauppsättningsschemat från den angivna IrisData
typen och returnerar IDataView som kan användas som indata för transformatorer.
Skapa en utbildningspipeline
I den här självstudien består utbildningspipelinen för klustringsuppgiften av två steg:
- sammanfoga inlästa kolumner i en kolumn med funktioner , som används av en klustringstränare.
- använd en KMeansTrainer tränare för att träna modellen med hjälp av k-means++-klustringsalgoritmen.
Lägg till följande efter inläsning av data:
string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
.Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
.Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));
Koden anger att datauppsättningen ska delas upp i tre kluster.
Träna modellen
Stegen som lades till i föregående avsnitt förberedde pipelinen för träning, men ingen har körts. Lägg till följande rad längst ned i filen för att utföra datainläsning och modellträning:
var model = pipeline.Fit(dataView);
Spara modellen
Nu har du en modell som kan integreras i alla dina befintliga eller nya .NET-program. Om du vill spara din modell i en .zip fil lägger du till följande kod nedan som anropar Fit
metoden :
using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
mlContext.Model.Save(model, dataView.Schema, fileStream);
}
Använda modellen för förutsägelser
Om du vill göra förutsägelser använder du PredictionEngine<TSrc,TDst> klassen som tar instanser av indatatypen via transformerarpipelinen och skapar instanser av utdatatypen. Lägg till följande rad för att skapa en instans av den klassen:
var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);
PredictionEngine är ett bekvämlighets-API som gör att du kan utföra en förutsägelse på en enda instans av data. PredictionEngine
är inte trådsäkert. Det är acceptabelt att använda i entrådade miljöer eller prototypmiljöer. För bättre prestanda och trådsäkerhet i produktionsmiljöer använder du PredictionEnginePool
tjänsten, som skapar en ObjectPool
av PredictionEngine
objekt som ska användas i hela programmet. Se den här guiden om hur du använder PredictionEnginePool
i ett ASP.NET Core webb-API.
Anteckning
PredictionEnginePool
tjänsttillägget är för närvarande i förhandsversion.
TestIrisData
Skapa klassen för att inhysa testdatainstanser:
I Solution Explorer högerklickar du på projektet och väljer sedan Lägg till>nytt objekt.
I dialogrutan Lägg till nytt objekt väljer du Klass och ändrar fältet Namn till TestIrisData.cs. Välj sedan knappen Lägg till .
Ändra klassen så att den är statisk som i följande exempel:
static class TestIrisData
Den här självstudien introducerar en iris-datainstans i den här klassen. Du kan lägga till andra scenarier för att experimentera med modellen. Lägg till följande kod i TestIrisData
klassen:
internal static readonly IrisData Setosa = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
Om du vill ta reda på det kluster som det angivna objektet tillhör går du tillbaka till filen Program.cs och lägger till följande kod längst ned i filen:
var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");
Kör programmet för att se vilket kluster som innehåller den angivna datainstansen och kvadratavstånd från den instansen till klustrets centroider. Resultatet bör se ut ungefär så här:
Cluster: 2
Distances: 11.69127 0.02159119 25.59896
Grattis! Nu har du skapat en maskininlärningsmodell för irisklustring och använt den för att göra förutsägelser. Du hittar källkoden för den här självstudien på GitHub-lagringsplatsen dotnet/samples .
Nästa steg
I den här självstudiekursen lärde du dig att:
- Förstå problemet
- Välj lämplig maskininlärningsuppgift
- Förbereda data
- Läsa in och transformera data
- Välj en inlärningsalgoritm
- Träna modellen
- Använda modellen för förutsägelser
Kolla in vår GitHub-lagringsplats för att fortsätta lära dig och hitta fler exempel.