Oktatóanyag: Íriszvirágok kategorizálása k-közép csoportosítással ML.NET
Ez az oktatóanyag bemutatja, hogyan hozhat létre fürtözési modellt az íriszvirág-adatkészlethez ML.NET használatával.
Eben az oktatóanyagban az alábbiakkal fog megismerkedni:
- A probléma ismertetése
- Válassza ki a megfelelő gépi tanulási feladatot
- Az adatok előkészítése
- Adatok betöltése és átalakítása
- Tanulási algoritmus kiválasztása
- A modell betanítása
- A modell használata előrejelzésekhez
Előfeltételek
A probléma ismertetése
Ez a probléma arról szól, hogy az írisz virágok halmazát különböző csoportokban osztják el a virág jellemzői alapján. Ezek a jellemzők a sepal hossza és szélessége, valamint a szirmok hossza és szélessége. Ebben az oktatóanyagban feltételezzük, hogy az egyes virágok típusa ismeretlen. Meg szeretné ismerni az adathalmazok struktúráját a funkciókból, és előre szeretné jelezni, hogy egy adatpéldány hogyan illeszkedik ehhez a struktúrához.
Válassza ki a megfelelő gépi tanulási feladatot
Mivel nem tudja, hogy az egyes virágok melyik csoportba tartoznak, a nem felügyelt gépi tanulási feladatot kell választania. Ha egy adathalmazt úgy szeretne csoportokba osztani, hogy az ugyanabban a csoportban lévő elemek jobban hasonlítjanak egymásra, mint a többi csoportéra, használjon fürtözési gépi tanulási feladatot.
Konzolalkalmazás létrehozása
Hozzon létre egy "IrisFlowerClustering" nevű C#- konzolalkalmazást . Kattintson a Tovább gombra.
Válassza a .NET 6-ot a használni kívánt keretrendszerként. Kattintson a Létrehozás gombra.
Hozzon létre egy Data nevű könyvtárat a projektben az adatkészlet és a modellfájlok tárolásához:
A Megoldáskezelő kattintson a jobb gombbal a projektre, és válassza azÚj mappahozzáadása> lehetőséget. Írja be az "Adatok" kifejezést, és nyomja le az Enter billentyűt.
Telepítse a Microsoft.ML NuGet-csomagot:
Megjegyzés
Ez a minta az említett NuGet-csomagok legújabb stabil verzióját használja, hacsak másként nem rendelkezik.
A Megoldáskezelő kattintson a jobb gombbal a projektre, és válassza a Manage NuGet Packages (NuGet-csomagok kezelése) lehetőséget. Válassza a "nuget.org" lehetőséget a Csomag forrásaként, válassza a Tallózás lapot, keresse meg a Microsoft.ML , és válassza a Telepítés gombot. Válassza az OK gombot a Módosítások előnézete párbeszédpanelen, majd válassza az Elfogadom gombot a Licenc elfogadása párbeszédpanelen, ha elfogadja a felsorolt csomagok licencfeltételét.
Az adatok előkészítése
Töltse le az iris.data adatkészletet, és mentse az előző lépésben létrehozott Data mappába. Az írisz adatkészlettel kapcsolatos további információkért tekintse meg az íriszvirág-adatkészlet Wikipédián és az Iris Data Set (Írisz-adatkészlet ) oldalt, amely az adatkészlet forrása.
A Megoldáskezelő kattintson a jobb gombbal az iris.data fájlra, és válassza a Tulajdonságok parancsot. A Speciális területen módosítsa a Másolás kimeneti könyvtárra értékét Másolás, ha újabb értékre.
Az iris.data fájl öt oszlopot tartalmaz, amelyek a következőket jelölik:
- sepal hossza centiméterben
- sepal szélesség centiméterben
- szirom hossza centiméterben
- sziromszélesség centiméterben
- íriszvirág típusa
A csoportosítási példa kedvéért ez az oktatóanyag figyelmen kívül hagyja az utolsó oszlopot.
Adatosztályok létrehozása
Hozzon létre osztályokat a bemeneti adatokhoz és az előrejelzésekhez:
A Megoldáskezelő kattintson a jobb gombbal a projektre, majd válassza azÚj elemhozzáadása> lehetőséget.
Az Új elem hozzáadása párbeszédpanelen válassza az Osztály lehetőséget, és módosítsa a Név mezőt IrisData.cs névre. Ezután válassza a Hozzáadás gombot.
Adja hozzá a következő
using
direktívát az új fájlhoz:using Microsoft.ML.Data;
Távolítsa el a meglévő osztálydefiníciót, és adja hozzá a következő kódot, amely meghatározza az osztályokat és ClusterPrediction
a osztályokat IrisData
az IrisData.cs fájlban:
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
A a bemeneti adatosztály, és definíciókat tartalmaz az adatkészlet egyes funkcióihoz. A LoadColumn attribútummal adja meg az adatkészletfájl forrásoszlopainak indexeit.
A ClusterPrediction
osztály a példányra IrisData
alkalmazott fürtözési modell kimenetét jelöli. A ColumnName attribútummal kösse a és Distances
a PredictedClusterId
mezőt a PredictedLabel és a Score oszlophoz. Fürtözési feladat esetén ezek az oszlopok a következő jelentéssel rendelkeznek:
- A PredictedLabel oszlop tartalmazza az előrejelzett fürt azonosítóját.
- A Score oszlop egy négyzetes euklideszi távolságokkal rendelkező tömböt tartalmaz a fürt centroidjaihoz. A tömb hossza megegyezik a fürtök számával.
Megjegyzés
A típussal float
lebegőpontos értékeket jelölhet a bemeneti és előrejelzési adatosztályokban.
Adat- és modellútvonalak definiálása
Vissza a Program.cs fájlba, és adjon hozzá két mezőt az adatkészletfájl elérési útjainak tárolásához, valamint a fájlhoz a modell mentéséhez:
_dataPath
A tartalmazza a fájl elérési útját a modell betanítása során használt adatkészlettel._modelPath
a betanított modell tárolására szolgáló fájl elérési útját tartalmazza.
Adja hozzá a következő kódot a using utasítások alatt ezeknek az elérési utaknak a megadásához:
string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "iris.data");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "IrisClusteringModel.zip");
Gépi tanulási környezet létrehozása
Adja hozzá a következő további using
irányelveket a Program.cs fájl elejéhez:
using Microsoft.ML;
using IrisFlowerClustering;
Cserélje le a Console.WriteLine("Hello World!");
sort a következő kódra:
var mlContext = new MLContext(seed: 0);
Az Microsoft.ML.MLContext osztály a gépi tanulási környezetet jelöli, és mechanizmusokat biztosít a naplózáshoz és a belépési pontokhoz az adatbetöltéshez, a modell betanításához, az előrejelzéshez és más feladatokhoz. Ez fogalmilag hasonló az Entity Frameworkben való használathoz DbContext
.
Adatbetöltés beállítása
Adja hozzá az alábbi kódot az alatt az MLContext
adatok betöltésének módjának beállításához:
IDataView dataView = mlContext.Data.LoadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
Az általános MLContext.Data.LoadFromTextFile
bővítménymetódus a megadott IrisData
típusból következtet az adathalmaz sémájára, és visszaadja IDataView az átalakítók bemeneteként használható értéket.
Tanulási folyamat létrehozása
Ebben az oktatóanyagban a fürtözési feladat tanulási folyamata két alábbi lépésből áll:
- összefűzheti a betöltött oszlopokat egy Szolgáltatások oszlopba, amelyet egy fürtözési oktató használ;
- trénerrel KMeansTrainer taníthatja be a modellt a k-means++ fürtözési algoritmussal.
Adja hozzá a következőket az adatok betöltése után:
string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
.Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
.Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, numberOfClusters: 3));
A kód azt határozza meg, hogy az adathalmazt három fürtre kell felosztani.
A modell betanítása
Az előző szakaszokban hozzáadott lépések előkészítették a folyamatot a betanításhoz, de egyik sem lett végrehajtva. Adja hozzá a következő sort a fájl alján az adatok betöltéséhez és a modell betanításához:
var model = pipeline.Fit(dataView);
A modell mentése
Ezen a ponton rendelkezik egy olyan modellel, amely bármely meglévő vagy új .NET-alkalmazásba integrálható. Ha a modellt egy .zip fájlba szeretné menteni, adja hozzá az alábbi kódot a metódus meghívásához Fit
:
using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))
{
mlContext.Model.Save(model, dataView.Schema, fileStream);
}
A modell használata előrejelzésekhez
Előrejelzések készítéséhez használja azt a PredictionEngine<TSrc,TDst> osztályt, amely a bemeneti típus példányait a transzformátorfolyamaton keresztül viszi át, és a kimeneti típus példányait állítja elő. Adja hozzá a következő sort az osztály egy példányának létrehozásához:
var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);
A PredictionEngine egy kényelmi API, amely lehetővé teszi, hogy egyetlen adatpéldányon végezzen előrejelzést. PredictionEngine
nem szálbiztos. Egyszálas vagy prototípusos környezetben is használható. Az éles környezetekben a jobb teljesítmény és szálbiztonság érdekében használja a PredictionEnginePool
szolgáltatást, amely objektumokat hoz létre ObjectPool
PredictionEngine
az alkalmazás egészében való használatra. Ebből az útmutatóból megtudhatja, hogyan használható PredictionEnginePool
ASP.NET Core webes API-kban.
Megjegyzés
PredictionEnginePool
A szolgáltatásbővítmény jelenleg előzetes verzióban érhető el.
Hozza létre a osztályt a TestIrisData
tesztadat-példányok létrehozásához:
A Megoldáskezelő kattintson a jobb gombbal a projektre, majd válassza azÚj elemhozzáadása> lehetőséget.
Az Új elem hozzáadása párbeszédpanelen válassza az Osztály lehetőséget, és módosítsa a Név mezőt TestIrisData.cs névre. Ezután válassza a Hozzáadás gombot.
Módosítsa az osztályt statikusra az alábbi példához hasonlóan:
static class TestIrisData
Ez az oktatóanyag egy íriszadat-példányt mutat be ebben az osztályban. A modellel való kísérletezéshez más forgatókönyveket is hozzáadhat. Adja hozzá a következő kódot a TestIrisData
osztályhoz:
internal static readonly IrisData Setosa = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
Annak a fürtnek a megkereséséhez, amelyhez a megadott elem tartozik, lépjen vissza a Program.cs fájlhoz, és adja hozzá a következő kódot a fájl alján:
var prediction = predictor.Predict(TestIrisData.Setosa);
Console.WriteLine($"Cluster: {prediction.PredictedClusterId}");
Console.WriteLine($"Distances: {string.Join(" ", prediction.Distances ?? Array.Empty<float>())}");
Futtassa a programot annak megtekintéséhez, hogy melyik fürt tartalmazza a megadott adatpéldányt, és négyzetes távolságokat az adott példánytól a fürt centroidjaiig. Az eredményeknek a következőhöz hasonlónak kell lenniük:
Cluster: 2
Distances: 11.69127 0.02159119 25.59896
Gratulálunk! Ezzel sikeresen létrehozott egy gépi tanulási modellt az íriszfürt-csoportosításhoz, és előrejelzések készítésére használta. Az oktatóanyag forráskódját a dotnet/samples GitHub-adattárban találja.
További lépések
Ez az oktatóanyag bemutatta, hogyan végezheti el az alábbi műveleteket:
- A probléma ismertetése
- Válassza ki a megfelelő gépi tanulási feladatot
- Az adatok előkészítése
- Adatok betöltése és átalakítása
- Tanulási algoritmus kiválasztása
- A modell betanítása
- A modell használata előrejelzésekhez
Tekintse meg a GitHub-adattárat, hogy folytathassa a tanulást, és további mintákat találjon.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: