Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Lernprogramm erfahren Sie, wie Sie eine .NET-Konsolenanwendung erstellen, die die Stimmung von Websitekommentaren klassifiziert und die entsprechende Aktion ausführt. Der Klassifizierer für binäre Stimmungen verwendet C# in Visual Studio 2022.
In diesem Tutorial erfahren Sie, wie:
- Erstellen einer Konsolenanwendung
- Vorbereiten von Daten
- Laden der Daten
- Erstellen und Trainieren des Modells
- Auswerten des Modells
- Verwenden des Modells zum Erstellen einer Vorhersage
- Die Ergebnisse anzeigen
Den Quellcode für dieses Lernprogramm finden Sie im Repository dotnet/samples .
Voraussetzungen
Erstellen einer Konsolenanwendung
Erstellen Sie eine C# -Konsolenanwendung namens "SentimentAnalysis". Klicken Sie auf die Schaltfläche Weiter .
Wählen Sie .NET 8 als zu verwendende Framework aus. Klicken Sie auf die Schaltfläche " Erstellen ".
Erstellen Sie ein Verzeichnis mit dem Namen "Daten " in Ihrem Projekt, um Ihre Datasetdateien zu speichern.
Installieren Sie das Microsoft.ML NuGet-Paket:
Hinweis
In diesem Beispiel wird die neueste stabile Version der erwähnten NuGet-Pakete verwendet, sofern nichts anderes angegeben ist.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, und wählen Sie "NuGet-Pakete verwalten" aus. Wählen Sie "nuget.org" als Paketquelle aus, und wählen Sie dann die Registerkarte " Durchsuchen " aus. Suchen Sie nach Microsoft.ML, wählen Sie das gewünschte Paket und dann "Installieren" aus. Fahren Sie mit der Installation fort, indem Sie den Lizenzbedingungen für das von Ihnen ausgewählte Paket zustimmen.
Bereiten Sie die Daten vor.
Hinweis
Die Datensätze für dieses Lernprogramm stammen aus der Veröffentlichung „From Group to Individual Labels using Deep Features“ von Kotzias et al. KDD 2015 und gehostet im UCI Machine Learning Repository - Dua, D. und Karra Taniskidou, E. (2017). UCI Machine Learning Repository [http://archive.ics.uci.edu/ml]. Irvine, C. A.: University of California, School of Information and Computer Science.
Laden Sie die ZIP-Datei "UCI Sentiment Labeled Sentences" herunter, und entzippen Sie die ZIP-Datei.
Kopieren Sie die
yelp_labelled.txtDatei in das von Ihnen erstellte Datenverzeichnis .Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die
yelp_labelled.txtDatei, und wählen Sie "Eigenschaften" aus. Ändern Sie unter Erweitert den Wert von In Ausgabeordner kopieren in Kopieren, wenn neuer.
Erstellen von Klassen und Definieren von Pfaden
Fügen Sie oben in der
usingdie folgenden zusätzlichen Direktiven hinzu:using Microsoft.ML; using Microsoft.ML.Data; using SentimentAnalysis; using static Microsoft.ML.DataOperationsCatalog;Fügen Sie der Zeile direkt unterhalb der
usingDirektiven den folgenden Code hinzu, um ein Feld zu erstellen, das den zuletzt heruntergeladenen Datasetdateipfad enthält:string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "yelp_labelled.txt");Erstellen Sie als Nächstes Klassen für Ihre Eingabedaten und -vorhersagen. Fügen Sie Ihrem Projekt eine neue Klasse hinzu:
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann "> hinzufügen" aus.
Wählen Sie im Dialogfeld " Neues Element hinzufügen " " Klasse " aus, und ändern Sie das Feld "Name " in SentimentData.cs. Klicken Sie anschließend auf Hinzufügen.
Die SentimentData.cs Datei wird im Code-Editor geöffnet. Fügen Sie oben
usingdie folgende Direktive hinzu:using Microsoft.ML.Data;Entfernen Sie die vorhandene Klassendefinition und fügen Sie den folgenden Code hinzu, welcher die zwei Klassen
SentimentDataundSentimentPredictionenthält, in die Datei SentimentData.cs hinzu: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; } }
Wie die Daten vorbereitet wurden
Die Eingabe-Datasetklasse SentimentDatahat einen string Wert für Benutzerkommentare (SentimentText) und einen bool (Sentiment) Wert von 1 (positiv) oder 0 (negativ) für die Stimmung. Beide Felder verfügen über "LoadColumn "-Attribute, die die Datendateireihenfolge jedes Felds beschreiben. Darüber hinaus verfügt die Sentiment Eigenschaft über ein ColumnName-Attribut , um sie als Label Feld festzulegen. Die folgende Beispieldatei verfügt nicht über eine Kopfzeile und sieht wie folgt aus:
| SentimentText | Stimmung (Bezeichnung) |
|---|---|
| Waitress war ein wenig langsam im Dienst. | 0 |
| Die Kruste ist nicht gut. | 0 |
| Beeindruckend... Liebte diesen Ort. | 1 |
| Service war sehr prompt. | 1 |
SentimentPrediction ist die Vorhersageklasse, die nach der Modellschulung verwendet wird. Es erbt von SentimentData, damit die Eingabe SentimentText zusammen mit der Ausgabevorhersage angezeigt werden kann. Der Prediction boolesche Wert ist der Wert, der vom Modell vorhergesagt wird, wenn es mit neuen Eingaben SentimentTextbereitgestellt wird.
Die Ausgabeklasse SentimentPrediction enthält zwei weitere Eigenschaften, die vom Modell berechnet werden: Score - die vom Modell berechnete Rohbewertung und Probability - die Bewertung, die auf die Wahrscheinlichkeit des Texts mit positiven Stimmungen kalibriert wurde.
In diesem Lernprogramm ist die wichtigste Eigenschaft Prediction.
Laden der Daten
Daten in ML.NET werden als IDataView-Schnittstelle dargestellt.
IDataView ist eine flexible, effiziente Möglichkeit, tabellarische Daten (numerisch und Text) zu beschreiben. Daten können aus einer Textdatei oder in Echtzeit (z. B. SQL-Datenbank- oder Protokolldateien) in ein IDataView Objekt geladen werden.
Die MLContext-Klasse ist ein Ausgangspunkt für alle ML.NET Vorgänge. Beim Initialisieren mlContext wird eine neue ML.NET Umgebung erstellt, die für die Workflowobjekte der Modellerstellung freigegeben werden kann. Es ist konzeptionell ähnlich zu dem DBContext Entity Framework.
Sie bereiten die App vor und laden dann Daten:
Ersetzen Sie die
Console.WriteLine("Hello World!")Zeile durch den folgenden Code, um die mlContext-Variable zu deklarieren und zu initialisieren:MLContext mlContext = new MLContext();Fügen Sie Folgendes als nächste Codezeile hinzu:
TrainTestData splitDataView = LoadData(mlContext);Erstellen Sie unten in der
LoadData()Datei eineProgram.csMethode mit dem folgenden Code:TrainTestData LoadData(MLContext mlContext) { }Die
LoadData()Methode führt die folgenden Aufgaben aus:- Lädt die Daten.
- Teilt das geladene Dataset in Train- und Test-Datasets auf.
- Gibt die aufgeteilten Trainings- und Testdatensätze zurück.
Fügen Sie den folgenden Code als erste Zeile der
LoadData()Methode hinzu:IDataView dataView = mlContext.Data.LoadFromTextFile<SentimentData>(_dataPath, hasHeader: false);Die LoadFromTextFile()- Methode definiert das Datenschema und liest es in der Datei. Es nimmt die Datenpfadvariablen auf und gibt einen
IDataViewzurück.
Teilen des Datensatzes für Modellschulung und -tests
Beim Vorbereiten eines Modells verwenden Sie einen Teil des Datasets, um es und einen Teil des Datasets zu trainieren, um die Genauigkeit des Modells zu testen.
Um die geladenen Daten in die erforderlichen Datasets aufzuteilen, fügen Sie den folgenden Code als nächste Zeile in der
LoadData()Methode hinzu:TrainTestData splitDataView = mlContext.Data.TrainTestSplit(dataView, testFraction: 0.2);Der vorherige Code verwendet die TrainTestSplit()- Methode, um das geladene Dataset in Train- und Test-Datasets aufzuteilen und in der DataOperationsCatalog.TrainTestData Klasse zurückzugeben. Geben Sie den Prozentsatz der Testsatzdaten mit dem
testFractionParameter an. Der Standardwert ist 10%, in diesem Fall verwenden Sie 20%, um weitere Daten auszuwerten.Gibt das
splitDataViewEnde derLoadData()Methode zurück:return splitDataView;
Erstellen und Trainieren des Modells
Fügen Sie den folgenden Aufruf der
BuildAndTrainModelMethode unterhalb des Aufrufs derLoadDataMethode hinzu:ITransformer model = BuildAndTrainModel(mlContext, splitDataView.TrainSet);Die
BuildAndTrainModel()Methode führt die folgenden Aufgaben aus:- Extrahiert und transformiert die Daten.
- Trainiert das Modell.
- Prognostiziert die Stimmung basierend auf Testdaten.
- Gibt das Modell zurück.
Erstellen Sie die
BuildAndTrainModel()Methode unter derLoadData()Methode mit dem folgenden Code:ITransformer BuildAndTrainModel(MLContext mlContext, IDataView splitTrainSet) { }
Extrahieren und Transformieren der Daten
Rufen Sie
FeaturizeTextals nächste Codezeile auf:var estimator = mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: nameof(SentimentData.SentimentText))Die
FeaturizeText()Methode im vorherigen Code konvertiert die Textspalte (SentimentText) in eine numerische SchlüsseltypspalteFeatures, die vom Machine Learning-Algorithmus verwendet wird, und fügt sie als neue Datasetspalte hinzu:SentimentText Gefühl Features Waitress war ein wenig langsam im Dienst. 0 [0.76, 0.65, 0.44, …] Die Kruste ist nicht gut. 0 [0.98, 0.43, 0.54, …] Beeindruckend... Liebte diesen Ort. 1 [0.35, 0.73, 0.46, …] Service war sehr prompt. 1 [0.39, 0, 0.75, …]
Hinzufügen eines Lernalgorithmus
Diese App verwendet einen Klassifizierungsalgorithmus, der Elemente oder Datenzeilen kategorisiert. Die App kategorisiert Websitekommentare entweder positiv oder negativ, verwenden Sie daher die Binäre Klassifizierungsaufgabe.
Fügen Sie die Aufgabe des maschinellen Lernens zu den Definitionen der Datentransformation hinzu, indem Sie Folgendes als nächste Zeile in BuildAndTrainModel() hinzufügen:
.Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));
Der SdcaLogisticRegressionBinaryTrainer ist Ihr Klassifizierungstrainingsalgorithmus. Dies wird an die featurisierte estimator und akzeptiert die SentimentText (Features) und die Label Eingabeparameter, um aus den historischen Daten zu lernen.
Trainieren des Modells
Passen Sie das Modell an die splitTrainSet Daten an, und geben Sie das trainierte Modell zurück, indem Sie Folgendes als nächste Codezeile in der BuildAndTrainModel() Methode hinzufügen:
Console.WriteLine("=============== Create and Train the Model ===============");
var model = estimator.Fit(splitTrainSet);
Console.WriteLine("=============== End of training ===============");
Console.WriteLine();
Die Fit()- Methode trainiert Ihr Modell, indem das Dataset transformiert und die Schulung angewendet wird.
Zurückgeben des modells, das für die Auswertung verwendet werden soll
Gibt das Modell am Ende der BuildAndTrainModel() Methode zurück:
return model;
Auswerten des Modells
Nachdem Ihr Modell trainiert wurde, verwenden Sie Ihre Testdaten, um die Leistung des Modells zu überprüfen.
Erstellen Sie die
Evaluate()Methode direkt hinterBuildAndTrainModel()dem folgenden Code:void Evaluate(MLContext mlContext, ITransformer model, IDataView splitTestSet) { }Die
Evaluate()Methode führt die folgenden Aufgaben aus:- Lädt das Test-Dataset.
- Erstellt den BinaryClassification-Evaluator.
- Wertet das Modell aus und erstellt Metriken.
- Zeigt die Metriken an.
Fügen Sie unterhalb des
BuildAndTrainModel-Methodenaufrufs einen Aufruf der neuen Methode mithilfe des folgenden Codes hinzu.Evaluate(mlContext, model, splitDataView.TestSet);Transformieren Sie die
splitTestSetDaten, indem Sie den folgenden Code hinzufügen zuEvaluate():Console.WriteLine("=============== Evaluating Model accuracy with Test data==============="); IDataView predictions = model.Transform(splitTestSet);Der vorherige Code verwendet die Transform()- Methode, um Vorhersagen für mehrere bereitgestellte Eingabezeilen eines Test-Datasets zu erstellen.
Bewerten Sie das Modell, indem Sie Folgendes als nächste Codezeile in der
Evaluate()Methode hinzufügen:CalibratedBinaryClassificationMetrics metrics = mlContext.BinaryClassification.Evaluate(predictions, "Label");
Nachdem Sie den Vorhersagesatz (predictions) festgelegt haben, bewertet die Evaluate() -Methode das Modell, das die vorhergesagten Werte mit dem tatsächlichen Labels Im Testdatensatz vergleicht und ein KalibrierBinaryClassificationMetrics-Objekt zurückgibt, wie das Modell ausgeführt wird.
Anzeigen der Metriken für die Modellüberprüfung
Verwenden Sie den folgenden Code, um die Metriken anzuzeigen:
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 ===============");
Die
AccuracyMetrik ruft die Genauigkeit eines Modells ab, bei dem es sich um den Anteil der richtigen Vorhersagen im Testsatz handelt.Die
AreaUnderRocCurveMetrik gibt an, wie sicher das Modell die positiven und negativen Klassen korrekt klassifizieren kann. Sie möchten, dass diesAreaUnderRocCurveso nah wie möglich ist.Die
F1ScoreMetrik ruft die F1-Bewertung des Modells ab, bei der es sich um ein Maß für das Gleichgewicht zwischen Genauigkeit und Rückruf handelt. Sie möchten, dass diesF1Scoreso nah wie möglich ist.
Vorhersagen des Testdatenergebnisses
Erstellen Sie die
UseModelWithSingleItem()Methode direkt nach derEvaluate()Methode mithilfe des folgenden Codes:void UseModelWithSingleItem(MLContext mlContext, ITransformer model) { }Die
UseModelWithSingleItem()Methode führt die folgenden Aufgaben aus:- Erstellt einen einzelnen Kommentar von Testdaten.
- Prognostiziert die Stimmung basierend auf Testdaten.
- Kombiniert Testdaten und Vorhersagen für die Berichterstellung.
- Zeigt die vorhergesagten Ergebnisse an.
Fügen Sie direkt unter dem
Evaluate()-Methodenaufruf einen Aufruf der neuen Methode mithilfe des folgenden Codes hinzu:UseModelWithSingleItem(mlContext, model);Fügen Sie den folgenden Code hinzu, der als erste Zeile in der
UseModelWithSingleItem()Methode erstellt werden soll:PredictionEngine<SentimentData, SentimentPrediction> predictionFunction = mlContext.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);Die PredictionEngine ist eine Komfort-API, mit der Sie eine Vorhersage für eine einzelne Instanz von Daten durchführen können.
PredictionEngineist nicht threadsicher. Es ist akzeptabel, in Singlethread- oder Prototypumgebungen zu verwenden. Um die Leistung und Threadsicherheit in Produktionsumgebungen zu verbessern, verwenden Sie denPredictionEnginePoolDienst, der eineObjectPoolVonPredictionEngineObjekten für die gesamte Anwendung erstellt. In diesem Handbuch erfahren Sie, wie Sie in einer ASP.NET Core Web-API verwendenPredictionEnginePool.Hinweis
PredictionEnginePoolDie Diensterweiterung befindet sich derzeit in der Vorschau.Fügen Sie einen Kommentar hinzu, um die Vorhersage des trainierten Modells in der
UseModelWithSingleItem()Methode zu testen, indem Sie eine Instanz vonSentimentDataerstellen.SentimentData sampleStatement = new SentimentData { SentimentText = "This was a very bad steak" };Übergeben Sie die Testkommentardaten an die
PredictionEngine, indem Sie die folgenden Zeilen als nächsten Code in der MethodeUseModelWithSingleItem()hinzufügen.var resultPrediction = predictionFunction.Predict(sampleStatement);Die Funktion "Vorhersagen()" macht eine Vorhersage für eine einzelne Datenzeile.
Anzeigen
SentimentTextund entsprechende Stimmungsvorhersage mithilfe des folgenden Codes: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();
Verwenden des Modells für die Vorhersage
Bereitstellen und Vorhersagen von Batchelementen
Erstellen Sie die
UseModelWithBatchItems()Methode direkt nach derUseModelWithSingleItem()Methode mithilfe des folgenden Codes:void UseModelWithBatchItems(MLContext mlContext, ITransformer model) { }Die
UseModelWithBatchItems()Methode führt die folgenden Aufgaben aus:- Erstellt Batchtestdaten.
- Prognostiziert die Stimmung basierend auf Testdaten.
- Kombiniert Testdaten und Vorhersagen für die Berichterstellung.
- Zeigt die vorhergesagten Ergebnisse an.
Fügen Sie direkt unter dem
UseModelWithSingleItem()-Methodenaufruf einen Aufruf der neuen Methode mithilfe des folgenden Codes hinzu:UseModelWithBatchItems(mlContext, model);Fügen Sie einige Kommentare hinzu, um die Vorhersagen des trainierten Modells in der
UseModelWithBatchItems()Methode zu testen:IEnumerable<SentimentData> sentiments = new[] { new SentimentData { SentimentText = "This was a horrible meal" }, new SentimentData { SentimentText = "I love this spaghetti." } };
Kommentarstimmung vorhersagen
Verwenden Sie das Modell, um die Kommentardatenstimmung mithilfe der Transform()- Methode vorherzusagen:
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);
Kombinieren und Anzeigen der Vorhersagen
Erstellen Sie einen Header für die Vorhersagen mithilfe des folgenden Codes:
Console.WriteLine();
Console.WriteLine("=============== Prediction Test of loaded model with multiple samples ===============");
Da SentimentPrediction geerbt wird, SentimentDatawird die Transform() Methode mit den vorhergesagten Feldern aufgefüllt SentimentText . Während der ML.NET-Prozess läuft, fügt jede Komponente Spalten hinzu, was die Anzeige der Ergebnisse erleichtert.
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 ===============");
Ergebnisse
Ihre Ergebnisse sollten dem Folgenden ähnlich sein. Während der Verarbeitung werden Nachrichten angezeigt. Möglicherweise werden Warnmeldungen oder Verarbeitungsnachrichten angezeigt. Diese wurden aus den folgenden Ergebnissen aus Gründen der Klarheit entfernt.
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 . . .
Glückwunsch! Sie haben nun erfolgreich ein Machine Learning-Modell für die Klassifizierung und Vorhersage von Nachrichtenstimmungen erstellt.
Das Erstellen erfolgreicher Modelle ist ein iterativer Prozess. Dieses Modell hat anfänglich eine niedrigere Qualität, da das Lernprogramm kleine Datasets verwendet, um schnelle Modellschulungen bereitzustellen. Wenn Sie mit der Modellqualität nicht zufrieden sind, können Sie versuchen, sie zu verbessern, indem Sie größere Schulungsdatensätze bereitstellen oder verschiedene Schulungsalgorithmen mit unterschiedlichen Hyperparametern für jeden Algorithmus auswählen.
Den Quellcode für dieses Lernprogramm finden Sie im Repository dotnet/samples .
Nächste Schritte
In diesem Tutorial haben Sie Folgendes gelernt:
- Erstellen einer Konsolenanwendung
- Vorbereiten von Daten
- Laden der Daten
- Erstellen und Trainieren des Modells
- Auswerten des Modells
- Verwenden des Modells zum Erstellen einer Vorhersage
- Die Ergebnisse anzeigen
Wechseln Sie zum nächsten Lernprogramm, um mehr zu erfahren