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

  1. Hozzon létre egy "SentimentAnalysis" 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 (Adatok ) nevű könyvtárat a projektben az adatkészletfájlok mentéséhez.

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

  1. Töltse le az UCI Sentiment Labeled Sentences adathalmaz ZIP-fájlát, és csomagolja ki.

  2. Másolja a yelp_labelled.txt fájlt a létrehozott Adatkönyvtárba .

  3. A Megoldáskezelő kattintson a jobb gombbal a fájlra, és válassza a yelp_labeled.txtTulajdonsá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

  1. 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;
    
  2. 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");
    
  3. 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.

  4. 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;
    
  5. 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 és SentimentPredictionvan, 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 SentimentTextad 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:

  1. 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();
    
  2. Adja hozzá a következő kódsort:

    TrainTestData splitDataView = LoadData(mlContext);
    
  3. Hozzon létre egy metódust LoadData() a fájl alján a Program.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.
  4. 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.

  1. 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 testFractionparaméterrel. Az alapértelmezett érték 10%, ebben az esetben 20%-ot használ a további adatok kiértékeléséhez.

  2. splitDataView A metódus végén adja vissza a LoadData() értéket:

    return splitDataView;
    

A modell létrehozása és betanítása

  1. Adja hozzá a következő hívást a BuildAndTrainModelmetódushoz a hívás alatti metódushoz LoadData :

    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.
  2. Hozza létre a BuildAndTrainModel() metódust a LoadData() metódus alatt a következő kóddal:

    ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet)
    {
    
    }
    

Adatok kinyerése és átalakítása

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

  1. Hozza létre a metódust Evaluate() közvetlenül utána BuildAndTrainModel()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.
  2. 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);
    
  3. Az adatok átalakításához splitTestSet adja hozzá a következő kódot a következőhöz Evaluate():

    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.

  4. É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 a AreaUnderRocCurve 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 a F1Score lehető legközelebb legyen az egyikhez.

A tesztadatok eredményének előrejelzése

  1. Hozza létre a metódust UseModelWithSingleItem() közvetlenül a Evaluate() 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.
  2. 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);
    
  3. 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 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.

  4. 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ával SentimentData:

    SentimentData sampleStatement = new SentimentData
    {
        SentimentText = "This was a very bad steak"
    };
    
  5. 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.

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

  1. Hozza létre a metódust UseModelWithBatchItems() közvetlenül a UseModelWithSingleItem() 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.
  2. 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);
    
  3. 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