Sdílet prostřednictvím


Kurz: Analýza mínění komentářů na webu pomocí binární klasifikace v ML.NET

V tomto kurzu se dozvíte, jak vytvořit konzolovou aplikaci .NET Core, která klasifikuje mínění z komentářů webu a provede příslušnou akci. Binární klasifikátor mínění používá jazyk C# v sadě Visual Studio 2022.

V tomto kurzu se naučíte:

  • Vytvoření konzolové aplikace
  • Příprava dat
  • Načtení dat
  • Sestavení a trénování modelu
  • Vyhodnocení modelu
  • Použití modelu k vytvoření předpovědi
  • Zobrazení výsledků

Zdrojový kód pro tento kurz najdete v úložišti dotnet/samples .

Požadavky

Vytvoření konzolové aplikace

  1. Vytvořte konzolovou aplikaci jazyka C# s názvem SentimentAnalysis. Klikněte na tlačítko Další .

  2. Jako architekturu, kterou chcete použít, zvolte .NET 6. Klikněte na tlačítko Vytvořit.

  3. Vytvořte v projektu adresář s názvem Data a uložte soubory datových sad.

  4. Nainstalujte balíček NuGet Microsoft.ML:

    Poznámka

    Tato ukázka používá nejnovější stabilní verzi uvedených balíčků NuGet, pokud není uvedeno jinak.

    V Průzkumník řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet. Jako zdroj balíčku zvolte "nuget.org" a pak vyberte kartu Procházet . Vyhledejte Microsoft.ML, vyberte požadovaný balíček a pak vyberte tlačítko Nainstalovat . Pokračujte v instalaci tím, že vyjádříte souhlas s licenčními podmínkami pro zvolený balíček.

Příprava dat

Poznámka

Datové sady pro tento kurz pocházejí z "Od skupiny k jednotlivým popiskům pomocí hlubokých funkcí", Kotzias et. Al. KDD 2015 a hostované v úložišti UCI Machine Learning – Dua, D. a Karra Taniskidou, E. (2017). Úložiště UCI Machine Learning [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.

  1. Stáhněte si soubor ZIP datové sady UCI Sentiment Labeled Sentences a rozbalte ho.

  2. yelp_labelled.txt Zkopírujte soubor do adresáře Data, který jste vytvořili.

  3. V Průzkumník řešení klikněte pravým tlačítkem na yelp_labeled.txt soubor a vyberte Vlastnosti. V části Upřesnit změňte hodnotu Kopírovat do výstupního adresáře na Kopírovat, pokud je novější.

Vytváření tříd a definování cest

  1. Na začátek souboru Program.cs přidejte následující další using příkazy:

    using Microsoft.ML;
    using Microsoft.ML.Data;
    using SentimentAnalysis;
    using static Microsoft.ML.DataOperationsCatalog;
    
  2. Na řádek přímo pod using příkazy přidejte následující kód, který vytvoří pole pro uložení nedávno stažené cesty k souboru datové sady:

    string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "yelp_labelled.txt");
    
  3. Dále vytvořte třídy pro vstupní data a předpovědi. Přidejte do projektu novou třídu:

    • V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a pak vyberte Přidat>novou položku.

    • V dialogovém okně Přidat novou položku vyberte Třída a změňte pole Název na SentimentData.cs. Pak vyberte tlačítko Přidat .

  4. Soubor SentimentData.cs se otevře v editoru kódu. Na začátek souboru SentimentData.cs přidejte následující using příkaz:

    using Microsoft.ML.Data;
    
  5. Odeberte existující definici třídy a do souboru SentimentData.cs přidejte následující kód, který má dvě třídy SentimentData a SentimentPrediction:

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

Způsob přípravy dat

Třída SentimentDatavstupní datové sady , má string hodnotu pro komentáře uživatele (SentimentText) a bool hodnotu (Sentiment) 1 (pozitivní) nebo 0 (negativní) pro mínění. Obě pole mají připojené atributy LoadColumn , které popisují pořadí datových souborů jednotlivých polí. Vlastnost má navíc atribut ColumnName, Sentiment který ho označí Label jako pole. Následující ukázkový soubor nemá řádek záhlaví a vypadá takto:

