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


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

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 8-at a használni kívánt keretrendszerként. Kattintson a létrehozása gombra.

  3. Hozzon létre egy Data nevű könyvtárat a projektben az adatkészletfájlok mentéséhez.

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

  1. Töltse le a UCI Sentiment-címkézett Mondatok adatkészlet ZIP-fájlt, és bontsa ki.

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

  3. A Megoldáskezelőben kattintson a jobb gombbal a yelp_labelled.txt fá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

  1. Adja hozzá a következő további using irányelveket 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 a using irá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");
    
  3. 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.

  4. Megnyílik a SentimentData.cs fájl a kódszerkesztőben. Adja hozzá a következő using irányelvet a SentimentData.cselejé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 a SentimentData fá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:

  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 LoadData() metódust a Program.cs fá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.
  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á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.

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

  2. Adja vissza a splitDataView a LoadData() metódus végén:

    return splitDataView;
    

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

  1. Adja hozzá a következő hívást a BuildAndTrainModelmetódushoz a LoadData metó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.
  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ívja meg FeaturizeText a 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ú Features oszlopmá 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.

  1. Hozza létre a Evaluate() metódust BuildAndTrainModel()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.
  2. Adjon hozzá egy hívást az BuildAndTrainModel metódushívás alatti új metódushoz a következő kóddal:

    Evaluate(mlContext, model, splitDataView.TestSet);
    
  3. A splitTestSet adatok átalakításához adja hozzá a következő kódot a Evaluate()-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.

  4. É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 Accuracy metrika lekéri a modell pontosságát, amely a tesztkészlet helyes előrejelzéseinek aránya.

  • A AreaUnderRocCurve metrika azt jelzi, hogy a modell mennyire magabiztosan sorolja be a pozitív és negatív osztályokat. Szeretnénk elérni, hogy a AreaUnderRocCurve a lehető legközelebb legyen az egyhez.

  • A F1Score metrika 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 a F1Score a lehető legközelebb legyen az egyhez.

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

  1. Hozza létre a UseModelWithSingleItem() metódust 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 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.
  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, 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. PredictionEngine nem 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 a PredictionEnginePool szolgáltatást, amely ObjectPool hoz létre PredictionEngine objektumokból az alkalmazás teljes területén való használatra. Nézze meg ezt az útmutatót arról, hogyan kell használni PredictionEnginePool egy ASP.NET Core Web API-t.

    Jegyzet

    PredictionEnginePool szolgáltatásbővítmény jelenleg előzetes verzióban érhető el.

  4. Megjegyzés hozzáadása a betanított modell előrejelzésének teszteléséhez a UseModelWithSingleItem() metódusban egy SentimentData-példány létrehozásával:

    SentimentData sampleStatement = new SentimentData
    {
        SentimentText = "This was a very bad steak"
    };
    
  5. Adja át a teszt megjegyzésadatait a PredictionEngine-nak azáltal, hogy a következő sorokat hozzáadja a kódhoz a UseModelWithSingleItem() metódusban:

    var resultPrediction = predictionFunction.Predict(sampleStatement);
    

    A Predict() függvény egyetlen adatsorra készít előrejelzést.

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

  1. Hozza létre a UseModelWithBatchItems() metódust 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 jelentéskészítéshez használt tesztadatokat és előrejelzéseket egyesíti.
    • 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 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