Kurz: Analýza mínění komentářů na webu s binární klasifikací v ML.NET
V tomto kurzu se dozvíte, jak vytvořit konzolovou aplikaci .NET, která klasifikuje mínění z komentářů na webu a provede příslušnou akci. Klasifikátor binárního 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
- Zobrazit výsledky
Zdrojový kód pro tento kurz najdete v úložišti dotnet/samples.
Požadavky
datová sada vět s popisky mínění UCI (soubor ZIP)
Vytvoření konzolové aplikace
Vytvořte konzolovou aplikaci C# s názvem SentimentAnalysis. Klikněte na tlačítko Další.
Jako architekturu, která se má použít, zvolte .NET 8. Klikněte na tlačítko Vytvořit.
Vytvořte adresář s názvem Data v projektu a uložte soubory datové sady.
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íku ř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 Nainstalovat. Pokračujte v instalaci tím, že souhlasíte s licenčními podmínkami pro balíček, který zvolíte.
Příprava dat
Poznámka
Datové sady pro tento kurz jsou z "From Group to Individual Labels using Deep Features", Kotzias et al. KDD 2015 a hostovaný v úložišti UCI Machine Learning – Dua, D. a Karra Taniskidou, E. (2017). Úložiště strojového učení UCI [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.
Stáhněte soubor ZIP s datovou sadou UCI Sentiment Labeled Sentencesa rozbalte ho.
Zkopírujte soubor
yelp_labelled.txt
do adresáře Data, který jste vytvořili.V Průzkumníku řešení klikněte pravým tlačítkem na soubor
yelp_labelled.txt
a vyberte Vlastnosti. V části Upřesnitzměň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
Na začátek souboru Program.cs přidejte následující další direktivy
using
:using Microsoft.ML; using Microsoft.ML.Data; using SentimentAnalysis; using static Microsoft.ML.DataOperationsCatalog;
Na řádek přímo pod direktivy
using
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");
Dále vytvořte třídy pro vstupní data a předpovědi. Přidejte do projektu novou třídu:
V Průzkumníku řešeníklikněte pravým tlačítkem myši na projekt a potom vyberte možnost Přidat>Nová položka.
V dialogovém okně Přidat novou položku vyberte Třída a změňte pole Název na SentimentData.cs. Pak vyberte Přidat.
Soubor SentimentData.cs se otevře v editoru kódu. Na začátek SentimentData.cspřidejte následující direktivu
using
:using Microsoft.ML.Data;
Odeberte existující definici třídy a do souboru SentimentData.cs přidejte následující kód, který má dvě třídy
SentimentData
aSentimentPrediction
: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
Vstupní třída datové sady, SentimentData
, má string
pro komentáře uživatelů (SentimentText
) a bool
(Sentiment
) hodnotu 1 (kladné) nebo 0 (záporné) pro mínění. Obě pole mají LoadColumn atributy, které popisují pořadí datových souborů jednotlivých polí. Kromě toho vlastnost Sentiment
má atribut ColumnName, který jej označí jako pole Label
. Následující ukázkový soubor neobsahuje řádek záhlaví a vypadá takto:
SentimentText | Sentiment (Štítek) |
---|---|
Servírka byla trochu pomalá ve službě. | 0 |
Kůrka není dobrá. | 0 |
Páni... Miloval jsem toto místo. | 1 |
Služba byla velmi rychlá. | 1 |
SentimentPrediction
je třída predikce použitá po trénování modelu. Dědí z SentimentData
, aby bylo možné zobrazit vstup SentimentText
spolu s predikcí výstupu. Logická hodnota Prediction
je hodnota, kterou model předpovídá při zadání nového vstupního 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 má pozitivní mínění.
V tomto návodu je nejdůležitější vlastností Prediction
.
Načtení dat
Data v ML.NET jsou reprezentována jako rozhraní IDataView.
IDataView
je flexibilní, efektivní způsob popisu tabulkových dat (číselných a textových). Data lze 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. Je to podobné, koncepčně, DBContext
v Entity Frameworku.
Připravíte aplikaci a pak načtete data:
Nahraďte řádek
Console.WriteLine("Hello World!")
následujícím kódem, který deklaruje a inicializuje proměnnou mlContext:MLContext mlContext = new MLContext();
Přidejte následující řádek kódu:
TrainTestData splitDataView = LoadData(mlContext);
V dolní části souboru
Program.cs
vytvořte metoduLoadData()
pomocí následujícího kódu:TrainTestData LoadData(MLContext mlContext) { }
Metoda
LoadData()
provádí následující úlohy:- Načte data.
- Rozdělí načtenou datovou sadu na trénovací a testovací sady.
- Vrátí rozdělené trénovací a testovací datové sady.
Jako první řádek metody
LoadData()
přidejte následující kód:IDataView dataView = mlContext.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);
Metoda LoadFromTextFile() definuje schéma dat a načte soubor. Přebírá proměnné cesty k datům a vrací
IDataView
.
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 části datové sady k otestování přesnosti modelu.
Pro rozdělení načtených dat do potřebných datových sad přidejte do metody
LoadData()
následující kód:TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);
Předchozí kód používá metodu TrainTestSplit() rozdělit načtenou datovou sadu na trénovací a testovací datové sady a vrátit je do třídy DataOperationsCatalog.TrainTestData. Zadejte procento testovací sady dat pomocí parametru
testFraction
. Výchozí hodnota je 10%, v tomto případě použijete 20% k vyhodnocení dalších dat.Vraťte
splitDataView
na konci metodyLoadData()
.return splitDataView;
Sestavení a trénování modelu
Do metody
BuildAndTrainModel
pod volání metodyLoadData
přidejte následující volání:ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);
Metoda
BuildAndTrainModel()
provádí 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.
Pomocí následujícího kódu vytvořte metodu
BuildAndTrainModel()
pod metodouLoadData()
:ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet) { }
Extrahujte a transformujte data
Zadejte
FeaturizeText
jako další řádek 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 číselný typ klíčeFeatures
sloupec používaný algoritmem strojového učení a přidá ho jako nový sloupec datové sady:SentimentText Cítění Funkce Servírka byla trochu pomalá ve službě. 0 [0.76, 0.65, 0.44, …] Krusta není dobrá. 0 [0.98, 0.43, 0.54, …] Páni... Miloval jsem 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řidejte ú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 váš tréninkový algoritmus pro klasifikaci. Připojí se k estimator
a přijme featurizovaný SentimentText
(Features
) a vstupní parametry Label
, které se mají učit z historických dat.
Trénování modelu
Přizpůsobit model datům splitTrainSet
a vrátit trénovaný model 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í.
Vraťte model vytrénovaný k použití pro vyhodnocení
Vraťte model na konci metody BuildAndTrainModel()
:
return model;
Vyhodnocení modelu
Po natrénování modelu pomocí testovacích dat ověřte výkon modelu.
Vytvořte metodu
Evaluate()
hned poBuildAndTrainModel()
s následujícím kódem:void Evaluate(MLContext mlContext, ITransformer model, IDataView splitTestSet) { }
Metoda
Evaluate()
provádí následující úlohy:- Načte testovací datovou sadu.
- Vytvoří vyhodnocovač BinaryClassification.
- Vyhodnotí model a vytvoří metriky.
- Zobrazí metriky.
Přidejte volání nové metody pod volání metody
BuildAndTrainModel
pomocí následujícího kódu:Evaluate(mlContext, model, splitDataView.TestSet);
Transformujte data
splitTestSet
přidáním následujícího kódu doEvaluate()
: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.
Vyhodnoťte model přidáním následujícího řádku kódu do metody
Evaluate()
:CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
Jakmile máte sadu predikcí (predictions
), metoda Evaluate() vyhodnotí model tím, že porovná predikované hodnoty se skutečnými Labels
v testovací datové sadě a vrátí objekt KalibrovanýBinaryClassificationMetrics , který ukazuje, 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 poměr správných předpovědí v testovací sadě.Metrika
AreaUnderRocCurve
ukazuje, jak sebejistý je model ve správné klasifikaci kladných a záporných tříd. Chcete, aby bylAreaUnderRocCurve
co nejblíže jednomu.Metrika
F1Score
určuje F1 skóre modelu, což je ukazatel rovnováhy mezi přesností a citlivostí. Chcete, aby bylF1Score
co nejblíže jednomu.
Predikce výsledku testovacích dat
Pomocí následujícího kódu vytvořte metodu
UseModelWithSingleItem()
hned za metodouEvaluate()
:void UseModelWithSingleItem(MLContext mlContext, ITransformer model) { }
Metoda
UseModelWithSingleItem()
provádí následující úlohy:- Vytvoří jeden komentář testovacích dat.
- Předpovídá mínění na základě testovacích dat.
- Kombinuje testovací data a předpovědi pro vytváření reportů.
- Zobrazí predikované výsledky.
Přidejte volání nové metody přímo pod volání metody
Evaluate()
pomocí následujícího kódu:UseModelWithSingleItem(mlContext, model);
Do metody
UseModelWithSingleItem()
přidejte následující kód, který se vytvoří jako první řádek:PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);
PredictionEngine je pohodlné rozhraní API, které umožňuje provádět predikci pro jednu instanci dat.
PredictionEngine
není bezpečná pro přístup z více vláken. Je přijatelné použít v jednovláknovém nebo prototypovém prostředí. Pokud chcete zvýšit výkon a bezpečnost vláken v produkčních prostředích, použijte službuPredictionEnginePool
, která vytvoříObjectPool
objektůPredictionEngine
pro použití v celé aplikaci. V této příručce se dozvíte, jak používatPredictionEnginePool
vwebového rozhraní API ASP.NET Core .Poznámka
rozšíření služby
PredictionEnginePool
je aktuálně ve verzi Preview.Přidejte komentář k otestování předpovědi vytrénovaného modelu v metodě
UseModelWithSingleItem()
vytvořením instanceSentimentData
:SentimentData sampleStatement = new SentimentData { SentimentText = "This was a very bad steak" };
Předejte data testovacího komentáře do
PredictionEngine
přidáním následujících řádků kódu do metodyUseModelWithSingleItem()
:var resultPrediction = predictionFunction.Predict(sampleStatement);
Funkce Predict() vytvoří předpověď na jednom řádku dat.
Pomocí následujícího kódu zobrazte
SentimentText
a odpovídající predikci mínění: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 předpověď dávkových položek
Pomocí následujícího kódu vytvořte metodu
UseModelWithBatchItems()
hned za metodouUseModelWithSingleItem()
:void UseModelWithBatchItems(MLContext mlContext, ITransformer model) { }
Metoda
UseModelWithBatchItems()
provádí následující úlohy:- Vytvoří dávková testovací data.
- Předpovídá mínění na základě testovacích dat.
- Kombinuje testovací data a předpovědi pro generování zpráv.
- Zobrazí predikované výsledky.
Přidejte volání nové metody přímo pod volání metody
UseModelWithSingleItem()
pomocí následujícího kódu:UseModelWithBatchItems(mlContext, model);
Přidejte nějaké komentáře k otestování predikcí vytrénovaného modelu v metodě
UseModelWithBatchItems()
:IEnumerable<SentimentData> sentiments = new[] { new SentimentData { SentimentText = "This was a horrible meal" }, new SentimentData { SentimentText = "I love this spaghetti." } };
Předpovězte sentiment komentáře
Pomocí modelu můžete předpovědět mínění o 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í
Pomocí následujícího kódu vytvořte hlavičku pro predikce:
Console.WriteLine();
Console.WriteLine("=============== Prediction Test of loaded model with multiple samples ===============");
Vzhledem k tomu, že SentimentPrediction
je zděděna z SentimentData
, metoda Transform()
naplnila SentimentText
předpokládanými poli. Vzhledem k tomu, že proces ML.NET zpracovává, přidává každá komponenta sloupce a 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 měly být podobné následujícímu. Během zpracování se zobrazí zprávy. Můžete vidět upozornění nebo zprávy o zpracování. Byly odebrány z následujících výsledků, aby byly přehledné.
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 . . .
Blahopřejeme! Nyní jste úspěšně vytvořili model strojového učení pro klasifikaci a předpovídání 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 se pokusit ho vylepšit tím, že poskytnete větší trénovací datové sady nebo zvolíte různé trénovací algoritmy 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
- Zobrazit výsledky
Další informace najdete v dalším kurzu.