SentimentText Mínění (popisek)
Obsluha byla trochu pomalá. 0
Kůra není dobrá. 0
Wow... Miloval toto místo. 1
Služba byla velmi rychlá. 1

SentimentPrediction je třída předpovědi použitá po trénování modelu. Dědí z SentimentData , aby se vstup SentimentText mohl zobrazit spolu s predikcí výstupu. Logická Prediction hodnota je hodnota, kterou model předpovídá při dodání s novým vstupem SentimentText.

Výstupní třída SentimentPrediction obsahuje dvě další vlastnosti vypočítané modelem: Score nezpracované skóre vypočítané modelem a Probability - skóre kalibrované na pravděpodobnost, že text bude mít pozitivní mínění.

Pro účely tohoto kurzu je Predictionnejdůležitější vlastností .

Načtení dat

Data v ML.NET jsou reprezentována jako rozhraní IDataView. IDataView je flexibilní a efektivní způsob popisu tabulkových dat (číselných a textových). Data je možné načíst z textového souboru nebo v reálném čase (například z databáze SQL nebo souborů protokolu) do objektu IDataView .

Třída MLContext je výchozím bodem pro všechny operace ML.NET. Inicializace mlContext vytvoří nové ML.NET prostředí, které lze sdílet mezi objekty pracovního postupu vytváření modelu. Koncepčně DBContext je to podobné jako v Entity Frameworku.

Aplikaci připravíte a pak načtete data:

  1. Console.WriteLine("Hello World!") Nahraďte řádek následujícím kódem, který deklaruje a inicializuje proměnnou mlContext:

    MLContext mlContext = new MLContext();
    
  2. Jako další řádek kódu přidejte následující:

    TrainTestData splitDataView = LoadData(mlContext);
    
  3. Vytvořte metodu LoadData() v dolní části Program.cs souboru pomocí následujícího kódu:

    TrainTestData LoadData(MLContext mlContext)
    {
    
    }
    

    Metoda LoadData() provede následující úlohy:

    • Načte data.
    • Rozdělí načtenou datovou sadu na trénovou a testovací datovou sadu.
    • Vrátí rozdělené trénové a testovací datové sady.
  4. Jako první řádek LoadData() metody přidejte následující kód:

    IDataView dataView = mlContext.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);
    

    Metoda LoadFromTextFile() definuje schéma dat a čte v souboru. Přebírá proměnné cesty k datům a vrací IDataViewhodnotu .

Rozdělení datové sady pro trénování a testování modelu

Při přípravě modelu použijete část datové sady k jeho trénování a část datové sady k otestování přesnosti modelu.

  1. Pokud chcete načtená data rozdělit do potřebných datových sad, přidejte následující kód jako další řádek metody LoadData() :

    TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);
    

    Předchozí kód používá metodu TrainTestSplit() k rozdělení načtené datové sady na trénovací a testovací datové sady a vrátí je ve DataOperationsCatalog.TrainTestData třídě. Pomocí parametru zadejte procento dat testFractiontestovací sady. Výchozí hodnota je 10 %, v tomto případě použijete 20 % k vyhodnocení více dat.

  2. splitDataView Na konci LoadData() metody vraťte hodnotu:

    return splitDataView;
    

Sestavení a trénování modelu

  1. Přidejte následující volání metody BuildAndTrainModelpod voláním LoadData metody:

    ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);
    

    Metoda BuildAndTrainModel() provede následující úlohy:

    • Extrahuje a transformuje data.
    • Trénuje model.
    • Předpovídá mínění na základě testovacích dat.
    • Vrátí model.
  2. Vytvořte metodu BuildAndTrainModel() pod metodou LoadData() pomocí následujícího kódu:

    ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet)
    {
    
    }
    

Extrakce a transformace dat

  1. Volání FeaturizeText jako dalšího řádku kódu:

    var estimator = mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText))
    

    Metoda FeaturizeText() v předchozím kódu převede textový sloupec (SentimentText) na sloupec typu Features číselného klíče, který používá algoritmus strojového učení, a přidá ho jako nový sloupec datové sady:

    SentimentText Mínění Funkce
    Obsluha byla trochu pomalá. 0 [0.76, 0.65, 0.44, ...]
    Kůra není dobrá. 0 [0.98, 0.43, 0.54, ...]
    Wow... Miloval toto místo. 1 [0.35, 0.73, 0.46, ...]
    Služba byla velmi rychlá. 1 [0.39, 0, 0.75, ...]

