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 egy .NET-konzolalkalmazást, amely osztályozza a webhely megjegyzéseiből származó hangulatot, és végrehajtja a megfelelő műveletet. A bináris hangulatosztályozó c#-t használ a Visual Studio 2022-ben.
Ebben az oktatóanyagban a következőket sajátíthatja el:
- Konzolalkalmazás létrehozása
- Adatok előkészítése
- Adatok betöltése
- A modell létrehozása és betanítása
- A modell kiértékelése
- Előrejelzés készítése a modell használatával
- Az eredmények megtekintése
Az oktatóanyag forráskódját a dotnet/samples adattárban találja.
Előfeltételek
Visual Studio 2022 vagy újabb verzió.
UCI címkézett mondatok adatkészlete (ZIP-fájl)
Konzolalkalmazás létrehozása
Hozzon létre egy "SentimentAnalysis" 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észletfájlok mentéséhez.
Telepítse a Microsoft.ML NuGet-csomag:
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őben kattintson a jobb gombbal a projektre, és válassza a NuGet-csomagok kezeléselehetőséget. Válassza a "nuget.org" lehetőséget a csomag forrásaként, majd válassza a Tallózás lapot. Keresse meg a Microsoft.ML, jelölje ki a kívánt csomagot, majd válassza a Telepítéslehetőséget. Folytassa a telepítést a választott csomag licencfeltételeinek elfogadásával.
Az adatok előkészítése
Jegyzet
Az oktatóanyag adatkészletei a "Csoporttól az egyéni címkékig mély jellemzők használatával", Kotzias et al. KDD 2015, és az UCI Machine Learning Adattárban üzemeltetett – Dua, D. és Karra Taniskidou, E. (2017). UCI Machine Learning-adattár [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.
Töltse le a UCI Sentiment-címkézett Mondatok adatkészlet ZIP-fájlt, és bontsa ki.
Másolja a
yelp_labelled.txtfájlt a létrehozott Data könyvtárba.A Megoldáskezelőben kattintson a jobb gombbal a
yelp_labelled.txtfájlra, és válassza a Tulajdonságoklehetőséget. A Haladóterületen módosítsa a Másolás kimeneti könyvtárba értékét Másolás, ha újabb.
Osztályok létrehozása és útvonalak definiálása
Adja hozzá a következő további
usingirányelveket a Program.cs fájl elejéhez:using Microsoft.ML; using Microsoft.ML.Data; using SentimentAnalysis; using static Microsoft.ML.DataOperationsCatalog;Adja hozzá a következő kódot a
usingirányelvek alatti sorhoz, hogy létrehozhasson egy mezőt, amely a legutóbb letöltött adathalmazfájl elérési útját tárolja:string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "yelp_labelled.txt");Ezután hozzon létre osztályokat a bemeneti adatokhoz és az előrejelzésekhez. Adjon hozzá egy új osztályt a projekthez:
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 az Osztály opciót, és módosítsa a Név mezőt SentimentData.cs. Ezután válassza hozzáadása lehetőséget.
Megnyílik a SentimentData.cs fájl a kódszerkesztőben. Adja hozzá a következő
usingirányelvet a SentimentData.cselejéhez:using Microsoft.ML.Data;Távolítsa el a meglévő osztálydefiníciót, és adja hozzá a következő kódot a
SentimentDatafájlba, amely két osztályt tartalmaz,SentimentPredictionés :public class SentimentData { [LoadColumn(0)] public string? SentimentText; [LoadColumn(1), ColumnName("Label")] public bool Sentiment; } public class SentimentPrediction : SentimentData { [ColumnName("PredictedLabel")] public bool Prediction { get; set; } public float Probability { get; set; } public float Score { get; set; } }
Az adatok előkészítése
A bemeneti adathalmaz-osztály (SentimentData) string a felhasználói megjegyzésekhez (SentimentText) és a hangulathoz 1 (pozitív) vagy 0 (negatív) bool (Sentiment) értékkel rendelkezik. Mindkét mezőhöz LoadColumn attribútum tartozik, amely az egyes mezők adatfájl-sorrendjét írja le. Emellett a Sentiment tulajdonság ColumnName attribútummal rendelkezik, amely Label mezőként jelöli meg. Az alábbi példafájl nem tartalmaz fejlécsort, és így néz ki:
| Hangulatszöveg | Hangulat (címke) |
|---|---|
| A pincérnő egy kicsit lassú volt a szolgáltatásban. | 0 |
| A kéreg nem jó. | 0 |
| Hú... Imádtam ezt a helyet. | 1 |
| A szolgáltatás nagyon gyors volt. | 1 |
SentimentPrediction a modell betanítása után használt előrejelzési osztály. A SentimentData örökli, így a bemeneti SentimentText a kimeneti előrejelzéssel együtt jeleníthető meg. A Prediction logikai érték az, amit a modell előre jelez, amikor új bemenetet, SentimentText-et kap.
A kimeneti osztály SentimentPrediction a modell által kiszámított két másik tulajdonságot tartalmazza: Score - a modell által kiszámított nyers pontszámot, és Probability - a pozitív hangulatú szöveg valószínűségére kalibrált pontszámot.
Ebben az oktatóanyagban a legfontosabb tulajdonság a Prediction.
Adatok betöltése
Az ML.NET az adatokat az IDataView interfészkéntképviseli.
IDataView a táblázatos adatok (numerikus és szöveges) leírásának rugalmas és hatékony módja. Az adatok betölthetők szöveges fájlból vagy valós időben (például SQL-adatbázisból vagy naplófájlokból) egy IDataView objektumba.
A MLContext osztály minden ML.NET művelet kiindulópontja. A mlContext inicializálása új ML.NET környezetet hoz létre, amely megosztható a modelllétrehozás munkafolyamat-objektumai között. Ez fogalmilag hasonlít az Entity Frameworkben lévő DBContext-ra.
Előkészíti az alkalmazást, majd betölti az adatokat:
Cserélje le a
Console.WriteLine("Hello World!")sort a következő kódra az mlContext változó deklarálásához és inicializálásához:MLContext mlContext = new MLContext();Adja hozzá a következő kódsort:
TrainTestData splitDataView = LoadData(mlContext);Hozzon létre egy
LoadData()metódust aProgram.csfájl alján a következő kóddal:TrainTestData LoadData(MLContext mlContext) { }A
LoadData()metódus a következő feladatokat hajtja végre:- Betölti az adatokat.
- A betöltött adatkészletet felosztja betanítási és tesztelési adatkészletekre.
- Az osztott betanítást és a tesztelési adatkészleteket adja vissza.
Adja hozzá a következő kódot a
LoadData()metódus első soraként:IDataView dataView = mlContext.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);A LoadFromTextFile() metódus határozza meg az adatsémát, és beolvassa a fájlban. Felveszi az adatútvonal változóit, és egy
IDataViewad vissza.
Az adatkészlet felosztása modellbetanításhoz és teszteléshez
A modell előkészítésekor az adathalmaz egy részét használja a betanításhoz, az adathalmaz egy részét pedig a modell pontosságának teszteléséhez.
Ha fel szeretné osztani a betöltött adatokat a szükséges adatkészletekre, adja hozzá a következő kódot a
LoadData()metódus következő soraként:TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);Az előző kód a TrainTestSplit() metódust használja a betöltött adathalmaz betanítási és tesztelési adatkészletekre való felosztásához, majd a DataOperationsCatalog.TrainTestData osztályba való visszavételéhez. Adja meg a tesztkészlet adatok százalékos arányát a
testFractionparaméterrel. Az alapértelmezett érték 10%, ebben az esetben 20% használ további adatok kiértékeléséhez.Adja vissza a
splitDataViewaLoadData()metódus végén:return splitDataView;
A modell létrehozása és betanítása
Adja hozzá a következő hívást a
BuildAndTrainModelmetódushoz aLoadDatametódus hívása alatt:ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);A
BuildAndTrainModel()metódus a következő feladatokat hajtja végre:- Kinyeri és átalakítja az adatokat.
- A modell betanítása.
- A tesztadatok alapján előrejelzi a hangulatot.
- A modellt adja vissza.
Hozza létre a
BuildAndTrainModel()metódust aLoadData()metódus alatt a következő kóddal:ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet) { }
Adatok kinyerése és átalakítása
Hívja meg
FeaturizeTexta következő kódsorként:var estimator = mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText))Az előző kód
FeaturizeText()metódusa a szövegoszlopot (SentimentText) numerikus kulcs típusúFeaturesoszlopmá alakítja, amelyet a gépi tanulási algoritmus használ, és új adathalmazoszlopként adja hozzá:Hangulatszöveg Érzelem Funkciók A pincérnő egy kicsit lassú volt a szolgáltatásban. 0 [0.76, 0.65, 0.44, …] A kéreg nem jó. 0 [0.98, 0.43, 0.54, …] Hú... Imádtam ezt a helyet. 1 [0.35, 0.73, 0.46, …] A szolgáltatás nagyon gyors volt. 1 [0.39, 0, 0.75, …]
Tanulási algoritmus hozzáadása
Ez az alkalmazás egy besorolási algoritmust használ, amely kategorizálja az elemeket vagy adatsorokat. Az alkalmazás pozitív vagy negatívként kategorizálja a webhely megjegyzéseit, ezért használja a bináris besorolási feladatot.
Fűzze hozzá a gépi tanulási feladatot az adatátalakítási definíciókhoz úgy, hogy a következő kódsort adja hozzá a BuildAndTrainModel():
.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));
A SdcaLogisticRegressionBinaryTrainer az ön osztályozási tanulási algoritmusa. Ez hozzáfűződik a estimator-hoz, és elfogadja a featurizált SentimentText (Features) és a Label bemeneti paramétereket, hogy az előzményadatokból tanuljon.
A modell betanítása
Illesztse a modellt a splitTrainSet adatokhoz, és adja vissza a betanított modellt úgy, hogy a következő kódsort adja hozzá a BuildAndTrainModel() metódushoz:
Console.WriteLine("=============== Create and Train the Model ===============");
var model = estimator.Fit(splitTrainSet);
Console.WriteLine("=============== End of training ===============");
Console.WriteLine();
A Fit() metódus az adathalmaz átalakításával és a betanítás alkalmazásával tanítja be a modellt.
A kiértékeléshez használandó betanított modellt adja vissza.
Adja vissza a modellt a BuildAndTrainModel() metódus végén:
return model;
A modell kiértékelése
A modell betanítása után használja a tesztadatokat a modell teljesítményének ellenőrzéséhez.
Hozza létre a
Evaluate()metódustBuildAndTrainModel()után a következő kóddal:void Evaluate(MLContext mlContext, ITransformer model, IDataView splitTestSet) { }A
Evaluate()metódus a következő feladatokat hajtja végre:- Betölti a tesztadatkészletet.
- Létrehozza a BinaryClassification kiértékelőt.
- Kiértékeli a modellt, és metrikákat hoz létre.
- Megjeleníti a metrikákat.
Adjon hozzá egy hívást az
BuildAndTrainModelmetódushívás alatti új metódushoz a következő kóddal:Evaluate(mlContext, model, splitDataView.TestSet);A
splitTestSetadatok átalakításához adja hozzá a következő kódot aEvaluate()-höz:Console.WriteLine("=============== Evaluating Model accuracy with Test data==============="); IDataView predictions = model.Transform(splitTestSet);Az előző kód a Transform() metódust használja egy tesztadatkészlet több megadott bemeneti sorának előrejelzésére.
Értékelje ki a modellt úgy, hogy a következő kódsort adja hozzá a
Evaluate()metódushoz:CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
Ha már rendelkezik az előrejelzési csoporttal (predictions), a Evaluate() metódus kiértékeli a modellt, amely összehasonlítja az előrejelzett értékeket a tesztadatkészlet tényleges Labels, és visszaad egy KalibráltBinaryClassificationMetrics objektumot a modell teljesítményéről.
A modellérvényesítés metrikáinak megjelenítése
A metrikák megjelenítéséhez használja az alábbi kódot:
Console.WriteLine();
Console.WriteLine("Model quality metrics evaluation");
Console.WriteLine("--------------------------------");
Console.WriteLine($"Accuracy: {metrics.Accuracy:P2}");
Console.WriteLine($"Auc: {metrics.AreaUnderRocCurve:P2}");
Console.WriteLine($"F1Score: {metrics.F1Score:P2}");
Console.WriteLine("=============== End of model evaluation ===============");
A
Accuracymetrika lekéri a modell pontosságát, amely a tesztkészlet helyes előrejelzéseinek aránya.A
AreaUnderRocCurvemetrika azt jelzi, hogy a modell mennyire magabiztosan sorolja be a pozitív és negatív osztályokat. Szeretnénk elérni, hogy aAreaUnderRocCurvea lehető legközelebb legyen az egyhez.A
F1Scoremetrika lekéri a modell F1-pontszámát, amely a pontosság és visszahívásközötti kiegyensúlyozottság mértéke. Szeretnénk elérni, hogy aF1Scorea lehető legközelebb legyen az egyhez.
A tesztadatok eredményének előrejelzése
Hozza létre a
UseModelWithSingleItem()metódust aEvaluate()metódus után, a következő kóddal:void UseModelWithSingleItem(MLContext mlContext, ITransformer model) { }A
UseModelWithSingleItem()metódus a következő feladatokat hajtja végre:- Egyetlen megjegyzést hoz létre a tesztadatokhoz.
- A tesztadatok alapján előrejelzi a hangulatot.
- A jelentéskészítéshez használt tesztadatokat és előrejelzéseket egyesíti.
- Megjeleníti az előrejelzett eredményeket.
Adjon hozzá egy hívást az új metódushoz közvetlenül a
Evaluate()metódushívás alatt a következő kóddal:UseModelWithSingleItem(mlContext, model);Adja hozzá a következő kódot, amely a
UseModelWithSingleItem()metódus első soraként hozható létre:PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);A PredictionEngine egy egyszerű API, amely lehetővé teszi az előrejelzés végrehajtását egyetlen adatpéldányon.
PredictionEnginenem szálbiztos. Egyszálas vagy prototípusos környezetben is használható. Az éles környezetekben a jobb teljesítmény és a szálbiztonság érdekében használja aPredictionEnginePoolszolgáltatást, amelyObjectPoolhoz létrePredictionEngineobjektumokból az alkalmazás teljes területén való használatra. Nézze meg ezt az útmutatót arról, hogyan kell használniPredictionEnginePoolegy ASP.NET Core Web API-t.Jegyzet
PredictionEnginePoolszolgáltatásbővítmény jelenleg előzetes verzióban érhető el.Megjegyzés hozzáadása a betanított modell előrejelzésének teszteléséhez a
UseModelWithSingleItem()metódusban egySentimentData-példány létrehozásával:SentimentData sampleStatement = new SentimentData { SentimentText = "This was a very bad steak" };Adja át a teszt megjegyzésadatait a
PredictionEngine-nak azáltal, hogy a következő sorokat hozzáadja a kódhoz aUseModelWithSingleItem()metódusban:var resultPrediction = predictionFunction.Predict(sampleStatement);A Predict() függvény egyetlen adatsorra készít előrejelzést.
A
SentimentTextés a megfelelő hangulat-előrejelzés megjelenítése az alábbi kód használatával:Console.WriteLine(); Console.WriteLine("=============== Prediction Test of model with a single sample and test dataset ==============="); Console.WriteLine(); Console.WriteLine($"Sentiment: {resultPrediction.SentimentText} | Prediction: {(Convert.ToBoolean(resultPrediction.Prediction) ? "Positive" : "Negative")} | Probability: {resultPrediction.Probability} "); Console.WriteLine("=============== End of Predictions ==============="); Console.WriteLine();
A modell használata előrejelzéshez
Kötegelt tételek üzembe helyezése és előrejelzése
Hozza létre a
UseModelWithBatchItems()metódust aUseModelWithSingleItem()metódus után, a következő kóddal:void UseModelWithBatchItems(MLContext mlContext, ITransformer model) { }A
UseModelWithBatchItems()metódus a következő feladatokat hajtja végre:- Kötegelt tesztadatokat hoz létre.
- A tesztadatok alapján előrejelzi a hangulatot.
- A jelentéskészítéshez használt tesztadatokat és előrejelzéseket egyesíti.
- Megjeleníti az előrejelzett eredményeket.
Adjon hozzá egy hívást az új metódushoz közvetlenül a
UseModelWithSingleItem()metódushívás alatt a következő kóddal:UseModelWithBatchItems(mlContext, model);Adjon hozzá néhány megjegyzést a betanított modell előrejelzéseinek teszteléséhez a
UseModelWithBatchItems()metódusban:IEnumerable<SentimentData> sentiments = new[] { new SentimentData { SentimentText = "This was a horrible meal" }, new SentimentData { SentimentText = "I love this spaghetti." } };
Megjegyzés hangulatának előrejelzése
A modell segítségével előrejelezheti a megjegyzésadatok hangulatát a Transform() metódussal:
IDataView batchComments = mlContext.Data.LoadFromEnumerable(sentiments);
IDataView predictions = model.Transform(batchComments);
// Use model to predict whether comment data is Positive (1) or Negative (0).
IEnumerable<SentimentPrediction> predictedResults = mlContext.Data.CreateEnumerable<SentimentPrediction>(predictions, reuseRowObject: false);
Az előrejelzések egyesítése és megjelenítése
Hozzon létre egy fejlécet az előrejelzésekhez a következő kóddal:
Console.WriteLine();
Console.WriteLine("=============== Prediction Test of loaded model with multiple samples ===============");
Mivel a SentimentPrediction örökölte a SentimentData-et, a Transform() metódus feltöltötte SentimentText-at az előrejelzett mezőkkel. A ML.NET folyamat során minden összetevő oszlopokat ad hozzá, így könnyen megjeleníthetők az eredmények:
foreach (SentimentPrediction prediction in predictedResults)
{
Console.WriteLine($"Sentiment: {prediction.SentimentText} | Prediction: {(Convert.ToBoolean(prediction.Prediction) ? "Positive" : "Negative")} | Probability: {prediction.Probability} ");
}
Console.WriteLine("=============== End of predictions ===============");
Eredmények
Az eredményeknek az alábbihoz hasonlónak kell lenniük. A feldolgozás során üzenetek jelennek meg. Megjelenhetnek figyelmeztetések vagy feldolgozási üzenetek. Ezek az egyértelműség érdekében el lettek távolítva a következő eredményekből.
Model quality metrics evaluation
--------------------------------
Accuracy: 83.96%
Auc: 90.51%
F1Score: 84.04%
=============== End of model evaluation ===============
=============== Prediction Test of model with a single sample and test dataset ===============
Sentiment: This was a very bad steak | Prediction: Negative | Probability: 0.1027377
=============== End of Predictions ===============
=============== Prediction Test of loaded model with a multiple samples ===============
Sentiment: This was a horrible meal | Prediction: Negative | Probability: 0.1369192
Sentiment: I love this spaghetti. | Prediction: Positive | Probability: 0.9960636
=============== End of predictions ===============
=============== End of process ===============
Press any key to continue . . .
Gratulálok! Sikeresen létrehozott egy gépi tanulási modellt az üzenetek hangulatának osztályozására és előrejelzésére.
A sikeres modellek létrehozása iteratív folyamat. Ez a modell kezdeti minősége alacsonyabb, mivel az oktatóanyag kis adatkészleteket használ a modell gyors betanításához. Ha nem elégedett a modell minőségével, nagyobb betanítási adatkészletek biztosításával vagy különböző betanítási algoritmusok választásával, különböző hiperparaméterekkel az egyes algoritmusokhoz.
Az oktatóanyag forráskódját a dotnet/samples adattárban találja.
Következő lépések
Ebben az oktatóanyagban megtanulta, hogyan:
- Konzolalkalmazás létrehozása
- Adatok előkészítése
- Adatok betöltése
- A modell létrehozása és betanítása
- A modell kiértékelése
- Előrejelzés készítése a modell használatával
- Az eredmények megtekintése
További információért lépjen tovább a következő oktatóanyagra