Dela via


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

  1. Skapa ett C# -konsolprogram med namnet "IrisFlowerClustering". Klicka på knappen Nästa.

  2. Välj .NET 6 som ramverk att använda. Klicka på knappen Skapa.

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

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

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

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

  1. I Solution Explorer högerklickar du på projektet och väljer sedan Lägg till>nytt objekt.

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

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

  1. I Solution Explorer högerklickar du på projektet och väljer sedan Lägg till>nytt objekt.

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

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