Přidání algoritmu učení

Tato aplikace používá klasifikační algoritmus, který kategorizuje položky nebo řádky dat. Aplikace kategorizuje komentáře webu jako kladné nebo záporné, proto použijte úlohu binární klasifikace.

Připojte úlohu strojového učení k definicím transformace dat přidáním následujícího řádku kódu do BuildAndTrainModel():

.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));

SdcaLogisticRegressionBinaryTrainer je algoritmus trénování klasifikace. Toto je připojeno k objektu estimator a přijímá featurizované SentimentText parametry (Features) a Label vstupní parametry, které se mají učit z historických dat.

Trénování modelu

Přizpůsobení modelu datům splitTrainSet a vrácení natrénovaného modelu přidáním následujícího řádku kódu do BuildAndTrainModel() metody:

Console.WriteLine("=============== Create and Train the Model ===============");
var model = estimator.Fit(splitTrainSet);
Console.WriteLine("=============== End of training ===============");
Console.WriteLine();

Metoda Fit() trénuje model transformací datové sady a použitím trénování.

Vrácení modelu vytrénovaného pro vyhodnocení

Vraťte model na konci BuildAndTrainModel() metody:

return model;

Vyhodnocení modelu

Po natrénování modelu použijte testovací data k ověření výkonu modelu.

  1. Vytvořte metodu Evaluate() hned za BuildAndTrainModel()a s následujícím kódem:

    void Evaluate(MLContext mlContext, ITransformer model, IDataView splitTestSet)
    {
    
    }
    

    Metoda Evaluate() provede následující úlohy:

    • Načte testovací datovou sadu.
    • Vytvoří binaryClassification vyhodnocení.
    • Vyhodnotí model a vytvoří metriky.
    • Zobrazí metriky.
  2. Přidejte volání nové metody pod BuildAndTrainModel volání metody pomocí následujícího kódu:

    Evaluate(mlContext, model, splitDataView.TestSet);
    
  3. Transformujte splitTestSet data přidáním následujícího kódu do Evaluate():

    Console.WriteLine("=============== Evaluating Model accuracy with Test data===============");
    IDataView predictions = model.Transform(splitTestSet);
    

    Předchozí kód používá metodu Transform() k předpovědím pro více zadaných vstupních řádků testovací datové sady.

  4. Vyhodnoťte model přidáním následujícího řádku kódu do Evaluate() metody:

    CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
    

Jakmile máte sadu predikcí (predictions), metoda Evaluate() vyhodnotí model, který porovná predikované hodnoty se skutečnými Labels hodnotami v testovací datové sadě a vrátí objekt KalibredBinaryClassificationMetrics podle toho, jak model funguje.

Zobrazení metrik pro ověření modelu

K zobrazení metrik použijte následující kód:

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 ===============");
  • Metrika Accuracy získá přesnost modelu, což je podíl správných předpovědí v testovací sadě.

  • Metrika AreaUnderRocCurve označuje, jak je model jistý, že správně klasifikuje kladné a záporné třídy. Chcete, aby byl AreaUnderRocCurve co nejblíže k jednomu z nich.

  • Metrika F1Score získá skóre F1 modelu, což je míra rovnováhy mezi přesností a úplností. Chcete, aby byl F1Score co nejblíže k jednomu z nich.

