Kurz: Kategorizace květů duhovky pomocí clusteringu k-means s ML.NET
Tento kurz ukazuje, jak pomocí ML.NET vytvořit model clusteringu pro sadu dat iris flower.
V tomto kurzu se naučíte:
- Pochopení problému
- Vyberte příslušnou úlohu strojového učení.
- Příprava dat
- Načtení a transformace dat
- Volba algoritmu učení
- Trénování modelu
- Použití modelu pro předpovědi
Požadavky
Pochopení problému
Tento problém spočívá v rozdělení sady květů duhovky do různých skupin na základě vlastností květin. Tyto vlastnosti jsou délka a šířka sepal a délka a šířka okvětního lístku. Pro účely tohoto kurzu předpokládejme, že typ jednotlivých květin je neznámý. Chcete se naučit strukturu datové sady z funkcí a předpovědět, jak instance dat odpovídá této struktuře.
Vyberte příslušnou úlohu strojového učení.
Protože nevíte, do které skupiny každá květina patří, zvolíte úlohu strojového učení bez dohledu . Pokud chcete rozdělit datovou sadu do skupin tak, aby prvky ve stejné skupině byly vzájemně podobné více než prvky v jiných skupinách, použijte úlohu clusteringu strojového učení.
Vytvoření konzolové aplikace
Vytvořte konzolovou aplikaci jazyka C# s názvem IrisFlowerClustering. Klikněte na tlačítko Další .
Jako architekturu, kterou chcete použít, zvolte .NET 6. Klikněte na tlačítko Vytvořit.
Vytvořte v projektu adresář s názvem Data , do který uložíte sadu dat a soubory modelu:
V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Přidat>novou složku. Zadejte "Data" a stiskněte Enter.
Nainstalujte balíček NuGet Microsoft.ML :
Poznámka
Tato ukázka používá nejnovější stabilní verzi uvedených balíčků NuGet, pokud není uvedeno jinak.
V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet. Jako zdroj balíčku zvolte "nuget.org", vyberte kartu Procházet , vyhledejte Microsoft.ML a vyberte tlačítko Nainstalovat . V dialogovém okně Náhled změn vyberte tlačítko OK a pak v dialogovém okně Přijetí licence vyberte tlačítko Souhlasím, pokud souhlasíte s licenčními podmínkami pro uvedené balíčky.
Příprava dat
Stáhněte si sadu dat iris.data a uložte ji do složky Data , kterou jste vytvořili v předchozím kroku. Další informace o datové sadě iris najdete na stránce Wikipedia sady dat Iris flower a na stránce Sada dat Iris , která je zdrojem sady dat.
V Průzkumník řešení klikněte pravým tlačítkem na soubor iris.data a vyberte Vlastnosti. V části Upřesnit změňte hodnotu Kopírovat do výstupního adresáře na Kopírovat, pokud je novější.
Soubor iris.data obsahuje pět sloupců, které představují:
- délka v centimetrech
- šířka sepála v centimetrech
- délka okvětních lístků v centimetrech
- šířka okvětního lístku v centimetrech
- typ květu duhovky
V zájmu příkladu clusteringu tento kurz ignoruje poslední sloupec.
Vytvoření datových tříd
Vytvořte třídy pro vstupní data a předpovědi:
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a pak vyberte Přidat>novou položku.
V dialogovém okně Přidat novou položku vyberte Třída a změňte pole Název na IrisData.cs. Pak vyberte tlačítko Přidat .
Do nového souboru přidejte následující
using
direktivu:using Microsoft.ML.Data;
Odeberte existující definici třídy a do souboru IrisData.cs přidejte následující kód, který definuje třídy IrisData
a ClusterPrediction
:
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
je vstupní datová třída a má definice pro každou funkci ze sady dat. Pomocí atributu LoadColumn určete indexy zdrojových sloupců v souboru sady dat.
Třída ClusterPrediction
představuje výstup modelu clusteringu použitého IrisData
na instanci. Pomocí atributu ColumnName vytvořte vazbu PredictedClusterId
polí a Distances
na sloupce PredictedLabel a Score v uvedeném pořadí. V případě úlohy clusteringu mají tyto sloupce následující význam:
- Sloupec PredictedLabel obsahuje ID predikovaného clusteru.
- Sloupec skóre obsahuje pole se čtvercovými Euklidovými vzdálenostmi od centroidů shluků. Délka pole se rovná počtu shluků.
Poznámka
Typ použijte k reprezentaci float
hodnot s plovoucí desetinou čárkou ve vstupních a prediktivních datových třídách.
Definování cest k datům a modelům
Zpět do souboru Program.cs a přidejte dvě pole pro uložení cest k souboru datové sady a k souboru pro uložení modelu:
-
_dataPath
obsahuje cestu k souboru se sadou dat použitou k trénování modelu. -
_modelPath
obsahuje cestu k souboru, ve kterém je natrénovaný model uložen.
Přidejte následující kód pod příkazy using pro určení těchto cest:
string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");
Vytvoření kontextu ML
Na začátek souboru Program.cs přidejte následující další using
direktivy:
using Microsoft.ML;
using IrisFlowerClustering;
Console.WriteLine("Hello World!");
Nahraďte řádek následujícím kódem:
var mlContext = new MLContext(seed: 0);
Třída Microsoft.ML.MLContext představuje prostředí strojového učení a poskytuje mechanismy pro protokolování a vstupní body pro načítání dat, trénování modelu, předpovědi a další úlohy. To je koncepčně srovnatelné s použitím DbContext
v Entity Frameworku.
Nastavení načítání dat
Přidejte pod pole MLContext
následující kód, který nastaví způsob načítání dat:
IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
Obecná MLContext.Data.LoadFromTextFile
rozšiřující metoda odvodí schéma datové sady z zadaného IrisData
typu a vrátí, IDataView které lze použít jako vstup pro transformátory.
Vytvoření výukového kanálu
V tomto kurzu se výukový kanál úlohy clusteringu skládá ze dvou následujících kroků:
- zřetězení načtených sloupců do jednoho sloupce Funkcí , který používá clusteringový trenér;
- pomocí školitele KMeansTrainer vytrénujte model pomocí algoritmu clusteringu k-means++.
Po načtení dat přidejte následující:
string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
.Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
.Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));
Kód určuje, že datová sada by měla být rozdělena do tří clusterů.
Trénování modelu
Kroky přidané v předchozích částech připravily kanál pro trénování, ale žádný nebyl proveden. Do dolní části souboru přidejte následující řádek, který provede načítání dat a trénování modelu:
var model = pipeline.Fit(dataView);
Uložení modelu
V tomto okamžiku máte model, který je možné integrovat do kterékoli ze stávajících nebo nových aplikací .NET. Pokud chcete model uložit do .zip souboru, přidejte následující kód, který volá metodu Fit
níže:
using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
mlContext.Model.Save(model, dataView.Schema, fileStream);
}
Použití modelu pro předpovědi
Chcete-li provádět předpovědi, použijte PredictionEngine<TSrc,TDst> třídu, která přijímá instance vstupního typu prostřednictvím kanálu transformátoru a vytváří instance výstupního typu. Přidejte následující řádek pro vytvoření instance této třídy:
var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);
PredictionEngine je rozhraní API pro pohodlí, které umožňuje provádět předpovědi na jedné instanci dat.
PredictionEngine
není bezpečný pro přístup z více vláken. Je přijatelné používat v jednovláknovém nebo prototypovém prostředí. Pokud chcete zvýšit výkon a zabezpečení vláken v produkčních prostředích, použijte PredictionEnginePool
službu, která vytvoří PredictionEngine
ObjectPool
objekty pro použití v celé aplikaci. Projděte si tohoto průvodce používáním PredictionEnginePool
ve webovém rozhraní API ASP.NET Core.
Poznámka
PredictionEnginePool
rozšíření služby je aktuálně ve verzi Preview.
TestIrisData
Vytvoření testovacích datových instancí třídy:
V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a pak vyberte Přidat>novou položku.
V dialogovém okně Přidat novou položku vyberte Třída a změňte pole Název na TestIrisData.cs. Pak vyberte tlačítko Přidat .
Upravte třídu tak, aby byla statická jako v následujícím příkladu:
static class TestIrisData
Tento kurz představuje jednu instanci dat iris v rámci této třídy. Můžete přidat další scénáře pro experimentování s modelem. Do třídy přidejte následující kód TestIrisData
:
internal static readonly IrisData Setosa = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
Pokud chcete zjistit, do kterého clusteru zadaná položka patří, vraťte se do souboru Program.cs a do dolní části souboru přidejte následující kód:
var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");
Spusťte program a zjistěte, který cluster obsahuje zadanou instanci dat a čtvercové vzdálenosti od této instance k centroidům clusteru. Výsledky by se měly podobat následujícímu:
Cluster: 2
Distances: 11.69127 0.02159119 25.59896
Gratulujeme! Teď jste úspěšně vytvořili model strojového učení pro clustering iris a použili jste ho k vytváření předpovědí. Zdrojový kód pro tento kurz najdete v úložišti Dotnet/samples na GitHubu.
Další kroky
V tomto kurzu jste se naučili:
- Pochopení problému
- Vyberte příslušnou úlohu strojového učení.
- Příprava dat
- Načtení a transformace dat
- Volba algoritmu učení
- Trénování modelu
- Použití modelu pro předpovědi
Podívejte se na naše úložiště GitHub, kde můžete pokračovat ve studiu a najít další ukázky.