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
Vytvořte konzolovou aplikaci jazyka C# s názvem SentimentAnalysis. Klikněte na tlačítko Další .
Jako architekturu, kterou chcete použít, zvolte .NET 6. Klikněte na tlačítko Vytvořit.
Vytvořte v projektu adresář s názvem Data a uložte soubory datových sad.
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.
Stáhněte si soubor ZIP datové sady UCI Sentiment Labeled Sentences a rozbalte ho.
yelp_labelled.txt
Zkopírujte soubor do adresáře Data, který jste vytvořili.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
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;
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");
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 .
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;
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
Třída SentimentData
vstupní 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 Prediction
nejdů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:
Console.WriteLine("Hello World!")
Nahraďte řádek následujícím kódem, který deklaruje a inicializuje proměnnou mlContext:MLContext mlContext = new MLContext();
Jako další řádek kódu přidejte následující:
TrainTestData splitDataView = LoadData(mlContext);
Vytvořte metodu
LoadData()
v dolní částiProgram.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.
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í
IDataView
hodnotu .
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.
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
testFraction
testovací sady. Výchozí hodnota je 10 %, v tomto případě použijete 20 % k vyhodnocení více dat.splitDataView
Na konciLoadData()
metody vraťte hodnotu:return splitDataView;
Sestavení a trénování modelu
Přidejte následující volání metody
BuildAndTrainModel
pod volánímLoadData
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.
Vytvořte metodu
BuildAndTrainModel()
pod metodouLoadData()
pomocí následujícího kódu:ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet) { }
Extrakce a transformace dat
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 typuFeatures
čí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.
Vytvořte metodu
Evaluate()
hned zaBuildAndTrainModel()
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.
Přidejte volání nové metody pod
BuildAndTrainModel
volání metody pomocí následujícího kódu:Evaluate(mlContext, model, splitDataView.TestSet);
Transformujte
splitTestSet
data 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
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 bylAreaUnderRocCurve
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 bylF1Score
co nejblíže k jednomu z nich.
Predikce výsledku testovacích dat
Vytvořte metodu
UseModelWithSingleItem()
hned za metodouEvaluate()
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.
Přidejte volání nové metody přímo pod
Evaluate()
volání metody pomocí následujícího kódu:UseModelWithSingleItem(mlContext, model);
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žijtePredictionEnginePool
službu, která vytvoříPredictionEngine
ObjectPool
objekty pro použití v celé aplikaci. Projděte si tohoto průvodce používánímPredictionEnginePool
ve webovém rozhraní API ASP.NET Core.Poznámka
PredictionEnginePool
rozšíření služby je aktuálně ve verzi Preview.Přidejte komentář k otestování předpovědi vytrénovaného modelu v
UseModelWithSingleItem()
metodě vytvořením instanceSentimentData
:SentimentData sampleStatement = new SentimentData { SentimentText = "This was a very bad steak" };
Předejte data testovacího komentáře do
PredictionEngine
metody přidáním následujícího řádku jako další řádky kódu vUseModelWithSingleItem()
metodě:var resultPrediction = predictionFunction.Predict(sampleStatement);
Funkce Predict() vytvoří předpověď na jeden řádek dat.
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
Vytvořte metodu
UseModelWithBatchItems()
hned za metodouUseModelWithSingleItem()
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.
Přidejte volání nové metody přímo pod
UseModelWithSingleItem()
volání metody pomocí následujícího kódu:UseModelWithBatchItems(mlContext, model);
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.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro