Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez az oktatóanyag bemutatja, hogyan hozhat létre ML.NET
Ebben az oktatóanyagban a következőket sajátíthatja el:
- 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
- Visual Studio 2022 vagy újabb verzió.
A probléma ismertetése
Ez a probléma az írisz virágok készletének különböző csoportokban való megosztásáról szól 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 adatkészletet úgy szeretne csoportokba osztani, hogy az ugyanabban a csoportban lévő elemek jobban hasonlítanak egymáshoz, mint a többi csoporthoz, használjon egy 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 8-at a használni kívánt keretrendszerként. Kattintson a létrehozása 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őterületen kattintson a jobb gombbal a projektre, és válassza a >Új mappa hozzáadásalehetőséget. Írja be az "Adatok" kifejezést, és válassza az Enterlehetőséget.
Telepítse a Microsoft.ML NuGet-csomagot:
Jegyzet
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őterületen kattintson a jobb gombbal a projektre, és válassza a NuGet-csomagok kezeléselehetőséget. Válassza a "nuget.org" lehetőséget csomagforrásként, válassza a Tallózás lapot, keresse meg a Microsoft.ML, majd válassza a Telepítéslehetőséget. Válassza az OK gombot a Változá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észletről további információt az Írisz virágadatkészlet Wikipédiában és az Írisz-adatkészlet oldalon talál, amely az adatkészlet forrása.
A Megoldáskezelőkattintson a jobb gombbal az iris.data fájlra, és válassza Tulajdonságoklehetőséget. A Speciálisterületen módosítsa a Másolás a kimeneti könyvtárba értékét a Másolás, ha újabbértékre.
Az iris.data fájl öt oszlopot tartalmaz, amelyek a következőket jelölik:
- sepal hossz centiméterben
- sepal szélesség centiméterben
- szirom hossza centiméterben
- sziromszélesség centiméterben
- írisz virág típusa
A klaszterezé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 a >Új elem hozzáadásalehetőséget.
Az Új elem hozzáadása párbeszédablakban válassza az Osztály lehetőséget, és módosítsa a Név mezőt IrisData.cs. Ezután válassza hozzáadása lehetőséget.
Adja hozzá a következő
usingirányelvet 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 IrisData és ClusterPrediction, a IrisData.cs fájlba:
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 bemeneti adatosztály, és definíciókkal rendelkezik az adatkészlet egyes funkcióihoz. A LoadColumn attribútum használatával adja meg az adatkészletfájl forrásoszlopainak indexeit.
A ClusterPrediction osztály az IrisData-példányra alkalmazott fürtmodell kimenetét jelöli. A ColumnName attribútummal köti a PredictedClusterId és Distances mezőket a PredictedLabel és Score oszlophoz. Klaszterezési feladat esetében ezeknek az oszlopoknak a következő a jelentése:
- PredictedLabel oszlop tartalmazza az előrejelzett klaszter azonosítóját.
- Score oszlop egy tömböt tartalmaz, amely a fürtök centroidjaihoz mért négyzetes euklideszi távolságokat tartalmazza. A tömb hossza megegyezik a fürtök számával.
Jegyzet
A float típussal lebegőpontos értékeket jelölhet a bemeneti és előrejelzési adatosztályokban.
Adat- és modellútvonalak definiálása
Térjen vissza a Program.cs fájlhoz, és adjon hozzá két mezőt az adatkészletfájl elérési útjaihoz és a fájlhoz a modell mentéséhez:
-
_dataPathtartalmazza a fájl elérési útját a modell betanítása során használt adatkészlettel. -
_modelPathtartalmazza a betanított modell tárolására szolgáló fájl elérési útját.
Adja hozzá a következő kódot a using irányelvekhez az elérési utak 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 összefüggés 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);
A 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 összehasonlítható a DbContext az Entity Frameworkben való használatával.
Adatbetöltés beállítása
Adja hozzá a következő kódot az MLContext alatt az 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 az adathalmaz sémáját a megadott IrisData típusból következteti, és IDataView ad vissza, amely átalakítók bemeneteként használható.
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:
- a betöltött oszlopokat egyetlen Jellemzők oszlopba fűzi össze, amelyet egy klaszterező tréner használ;
- használjon egy KMeansTrainer oktatót a modell betanításához a k-means++ fürtözési algoritmus használatával.
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 adatkészletet 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 adatbetöltéshez és a modell betanításához:
var model = pipeline.Fit(dataView);
A modell mentése
Jelenleg egy olyan modellel rendelkezik, amely integrálható bármelyik meglévő vagy új .NET-alkalmazásba. Ha egy .zip fájlba szeretné menteni a modellt, adja hozzá az alábbi kódot a Fit metódus meghívásához:
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 az PredictionEngine<TSrc,TDst> osztályt, amely a bemeneti típus példányait az átalakító folyamaton keresztül veszi át, és létrehozza a kimeneti típus példányait. 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 egyszerű API, amely lehetővé teszi az előrejelzés végrehajtását egyetlen adatpéldányon.
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 az alkalmazás teljes területén használt ObjectPool objektumok PredictionEngine példányait hozza létre. Ebből az útmutatóból megtudhatja, hogyan használni PredictionEnginePool egy ASP.NET Core Web API-.
Jegyzet
PredictionEnginePool szolgáltatásbővítmény jelenleg előzetes verzióban érhető el.
Hozza létre a TestIrisData osztályt a tesztelési adatpéldányok létrehozásához:
A Megoldáskezelőkattintson a jobb gombbal a projektre, majd válassza a >Új elem hozzáadásalehetőséget.
Az Új elem hozzáadása párbeszédpanelen válassza ki az Osztály lehetőséget, és módosítsa a Név mezőt TestIrisData.csnévre. Ezután válassza hozzáadása lehetőséget.
Módosítsa az osztályt úgy, hogy statikus legyen, mint az alábbi példában:
static class TestIrisData
Ez az oktatóanyag egy íriszadat-példányt mutat be ebben az osztályban. Más forgatókönyveket is hozzáadhat a modell kipróbálásához. 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
};
Ahhoz, hogy megállapítsa, melyik fürthöz tartozik a megadott elem, menjen vissza a Program.cs fájlhoz, és adja hozzá a következő kódot a fájl aljára:
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 adatot, továbbá az adott adattól a fürt centroidjaiig mért négyzetes távolságokat is ellenőrizheti. Az eredményeknek a következőhöz hasonlónak kell lenniük:
Cluster: 2
Distances: 11.69127 0.02159119 25.59896
Gratulálok! Most már sikeresen létrehozott egy gépi tanulási modellt az íriszek klaszterezéséhez, é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.
Következő lépések
Ebben az oktatóanyagban megtanulta, hogyan:
- 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
A tanulás folytatásához és további minták kereséséhez tekintse meg a dotnet/machinelearning GitHub-adattárat.