Megosztás a következőn keresztül:


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

  1. Hozzon létre egy "IrisFlowerClustering" nevű C#- konzolalkalmazást . Kattintson a Tovább gombra.

  2. Válassza a .NET 6-ot a használni kívánt keretrendszerként. Kattintson a Létrehozás gombra.

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

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

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

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

  1. A Megoldáskezelő kattintson a jobb gombbal a projektre, majd válassza azÚj elemhozzáadása> lehetőséget.

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

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

  1. A Megoldáskezelő kattintson a jobb gombbal a projektre, majd válassza azÚj elemhozzáadása> lehetőséget.

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

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