Predikce výsledku testovacích dat

  1. Vytvořte metodu UseModelWithSingleItem() hned za metodou Evaluate() pomocí následujícího kódu:

    void UseModelWithSingleItem(MLContext mlContext, ITransformer model)
    {
    
    }
    

    Metoda UseModelWithSingleItem() provede následující úlohy:

    • Vytvoří jeden komentář k testovacím datům.
    • Předpovídá mínění na základě testovacích dat.
    • Kombinuje testovací data a předpovědi pro generování sestav.
    • Zobrazí predikované výsledky.
  2. Přidejte volání nové metody přímo pod Evaluate() volání metody pomocí následujícího kódu:

    UseModelWithSingleItem(mlContext, model);
    
  3. Přidejte následující kód, který chcete vytvořit jako první řádek v UseModelWithSingleItem() metodě:

    PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
    

    PredictionEngine je rozhraní API pro pohodlí, které umožňuje provádět předpovědi na jedné instanci dat. PredictionEngine není bezpečný pro přístup z více vláken. Je přijatelné používat v jednovláknovém nebo prototypovém prostředí. Pokud chcete zvýšit výkon a zabezpečení vláken v produkčních prostředích, použijte PredictionEnginePool službu, která vytvoří PredictionEngineObjectPool objekty pro použití v celé aplikaci. Projděte si tohoto průvodce používáním PredictionEnginePool ve webovém rozhraní API ASP.NET Core.

    Poznámka

    PredictionEnginePool rozšíření služby je aktuálně ve verzi Preview.

  4. Přidejte komentář k otestování předpovědi vytrénovaného modelu v UseModelWithSingleItem() metodě vytvořením instance SentimentData:

    SentimentData sampleStatement = new SentimentData
    {
        SentimentText = "This was a very bad steak"
    };
    
  5. Předejte data testovacího komentáře do PredictionEngine metody přidáním následujícího řádku jako další řádky kódu v UseModelWithSingleItem() metodě:

    var resultPrediction = predictionFunction.Predict(sampleStatement);
    

    Funkce Predict() vytvoří předpověď na jeden řádek dat.

  6. Zobrazení SentimentText a odpovídající předpovědi mínění pomocí následujícího kódu:

    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();
    

Použití modelu pro predikci

Nasazení a predikce dávkových položek

  1. Vytvořte metodu UseModelWithBatchItems() hned za metodou UseModelWithSingleItem() pomocí následujícího kódu:

    void UseModelWithBatchItems(MLContext mlContext, ITransformer model)
    {
    
    }
    

    Metoda UseModelWithBatchItems() provede následující úlohy:

    • Vytvoří data dávkového testu.
    • Předpovídá mínění na základě testovacích dat.
    • Kombinuje testovací data a předpovědi pro generování sestav.
    • Zobrazí predikované výsledky.
  2. Přidejte volání nové metody přímo pod UseModelWithSingleItem() volání metody pomocí následujícího kódu:

    UseModelWithBatchItems(mlContext, model);
    
  3. Přidejte několik komentářů k otestování predikcí natrénovaného modelu v UseModelWithBatchItems() metodě:

    IEnumerable<SentimentData> sentiments = new[]
    {
        new SentimentData
        {
            SentimentText = "This was a horrible meal"
        },
        new SentimentData
        {
            SentimentText = "I love this spaghetti."
        }
    };
    

Předpověď mínění komentářů

Pomocí modelu můžete předpovědět mínění v datech komentářů pomocí metody Transform():

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

Kombinování a zobrazení předpovědí

Vytvořte hlavičku pro předpovědi pomocí následujícího kódu:

Console.WriteLine();

Console.WriteLine("=============== Prediction Test of loaded model with multiple samples ===============");

Vzhledem k tomu SentimentPrediction , že je zděděná z SentimentData, Transform() metoda naplněná SentimentText predikovanými poli. Jak proces ML.NET proces, každá komponenta přidává sloupce, což usnadňuje zobrazení výsledků:

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 ===============");

Výsledky

Výsledky by se měly podobat následujícímu. Během zpracování se zobrazují zprávy. Může se zobrazit upozornění nebo zpracování zpráv. Ty byly z následujících výsledků pro přehlednost odebrány.

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

Gratulujeme! Teď jste úspěšně vytvořili model strojového učení pro klasifikaci a predikci mínění zpráv.

Vytváření úspěšných modelů je iterativní proces. Tento model má počáteční nižší kvalitu, protože kurz používá malé datové sady k zajištění rychlého trénování modelu. Pokud nejste spokojení s kvalitou modelu, můžete ji zkusit vylepšit poskytnutím větších trénovacích datových sad nebo výběrem různých trénovacích algoritmů s různými hyperparametry pro každý algoritmus.

Zdrojový kód pro tento kurz najdete v úložišti dotnet/samples .

Další kroky

V tomto kurzu jste se naučili:

  • Vytvoření konzolové aplikace
  • Příprava dat
  • Načtení dat
  • Sestavení a trénování modelu
  • Vyhodnocení modelu
  • Použití modelu k vytvoření předpovědi
  • Zobrazení výsledků

Další informace najdete v dalším kurzu.