Oktatóanyag: Webhely-megjegyzések hangulatának elemzése bináris besorolással a ML.NET
Ez az oktatóanyag bemutatja, hogyan hozhat létre egy .NET Core-konzolalkalmazást, amely besorolja a hangulatot a webhely megjegyzéseiből, és végrehajtja a megfelelő műveletet. A bináris hangulatosztályozó a C# karaktert használja a Visual Studio 2022-ben.
Eben az oktatóanyagban az alábbiakkal fog megismerkedni:
- Konzolalkalmazás létrehozása
- Adatok előkészítése
- Az adatok betöltése
- A modell létrehozása és betanítása
- A modell é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
Konzolalkalmazás létrehozása
Hozzon létre egy "SentimentAnalysis" 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 (Adatok ) nevű könyvtárat a projektben az adatkészletfájlok mentéséhez.
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, majd válassza a Tallózás lapot. Keresse meg a Microsoft.ML, válassza ki a kívánt csomagot, majd kattintson a Telepítés gombra. Folytassa a telepítést a választott csomag licencfeltételeinek elfogadásával.
Adatok előkészítése
Megjegyzés
Az oktatóanyaghoz tartozó adatkészletek a Kotzias et "A csoporttól az egyéni címkékig mély jellemzőkkel" című témakörből származnak. Al. KDD 2015, üzemeltetve az UCI Machine Learning Adattárban – 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 az UCI Sentiment Labeled Sentences adathalmaz ZIP-fájlát, és csomagolja ki.
Másolja a
yelp_labelled.txt
fájlt a létrehozott Adatkönyvtárba .A Megoldáskezelő kattintson a jobb gombbal a fájlra, és válassza a
yelp_labeled.txt
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.
Osztályok létrehozása és elérési utak definiálása
Adja hozzá a következő további
using
utasításokat 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 az utasítások alatti
using
sorhoz, hogy létrehozhasson egy mezőt, amely a legutóbb letöltött adathalmaz fájlelé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 előrejelzésekhez. Adjon hozzá egy új osztályt a projekthez:
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 SentimentData.cs névre. Ezután válassza a Hozzáadás gombot.
Megnyílik a SentimentData.cs fájl a kódszerkesztőben. Adja hozzá a következő
using
utasítást a SentimentData.cs fájl elejéhez:using Microsoft.ML.Data;
Távolítsa el a meglévő osztálydefiníciót, és adja hozzá a következő kódot, amelynek két osztálya
SentimentData
ésSentimentPrediction
van, a SentimentData.cs fájlhoz: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álya SentimentData
() felhasználói megjegyzésekhez (SentimentText
) és bool
(Sentiment
) 1 (pozitív) vagy 0 (negatív) értékkel rendelkezik string
a hangulathoz. Mindkét mezőhöz LoadColumn attribútumok vannak csatolva, amelyek az egyes mezők adatfájl-sorrendjét írják le. A tulajdonság emellett egy ColumnName attribútummal is rendelkezik, Sentiment
amely mezőként Label
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. | 0 |
A kéreg nem jó. | 0 |
Wow... 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. Öröklődik, SentimentData
így a bemenet SentimentText
megjeleníthető a kimeneti előrejelzéssel együtt. A Prediction
logikai érték az az érték, amelyet a modell előre jelez, ha új bemenetet SentimentText
ad meg.
A kimeneti osztály SentimentPrediction
két másik, a modell által kiszámított tulajdonságot tartalmaz: Score
a modell által kiszámított nyers pontszámot és Probability
- a pozitív hangulatú szöveg valószínűségéhez kalibrált pontszámot.
Ebben az oktatóanyagban a legfontosabb tulajdonság a Prediction
.
Az adatok betöltése
A ML.NET adatai IDataView-felületként jelennek meg. IDataView
rugalmas, hatékony módja a táblázatos adatok (numerikus és szöveges) leírásának. Az adatok betölthetők szövegfájlból vagy valós időben (például SQL-adatbázisból vagy naplófájlokból) egy IDataView
objektumba.
Az MLContext osztály minden ML.NET művelet kiindulási pontja. Az inicializálás mlContext
új ML.NET környezetet hoz létre, amely megosztható a modelllétrehozás munkafolyamat-objektumai között. Ez fogalmilag hasonló az Entity Frameworkhez DBContext
.
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 metódust
LoadData()
a fájl alján aProgram.cs
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 betanítási és tesztelési adatkészletekre osztja.
- Az osztott betanítási és 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ájlt. Az adatelérési út változóit veszi fel, és egy
IDataView
értéket ad 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 fogja használni 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 az osztályban való DataOperationsCatalog.TrainTestData visszaadásához. Adja meg az adatok százalékos arányát a
testFraction
paraméterrel. Az alapértelmezett érték 10%, ebben az esetben 20%-ot használ a további adatok kiértékeléséhez.splitDataView
A metódus végén adja vissza aLoadData()
értéket:return splitDataView;
A modell létrehozása és betanítása
Adja hozzá a következő hívást a
BuildAndTrainModel
metódushoz a hívás alatti metódushozLoadData
:ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);
A
BuildAndTrainModel()
metódus a következő feladatokat hajtja végre:- Kinyeri és átalakítja az adatokat.
- Betanítása a modellnek.
- 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ívás
FeaturizeText
a kód következő soraként:var estimator = mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText))
Az
FeaturizeText()
előző kódban szereplő metódus a szövegoszlopot (SentimentText
) a gépi tanulási algoritmus által használt numerikus kulcs típusúFeatures
oszlopmá alakítja, és új adathalmazoszlopként adja hozzá:Hangulatszöveg Hangulat Funkciók A pincérnő egy kicsit lassú volt. 0 [0.76, 0.65, 0.44, ...] A kéreg nem jó. 0 [0.98, 0.43, 0.54, ...] Wow... 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ívként 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 következő kódsorhoz:BuildAndTrainModel()
.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));
A SdcaLogisticRegressionBinaryTrainer az Ön besorolási betanítási algoritmusa. Ez hozzá lesz fűzve a estimator
elemhez, és elfogadja a featurizált SentimentText
(Features
) és a Label
bemeneti paramétereket, hogy tanuljanak az előzményadatokból.
A modell betanítása
Illesztse be a modellt az 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 betanított modell visszaadása
Adja vissza a modellt a BuildAndTrainModel()
metódus végén:
return model;
A modell é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 metódust
Evaluate()
közvetlenül utánaBuildAndTrainModel()
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 metódushívás alatti
BuildAndTrainModel
új metódushoz a következő kóddal:Evaluate(mlContext, model, splitDataView.TestSet);
Az adatok átalakításához
splitTestSet
adja hozzá a következő kódot a következőhözEvaluate()
:Console.WriteLine("=============== Evaluating Model accuracy with Test data==============="); IDataView predictions = model.Transform(splitTestSet);
Az előző kód a Transform() metódussal készít előrejelzéseket egy tesztadatkészlet több megadott bemeneti sorához.
Értékelje ki a modellt úgy, hogy hozzáadja a következő kódsort a
Evaluate()
metódushoz:CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
Ha már rendelkezik az előrejelzési készlettel (predictions
), a Evaluate() metódus kiértékeli a modellt, amely összehasonlítja az előrejelzett értékeket a Labels
tesztadatkészlet tényleges értékével, é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
Accuracy
metrika lekéri egy modell pontosságát, amely a tesztkészlet helyes előrejelzéseinek aránya.A
AreaUnderRocCurve
metrika azt jelzi, hogy a modell mennyire biztos abban, hogy helyesen sorolja be a pozitív és negatív osztályokat. Azt szeretné, hogy aAreaUnderRocCurve
lehető legközelebb legyen az egyikhez.A
F1Score
metrika lekéri a modell F1 pontszámát, amely a pontosság és a visszahívás közötti egyensúly mértéke. Azt szeretné, hogy aF1Score
lehető legközelebb legyen az egyikhez.
A tesztadatok eredményének előrejelzése
Hozza létre a metódust
UseModelWithSingleItem()
közvetlenül 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 tesztadatokról.
- A tesztadatok alapján előrejelzi a hangulatot.
- A tesztelési adatokat és az előrejelzéseket kombinálja a jelentéskészítéshez.
- 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 a metódus első soraként
UseModelWithSingleItem()
létrehozandó kódhoz:PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(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 aPredictionEnginePool
szolgáltatást, amely objektumokat hoz létreObjectPool
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.Adjon hozzá egy megjegyzést a betanított modell előrejelzésének teszteléséhez a metódusban egy
UseModelWithSingleItem()
példány létrehozásávalSentimentData
:SentimentData sampleStatement = new SentimentData { SentimentText = "This was a very bad steak" };
Adja át a teszt megjegyzésadatait a
PredictionEngine
metódus következőUseModelWithSingleItem()
kódsoraiként:var resultPrediction = predictionFunction.Predict(sampleStatement);
A Predict() függvény egyetlen adatsorra ad előrejelzést.
A következő kóddal jelenítheti meg és jelenítheti meg
SentimentText
a hangulat előrejelzését: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
Batch-elemek üzembe helyezése és előrejelzése
Hozza létre a metódust
UseModelWithBatchItems()
közvetlenül 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 tesztelési adatokat és az előrejelzéseket kombinálja a jelentéskészítéshez.
- 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 használatával 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 kombinálása é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 SentimentPrediction
a(z) örökli a metódust SentimentData
, az Transform()
előrejelzett SentimentText
mezőkkel van feltöltve. A ML.NET folyamat során minden összetevő oszlopokat ad hozzá, így egyszerűen 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 ===============");
Results (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 üzenetek feldolgozása. Ezek az egyértelműség érdekében el lettek távolítva az alábbi 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álunk! Sikeresen létrehozott egy gépi tanulási modellt az üzenetek hangulatának besorolá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 az egyes algoritmusokhoz különböző hiperparaméterekkel rendelkező különböző betanítási algoritmusok kiválasztásával próbálkozhat.
Az oktatóanyag forráskódját a dotnet/samples adattárban találja.
További lépések
Ez az oktatóanyag bemutatta, hogyan végezheti el az alábbi műveleteket:
- Konzolalkalmazás létrehozása
- Adatok előkészítése
- Az adatok betöltése
- A modell létrehozása és betanítása
- A modell é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