Tutorial: Erstellen eines Programms zur Filmempfehlung mithilfe der Matrixfaktorisierung mit ML.NETTutorial: Build a movie recommender using matrix factorizaton with ML.NET

Dieses Tutorial zeigt Ihnen, wie Sie mithilfe von ML.NET in einer .NET Core-Konsolenanwendung ein Filmempfehlungssystem erstellen.This tutorial shows you how to build a movie recommender with ML.NET in a .NET Core console application. Für die Schritte verwenden Sie C# und Visual Studio 2019.The steps use C# and Visual Studio 2019.

In diesem Tutorial lernen Sie, wie die folgenden Aufgaben ausgeführt werden:In this tutorial, you learn how to:

  • Auswählen eines Machine Learning-AlgorithmusSelect a machine learning algorithm
  • Vorbereiten und Laden von DatenPrepare and load your data
  • Erstellen und Trainieren eines ModellsBuild and train a model
  • Auswerten eines ModellsEvaluate a model
  • Bereitstellen und Nutzen eines ModellsDeploy and consume a model

Sie finden den Quellcode für dieses Tutorial im Repository dotnet/samples.You can find the source code for this tutorial at the dotnet/samples repository.

Machine Learning-WorkflowMachine learning workflow

Die folgenden Schritten eignen sich für diese und alle anderen ML.NET-Aufgaben:You will use the following steps to accomplish your task, as well as any other ML.NET task:

  1. Laden von DatenLoad your data
  2. Erstellen und Trainieren des ModellsBuild and train your model
  3. Auswerten des ModellsEvaluate your model
  4. Verwenden des ModellsUse your model

Erforderliche KomponentenPrerequisites

Auswählen der entsprechenden Machine Learning-AufgabeSelect the appropriate machine learning task

Es gibt mehrere Möglichkeiten, ein Empfehlungssystem umzusetzen. Beispielsweise könnten Sie eine Liste mit empfohlenen Filmen oder mit ähnlichen Produkten erstellen. In diesem Szenario sagt Ihr Modell jedoch vorher, wie ein Benutzer einen bestimmten Film auf einer Skala von eins bis fünf bewertet. Falls dieser Wert höher als ein festgelegter Schwellenwert ist, wird der Film empfohlen. Dabei entsprechen höhere Bewertungen auch einer höheren Wahrscheinlichkeit dafür, dass ein Benutzer einen bestimmten Film mag.There are several ways to approach recommendation problems, such as recommending a list of movies or recommending a list of related products, but in this case you will predict what rating (1-5) a user will give to a particular movie and recommend that movie if it's higher than a defined threshold (the higher the rating, the higher the likelihood of a user liking a particular movie).

Erstellen einer KonsolenanwendungCreate a console application

Erstellen eines ProjektsCreate a project

  1. Öffnen Sie Visual Studio 2017.Open Visual Studio 2017. Wählen Sie Datei > Neu > Projekt aus der Menüleiste aus.Select File > New > Project from the menu bar. Wählen Sie im Dialogfeld Neues Projekt den Knoten Visual C# und anschließend den Knoten .NET Core aus.In the New Project dialog, select the Visual C# node followed by the .NET Core node. Klicken Sie dann auf die Projektvorlage Konsolen-App (.NET Core).Then select the Console App (.NET Core) project template. Geben Sie im Textfeld Name „MovieRecommender“ ein, und klicken Sie anschließend auf die Schaltfläche OK.In the Name text box, type "MovieRecommender" and then select the OK button.

  2. Erstellen Sie ein Verzeichnis mit dem Namen Data in Ihrem Projekt, um das Dataset zu speichern:Create a directory named Data in your project to store the data set:

    Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie Hinzufügen > Neuer Ordner aus.In Solution Explorer, right-click the project and select Add > New Folder. Geben Sie „Data“ ein, und drücken Sie die EINGABETASTE.Type "Data" and hit Enter.

  3. Installieren Sie die NuGet-Pakete Microsoft.ML und Microsoft.ML.Recommender:Install the Microsoft.ML and Microsoft.ML.Recommender NuGet Packages:

    Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie NuGet-Pakete verwalten aus.In Solution Explorer, right-click the project and select Manage NuGet Packages. Wählen Sie als Paketquelle „nuget.org“ aus. Wählen Sie anschließend die Registerkarte Durchsuchen aus, suchen Sie nach Microsoft.ML, und wählen Sie das Paket in der Liste und anschließend die Schaltfläche Installieren aus.Choose "nuget.org" as the Package source, select the Browse tab, search for Microsoft.ML, select the package in the list, and select the Install button. Wählen Sie die Schaltfläche OK im Dialogfeld Vorschau der Änderungen und dann die Schaltfläche Ich stimme zu im Dialogfeld Zustimmung zur Lizenz aus, wenn Sie den Lizenzbedingungen für die aufgelisteten Pakete zustimmen.Select the OK button on the Preview Changes dialog and then select the I Accept button on the License Acceptance dialog if you agree with the license terms for the packages listed. Wiederholen Sie diese Schritte für Microsoft.ML.Recommender.Repeat these steps for Microsoft.ML.Recommender.

  4. Fügen Sie am Anfang der Datei Program.cs die folgenden using-Anweisungen hinzu:Add the following using statements at the top of your Program.cs file:

    using System;
    using System.IO;
    using Microsoft.ML;
    using Microsoft.ML.Trainers;
    

Herunterladen der DatenDownload your data

  1. Laden Sie die beiden Datasets herunter, und speichern Sie sie im Ordner Data, den Sie vorher erstellt haben:Download the two datasets and save them to the Data folder you previously created:

    • Klicken Sie mit der rechten Maustaste auf recommendation-ratings-train.csv und anschließend auf „Save Link As...“ (Link speichern unter...) oder „Save Target As...“ (Ziel speichern unter...).Right click on recommendation-ratings-train.csv and select "Save Link (or Target) As..."

    • Klicken Sie mit der rechten Maustaste auf recommendation-ratings-test.csv und anschließend auf „Save Link As“ (Link speichern unter) oder „Save Target As“ (Ziel speichern unter).Right click on recommendation-ratings-test.csv and select "Save Link (or Target) As..."

      Achten Sie darauf, * die CSV-Dateien entweder im Ordner Data zu speichern oder sie in den Ordner Data zu verschieben, nachdem Sie * die Dateien an anderer Stelle gespeichert haben.Make sure you either save the *.csv files to the Data folder, or after you save it elsewhere, move the *.csv files to the Data folder.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die *.csv-Dateien, und wählen Sie Eigenschaften aus.In Solution Explorer, right-click each of the *.csv files and select Properties. Ändern Sie unter Erweitert den Wert von In Ausgabeverzeichnis kopieren in Kopieren, wenn neuer.Under Advanced, change the value of Copy to Output Directory to Copy if newer.

    GIF der Auswahl der Option „Kopieren, wenn neuer“

Laden von DatenLoad your data

Der erste Schritt im ML.NET-Prozess besteht darin, die Modelltrainings- und Testdaten vorzubereiten und zu laden.The first step in the ML.NET process is to prepare and load your model training and testing data.

Die Empfehlungsbewertungsdaten werden in die Datasets Train und Test unterteilt.The recommendation ratings data is split into Train and Test datasets. Die Train-Daten werden verwendet, um das Modell anzupassen.The Train data is used to fit your model. Die Test-Daten werden verwendet, um mit dem trainierten Modell Vorhersagen zu treffen und die Modellleistung auszuwerten.The Test data is used to make predictions with your trained model and evaluate model performance. Train- und Test-Daten werden üblicherweise im Verhältnis 80 zu 20 aufgeteilt.It's common to have an 80/20 split with Train and Test data.

Unten sehen Sie eine Vorschau der Daten aus den CSV-Dateien:Below is a preview of the data from your *.csv files:

Screenshot: Vorschau des CVS-Datasets

In den CSV-Dateien befinden sich vier Spalten:In the *.csv files, there are four columns:

  • userId
  • movieId
  • rating
  • timestamp

Im Machine Learning-Kontext heißen Spalten, mit denen eine Vorhersage getroffen wird, Features. Die Spalte mit der zurückgegebenen Vorhersage wird als Label bezeichnet.In machine learning, the columns that are used to make a prediction are called Features, and the column with the returned prediction is called the Label.

Da Sie Filmbewertungen vorhersagen möchten, ist Label die Bewertungsspalte.You want to predict movie ratings, so the rating column is the Label. Die anderen drei Spalten userId, movieId und timestamp sind alle Features, mit denen das Label vorhergesagt wird.The other three columns, userId, movieId, and timestamp are all Features used to predict the Label.

FeaturesFeatures BezeichnungLabel
userId rating
movieId
timestamp

Sie müssen selbst entscheiden, welche Features Sie verwenden möchten, um das Label vorherzusagen.It's up to you to decide which Features are used to predict the Label. Sie können auch Methoden wie Permutation Feature Importance verwenden, um die Auswahl der besten Features zu unterstützen.You can also use methods like permutation feature importance to help with selecting the best Features.

In diesem Tutorial sollten Sie die timestamp-Spalte nicht als Feature festlegen, da der Zeitstempel nicht beeinflusst, wie ein Benutzer einen Film bewertet, und daher nicht zu einer genaueren Vorhersage beitragen würde.In this case, you should eliminate the timestamp column as a Feature because the timestamp does not really affect how a user rates a given movie and thus would not contribute to making a more accurate prediction:

FeaturesFeatures BezeichnungLabel
userId rating
movieId

Als Nächstes müssen Sie die Datenstruktur für die Eingabeklasse definieren.Next you must define your data structure for the input class.

Fügen Sie dem Projekt eine neue Klasse hinzu:Add a new class to your project:

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und klicken Sie auf Hinzufügen > Neues Element.In Solution Explorer, right-click the project, and then select Add > New Item.

  2. Wählen Sie im Dialogfeld Neues Element hinzufügen die Option Klasse aus, und ändern Sie das Feld Name in MovieRatingData.cs.In the Add New Item dialog box, select Class and change the Name field to MovieRatingData.cs. Wählen Sie dann die Schaltfläche Hinzufügen aus.Then, select the Add button.

Die Datei MovieRatingData.cs wird im Code-Editor geöffnet.The MovieRatingData.cs file opens in the code editor. Fügen Sie am Anfang der Datei MovieRatingData.cs die folgende using-Anweisung hinzu:Add the following using statement to the top of MovieRatingData.cs:

using Microsoft.ML.Data;

Erstellen Sie eine Klasse mit dem Namen MovieRating, indem Sie die vorhandene Klassendefinition entfernen und MovieRatingData.cs den folgenden Code hinzufügen:Create a class called MovieRating by removing the existing class definition and adding the following code in MovieRatingData.cs:

public class MovieRating
{
    [LoadColumn(0)]
    public float userId;
    [LoadColumn(1)]
    public float movieId;
    [LoadColumn(2)]
    public float Label;
}

MovieRating ist eine Klasse für Eingabedaten.MovieRating specifies an input data class. Das LoadColumn-Attribut legt fest, welche Spalten (durch Angabe des Spaltenindex) im Dataset geladen werden sollen.The LoadColumn attribute specifies which columns (by column index) in the dataset should be loaded. Die Spalten userId und movieId sind Features, also die Eingaben, die dem Modell übergeben werden, um das Label vorherzusagen. Die Bewertungsspalte ist das vorhergesagte Label, also die Ausgabe des Modells.The userId and movieId columns are your Features (the inputs you will give the model to predict the Label), and the rating column is the Label that you will predict (the output of the model).

Erstellen Sie eine weitere Klasse mit dem Namen MovieRatingPrediction, um die vorhergesagten Ergebnisse darzustellen, indem Sie nach der Klasse MovieRating den folgenden Code in MovieRatingData.cs hinzufügen:Create another class, MovieRatingPrediction, to represent predicted results by adding the following code after the MovieRating class in MovieRatingData.cs:

public class MovieRatingPrediction
{
    public float Label;
    public float Score;
}

Ersetzen Sie in Program.cs innerhalb von Main() die Zeile Console.WriteLine("Hello World!") durch den folgenden Code:In Program.cs, replace the Console.WriteLine("Hello World!") with the following code inside Main():

MLContext mlContext = new MLContext();

Die MLContext-Klasse ist der Startpunkt für alle ML.NET-Vorgänge. Durch das Initialisieren von mlContext wird eine neue ML.NET-Umgebung erstellt, die für mehrere Objekte des Modellerstellungsworkflows verwendet werden kann.The MLContext class is a starting point for all ML.NET operations, and initializing mlContext creates a new ML.NET environment that can be shared across the model creation workflow objects. Die Klasse ähnelt dem Konzept von DBContext in Entity Framework.It's similar, conceptually, to DBContext in Entity Framework.

Erstellen Sie nach Main() die Methode LoadData():After Main(), create a method called LoadData():

public static (IDataView training, IDataView test) LoadData(MLContext mlContext)
{

}

Hinweis

Diese Methode löst zunächst eine Fehlermeldung aus. Dies ändert sich erst, wenn Sie in den folgenden Schritten eine Rückgabeanweisung hinzufügen.This method will give you an error until you add a return statement in the following steps.

Fügen Sie den unten aufgeführten Code als nächste Codezeilen in LoadData() ein, um die Datenpfadvariablen zu initialisieren, die Daten aus den CSV-Dateien zu laden und die Train- undTest -Daten als IDataView-Objekte zurückzugeben:Initialize your data path variables, load the data from the *.csv files, and return the Train and Test data as IDataView objects by adding the following as the next line of code in LoadData():

var trainingDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "recommendation-ratings-train.csv");
var testDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "recommendation-ratings-test.csv");

IDataView trainingDataView = mlContext.Data.LoadFromTextFile<MovieRating>(trainingDataPath, hasHeader: true, separatorChar: ',');
IDataView testDataView = mlContext.Data.LoadFromTextFile<MovieRating>(testDataPath, hasHeader: true, separatorChar: ',');

return (trainingDataView, testDataView);

Daten werden in ML.NET als IDataView-Klasse dargestellt.Data in ML.NET is represented as an IDataView class. Mit IDataView können Tabellendaten (Zahlen und Text) flexibel und effizient beschrieben werden.IDataView is a flexible, efficient way of describing tabular data (numeric and text). Daten können aus einer Textdatei oder in Echtzeit (z. B. aus einer SQL-Datenbank oder aus Protokolldateien) in ein IDataView-Objekt geladen werden.Data can be loaded from a text file or in real time (for example, SQL database or log files) to an IDataView object.

Die LoadFromTextFile()-Methode definiert das Datenschema und liest die Datei ein.The LoadFromTextFile() defines the data schema and reads in the file. Diese Methode akzeptiert Datenpfadvariablen und gibt ein IDataView-Objekt zurück.It takes in the data path variables and returns an IDataView. In diesem Tutorial geben Sie den Pfad für die Test- und Train-Dateien, den Textdateiheader (zur korrekten Verwendung der Spaltennamen) und das Komma als Zeichendatentrennzeichen an (das Standardtrennzeichen ist ein Tabstopp).In this case, you provide the path for your Test and Train files and indicate both the text file header (so it can use the column names properly) and the comma character data separator (the default separator is a tab).

Fügen Sie den folgenden Code zur Methode Main() hinzu, um die Methode LoadData() aufzurufen und die Daten Train und Test zurückzugeben:Add the following code in the Main() method to call your LoadData() method and return the Train and Test data:

(IDataView trainingDataView, IDataView testDataView) = LoadData(mlContext);

Erstellen und Trainieren des ModellsBuild and train your model

In ML.NET werden die folgenden drei Hauptkonzepte genutzt: Daten, Transformatoren (Transformers) und Schätzer (Estimators).There are three major concepts in ML.NET: Data, Transformers, and Estimators.

Für Machine Learning-Trainingsalgorithmen sind Daten in einem bestimmten Format erforderlich.Machine learning training algorithms require data in a certain format. Transformers werden verwendet, um Tabellendaten in ein kompatibles Format zu transformieren.Transformers are used to transform tabular data to a compatible format.

Diagramm des Transformationsdatenflusses

Transformers werden in ML.NET mithilfe von Estimators erstellt.You create Transformers in ML.NET by creating Estimators. Estimators akzeptieren Daten und geben Transformers zurück.Estimators take in data and return Transformers.

Diagramm des Schätzungsdatenflusses

Der Trainingsalgorithmus für Empfehlungen, den Sie für das Training des Modells einsetzen, ist ein Beispiel für einen Estimator.The recommendation training algorithm you will use for training your model is an example of an Estimator.

Erstellen Sie mit den folgenden Schritten einen Estimator:Build an Estimator with the following steps:

Erstellen Sie die BuildAndTrainModel()-Methode mit dem folgenden Code direkt nach der LoadData()-Methode:Create the BuildAndTrainModel() method, just after the LoadData() method, using the following code:

public static ITransformer BuildAndTrainModel(MLContext mlContext, IDataView trainingDataView)
{

}

Hinweis

Diese Methode löst zunächst eine Fehlermeldung aus. Dies ändert sich erst, wenn Sie in den folgenden Schritten eine Rückgabeanweisung hinzufügen.This method will give you an error until you add a return statement in the following steps.

Fügen Sie BuildAndTrainModel() folgenden Code hinzu, um die Datentransformationen zu definieren:Define the data transformations by adding the following code to BuildAndTrainModel():

IEstimator<ITransformer> estimator = mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "userIdEncoded", inputColumnName: "userId")
    .Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "movieIdEncoded", inputColumnName: "movieId"));

Da userId und movieId keine reellen Zahlen, sondern Benutzer und Filmtitel darstellen, verwenden Sie die MapValueToKey()-Methode, um jede userId und movieId in eine Feature-Spalte mit einem numerischen Schlüsseltyp (also in ein Format, das von Empfehlungsalgorithmen akzeptiert wird) zu transformieren. Anschließend fügen Sie die Werte als neue Datasetspalten ein:Since userId and movieId represent users and movie titles, not real values, you use the MapValueToKey() method to transform each userId and each movieId into a numeric key type Feature column (a format accepted by recommendation algorithms) and add them as new dataset columns:

userIduserId movieIdmovieId BezeichnungLabel userIdEncodeduserIdEncoded movieIdEncodedmovieIdEncoded
11 11 44 userKey1userKey1 movieKey1movieKey1
11 33 44 userKey1userKey1 movieKey2movieKey2
11 66 44 userKey1userKey1 movieKey3movieKey3

Fügen Sie den unten aufgeführten Code als nächste Codezeilen in BuildAndTrainModel() ein, um den Machine Learning-Algorithmus festzulegen und ihn an die Datentransformationsdefinitionen anzufügen:Choose the machine learning algorithm and append it to the data transformation definitions by adding the following as the next line of code in BuildAndTrainModel():

var options = new MatrixFactorizationTrainer.Options
{
    MatrixColumnIndexColumnName = "userIdEncoded",
    MatrixRowIndexColumnName = "movieIdEncoded", 
    LabelColumnName = "Label",
    NumberOfIterations = 20,
    ApproximationRank = 100
};

var trainerEstimator = estimator.Append(mlContext.Recommendation().Trainers.MatrixFactorization(options));

Als Trainingsalgorithmus für Empfehlungen wird der MatrixFactorizationTrainer verwendet.The MatrixFactorizationTrainer is your recommendation training algorithm. Die Matrixfaktorisierung wird häufig für Empfehlungen eingesetzt, wenn Daten dazu vorliegen, wie Benutzer Produkte in der Vergangenheit bewertet haben. Dies trifft auf die Datasets dieses Tutorials zu.Matrix Factorization is a common approach to recommendation when you have data on how users have rated products in the past, which is the case for the datasets in this tutorial. Falls andere Daten verfügbar sind, können noch mehr Empfehlungsalgorithmen eingesetzt werden. Weitere Informationen dazu finden Sie im Abschnitt Weitere Empfehlungsalgorithmen weiter unten.There are other recommendation algorithms for when you have different data available (see the Other recommendation algorithms section below to learn more).

In diesem Tutorial verwendet der Matrix Factorization-Algorithmus kollaborative Filter. Dabei wird Folgendes angenommen: Wenn Benutzer 1 zu einem bestimmten Thema die gleiche Meinung wie Benutzer 2 hat, vertritt Benutzer 1 zu einem anderen Thema mit höherer Wahrscheinlichkeit die gleiche Meinung wie Benutzer 2.In this case, the Matrix Factorization algorithm uses a method called "collaborative filtering", which assumes that if User 1 has the same opinion as User 2 on a certain issue, then User 1 is more likely to feel the same way as User 2 about a different issue.

Wenn beispielsweise Benutzer 1 und Benutzer 2 Filme ähnlich bewerten, gefällt Benutzer 2 mit höherer Wahrscheinlichkeit ein Film, den Benutzer 1 angesehen und hoch bewertet hat:For instance, if User 1 and User 2 rate movies similarly, then User 2 is more likely to enjoy a movie that User 1 has watched and rated highly:

Incredibles 2 (2018) The Avengers (2012) Guardians of the Galaxy (2014)
Benutzer 1User 1 Hat den Film gesehen und ihn gemochtWatched and liked movie Hat den Film gesehen und ihn gemochtWatched and liked movie Hat den Film gesehen und ihn gemochtWatched and liked movie
Benutzer 2User 2 Hat den Film gesehen und ihn gemochtWatched and liked movie Hat den Film gesehen und ihn gemochtWatched and liked movie Hat den Film nicht gesehen; Film wird empfohlenHas not watched -- RECOMMEND movie

Der Matrix Factorization-Trainer kann durch mehrere Optionen angepasst werden. Weitere Informationen zu diesen finden Sie im Abschnitt Hyperparameter für Algorithmen weiter unten.The Matrix Factorization trainer has several Options, which you can read more about in the Algorithm hyperparameters section below.

Fügen Sie den unten aufgeführten Code als nächste Codezeilen in die BuildAndTrainModel()-Methode ein, um das Modell an die Train-Daten anzupassen und das trainierte Modell zurückzugeben:Fit the model to the Train data and return the trained model by adding the following as the next line of code in the BuildAndTrainModel() method:

Console.WriteLine("=============== Training the model ===============");
ITransformer model = trainerEstimator.Fit(trainingDataView);

return model;

Die Fit()-Methode trainiert das Modell mit dem bereitgestellten Trainingsdataset.The Fit() method trains your model with the provided training dataset. Sie führt die Estimator-Definitionen aus, indem sie die Daten transformiert und das Training durchführt. Anschließend gibt sie das trainierte Modell als Transformer zurück.Technically, it executes the Estimator definitions by transforming the data and applying the training, and it returns back the trained model, which is a Transformer.

Fügen Sie den unten aufgeführten Code als nächste Codezeile in der Methode Main() hinzu, um die BuildAndTrainModel()-Methode aufzurufen und das trainierte Modell zurückzugeben:Add the following as the next line of code in the Main() method to call your BuildAndTrainModel() method and return the trained model:

ITransformer model = BuildAndTrainModel(mlContext, trainingDataView);

Auswerten des ModellsEvaluate your model

Nachdem Sie Ihr Modell trainiert haben, werten Sie mit den Testdaten die Modellleistung aus.Once you have trained your model, use your test data to evaluate how your model is performing.

Erstellen Sie die EvaluateModel()-Methode mit dem folgenden Code direkt nach der BuildAndTrainModel()-Methode:Create the EvaluateModel() method, just after the BuildAndTrainModel() method, using the following code:

public static void EvaluateModel(MLContext mlContext, IDataView testDataView, ITransformer model)
{

}

Fügen Sie EvaluateModel() den folgenden Code hinzu, um die Test-Daten zu transformieren:Transform the Test data by adding the following code to EvaluateModel():

Console.WriteLine("=============== Evaluating the model ===============");
var prediction = model.Transform(testDataView);

Die Transform()-Methode trifft Vorhersagen für mehrere bereitgestellte Eingabezeilen eines Testdatasets.The Transform() method makes predictions for multiple provided input rows of a test dataset.

Fügen Sie den unten aufgeführten Code als nächste Codezeile in die EvaluateModel()-Methode ein, um das Modell auszuwerten:Evaluate the model by adding the following as the next line of code in the EvaluateModel() method:

var metrics = mlContext.Regression.Evaluate(prediction, labelColumnName: "Label", scoreColumnName: "Score");

Nach der Vorhersagekonfiguration wertet die Evaluate()-Methode das Modell aus. Dabei werden die Vorhersagewerte mit den tatsächlichen Labels im Testdataset verglichen und die Leistungsmetriken für das Modell zurückgegeben.Once you have the prediction set, the Evaluate() method assesses the model, which compares the predicted values with the actual Labels in the test dataset and returns metrics on how the model is performing.

Fügen Sie den unten aufgeführten Code als nächste Codezeilen in die EvaluateModel()-Methode ein, um die Auswertungsmetriken auf der Konsole auszugeben:Print your evaluation metrics to the console by adding the following as the next line of code in the EvaluateModel() method:

Console.WriteLine("Root Mean Squared Error : " + metrics.RootMeanSquaredError.ToString());
Console.WriteLine("RSquared: " + metrics.RSquared.ToString());

Fügen Sie den unten aufgeführten Code als nächste Codezeile in die Main()-Methode ein, um die EvaluateModel()-Methode aufzurufen:Add the following as the next line of code in the Main() method to call your EvaluateModel() method:

EvaluateModel(mlContext, testDataView, model);

Bis hierhin sollte die Ausgabe in etwa wie folgt aussehen:The output so far should look similar to the following text:

=============== Training the model ===============
iter      tr_rmse          obj
   0       1.5403   3.1262e+05
   1       0.9221   1.6030e+05
   2       0.8687   1.5046e+05
   3       0.8416   1.4584e+05
   4       0.8142   1.4209e+05
   5       0.7849   1.3907e+05
   6       0.7544   1.3594e+05
   7       0.7266   1.3361e+05
   8       0.6987   1.3110e+05
   9       0.6751   1.2948e+05
  10       0.6530   1.2766e+05
  11       0.6350   1.2644e+05
  12       0.6197   1.2541e+05
  13       0.6067   1.2470e+05
  14       0.5953   1.2382e+05
  15       0.5871   1.2342e+05
  16       0.5781   1.2279e+05
  17       0.5713   1.2240e+05
  18       0.5660   1.2230e+05
  19       0.5592   1.2179e+05
=============== Evaluating the model ===============
Rms: 0.994051469730769
RSquared: 0.412556298844873

Diese Ausgabe enthält 20 Iterationen.In this output, there are 20 iterations. Bei jeder Iteration verringert sich der Fehlermesswert und nähert sich immer mehr 0 an.In each iteration, the measure of error decreases and converges closer and closer to 0.

Die Wurzel der mittleren Fehlerquadratsumme (root of mean squared error; auch als RMS oder RMSE bezeichnet) wird verwendet, um die Unterschiede zwischen den vom Modell vorhergesagten Werten und den Beobachtungswerten des Testdatasets zu messen.The root of mean squared error (RMS or RMSE) is used to measure the differences between the model predicted values and the test dataset observed values. Es handelt sich dabei um die Quadratwurzel der durchschnittlichen Fehlerquadrate.Technically it's the square root of the average of the squares of the errors. Je niedriger sie ausfällt, desto besser ist das Modell.The lower it is, the better the model is.

R Squared gibt an, wie gut Daten zu einem Modell passen.R Squared indicates how well data fits a model. Die Werte liegen zwischen 0 und 1.Ranges from 0 to 1. Der Wert 0 bedeutet, dass die Daten zufällig sind oder nicht an das Modell angepasst werden können.A value of 0 means that the data is random or otherwise can't be fit to the model. Ein Wert von 1 bedeutet, dass das Modell exakt mit den Daten übereinstimmt.A value of 1 means that the model exactly matches the data. Der Wert von R Squared sollte möglichst nahe bei 1 liegen.You want your R Squared score to be as close to 1 as possible.

Erfolgreiche Modelle zu erstellen ist ein iterativer Prozess.Building successful models is an iterative process. Dieses Modell hat erst geringere Qualität, da das Tutorial kleine Datasets verwendet, um schnelles Modelltraining zu ermöglichen.This model has initial lower quality as the tutorial uses small datasets to provide quick model training. Wenn Sie nicht mit der Modellqualität zufrieden sind, können Sie versuchen, sie durch die Bereitstellung größerer Trainingsdatasets oder die Auswahl anderer Trainingsalgorithmen mit anderen Hyperparametern für jeden Algorithmus zu verbessern.If you aren't satisfied with the model quality, you can try to improve it by providing larger training datasets or by choosing different training algorithms with different hyper-parameters for each algorithm. Weitere Informationen finden Sie im Abschnitt Verbessern des Modells weiter unten.For more information, check out the Improve your model section below.

Verwenden Ihres ModellsUse your model

Nun können Sie mit dem trainierten Modell Vorhersagen für neue Daten treffen.Now you can use your trained model to make predictions on new data.

Erstellen Sie die UseModelForSinglePrediction()-Methode mit dem folgenden Code direkt nach der EvaluateModel()-Methode:Create the UseModelForSinglePrediction() method, just after the EvaluateModel() method, using the following code:

public static void UseModelForSinglePrediction(MLContext mlContext, ITransformer model)
{

}

Fügen Sie UseModelForSinglePrediction() den folgenden Code hinzu, um mit PredictionEngine die Bewertung vorherzusagen:Use the PredictionEngine to predict the rating by adding the following code to UseModelForSinglePrediction():

Console.WriteLine("=============== Making a prediction ===============");
var predictionEngine = mlContext.Model.CreatePredictionEngine<MovieRating, MovieRatingPrediction>(model);

Die PredictionEngine ist eine Hilfs-API, mit der Sie eine Vorhersage für eine einzelne Instanz der Daten treffen können.The PredictionEngine is a convenience API, which allows you to perform a prediction on a single instance of data. PredictionEngine ist nicht threadsicher.PredictionEngine is not thread-safe. Die Verwendung in Singlethread-oder Prototypumgebungen ist zulässig.It's acceptable to use in single-threaded or prototype environments. Zur Verbesserung der Leistung und Threadsicherheit in Produktionsumgebungen verwenden Sie den PredictionEnginePool-Dienst, der einen ObjectPool aus PredictionEngine-Objekten für die Verwendung in Ihrer gesamten Anwendung erstellt.For improved performance and thread safety in production environments, use the PredictionEnginePool service, which creates an ObjectPool of PredictionEngine objects for use throughout your application. Informationen zur Verwendung von PredictionEnginePool in einer ASP.NET Core-Web-API finden Sie in dieser Anleitung.See this guide on how to use PredictionEnginePool in an ASP.NET Core Web API.

Hinweis

Die PredictionEnginePool-Diensterweiterung ist derzeit als Vorschauversion verfügbar.PredictionEnginePool service extension is currently in preview.

Fügen Sie den unten aufgeführten Code als nächste Codezeilen in die UseModelForSinglePrediction()-Methode ein, um eine Instanz von MovieRating mit dem Namen testInput zu erstellen und diese der PredictionEngine-Klasse zu übergeben:Create an instance of MovieRating called testInput and pass it to the Prediction Engine by adding the following as the next lines of code in the UseModelForSinglePrediction() method:

var testInput = new MovieRating { userId = 6, movieId = 10 };

var movieRatingPrediction = predictionEngine.Predict(testInput);

Die Predict()-Funktion trifft eine Vorhersage für eine einzelne Datenspalte.The Predict() function makes a prediction on a single column of data.

Anschließend können Sie mit dem Score (der vorhergesagten Bewertung) bestimmen, ob der Film mit der movieId 10 Benutzer 6 empfohlen werden soll.You can then use the Score, or the predicted rating, to determine whether you want to recommend the movie with movieId 10 to user 6. Je höher der Score, desto höher ist die Wahrscheinlichkeit, dass einem Benutzer ein bestimmter Film gefällt.The higher the Score, the higher the likelihood of a user liking a particular movie. In diesem Tutorial wird festgelegt, dass Filme mit einer höheren Bewertung als 3,5 empfohlen werden.In this case, let’s say that you recommend movies with a predicted rating of > 3.5.

Fügen Sie den unten aufgeführten Code als nächste Codezeilen in die UseModelForSinglePrediction()-Methode ein, um die Ergebnisse auszugeben:To print the results, add the following as the next lines of code in the UseModelForSinglePrediction() method:

if (Math.Round(movieRatingPrediction.Score, 1) > 3.5)
{
    Console.WriteLine("Movie " + testInput.movieId + " is recommended for user " + testInput.userId);
}
else
{
    Console.WriteLine("Movie " + testInput.movieId + " is not recommended for user " + testInput.userId);
}

Fügen Sie den unten aufgeführten Code als nächste Codezeile in die Main()-Methode ein, um die UseModelForSinglePrediction()-Methode aufzurufen:Add the following as the next line of code in the Main() method to call your UseModelForSinglePrediction() method:

UseModelForSinglePrediction(mlContext, model);

Die Ausgabe dieser Methode sollte in etwa wie folgt aussehen:The output of this method should look similar to the following text:

=============== Making a prediction ===============
Movie 10 is recommended for user 6

Speichern des ModellsSave your model

Sie müssen das Modell zuerst speichern, um damit Vorhersagen in Endbenutzeranwendungen treffen zu können.To use your model to make predictions in end-user applications, you must first save the model.

Erstellen Sie die SaveModel()-Methode mit dem folgenden Code direkt nach der UseModelForSinglePrediction()-Methode:Create the SaveModel() method, just after the UseModelForSinglePrediction() method, using the following code:

public static void SaveModel(MLContext mlContext, DataViewSchema trainingDataViewSchema, ITransformer model)
{

}

Fügen Sie der SaveModel()-Methode folgenden Code hinzu, um das trainierte Modell zu speichern:Save your trained model by adding the following code in the SaveModel() method:

var modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "MovieRecommenderModel.zip");

Console.WriteLine("=============== Saving the model to a file ===============");
mlContext.Model.Save(model, trainingDataViewSchema, modelPath);

Diese Methode speichert das trainierte Modell in einer ZIP-Datei (im Ordner „Data“), die anschließend in anderen .NET-Anwendungen für Vorhersagen verwendet werden kann.This method saves your trained model to a .zip file (in the "Data" folder), which can then be used in other .NET applications to make predictions.

Fügen Sie den unten aufgeführten Code als nächste Codezeile in die Main()-Methode ein, um die SaveModel()-Methode aufzurufen:Add the following as the next line of code in the Main() method to call your SaveModel() method:

SaveModel(mlContext, trainingDataView.Schema, model);

Verwenden des gespeicherten ModellsUse your saved model

Nachdem Sie Ihr trainiertes Modell gespeichert haben, können Sie das Modell in verschiedenen Umgebungen nutzen.Once you have saved your trained model, you can consume the model in different environments. Weitere Informationen zum Nutzbarmachen eines trainierten Machine Learning-Modells in Apps finden Sie unter Speichern und Laden trainierter Modelle.See Save and load trained models to learn how to operationalize a trained machine learning model in apps.

ErgebnisseResults

Nachdem Sie die obigen Schritte durchgeführt haben, können Sie nun die Konsolen-App ausführen (STRG+F5).After following the steps above, run your console app (Ctrl + F5). Die Ergebnisse der obigen Vorhersage sollten in etwa wie folgt aussehen.Your results from the single prediction above should be similar to the following. Möglicherweise werden Warnungen oder Verarbeitungsnachrichten angezeigt. Diese wurden jedoch aus Gründen der Übersichtlichkeit aus den folgenden Ergebnissen entfernt.You may see warnings or processing messages, but these messages have been removed from the following results for clarity.

=============== Training the model ===============
iter      tr_rmse          obj
   0       1.5382   3.1213e+05
   1       0.9223   1.6051e+05
   2       0.8691   1.5050e+05
   3       0.8413   1.4576e+05
   4       0.8145   1.4208e+05
   5       0.7848   1.3895e+05
   6       0.7552   1.3613e+05
   7       0.7259   1.3357e+05
   8       0.6987   1.3121e+05
   9       0.6747   1.2949e+05
  10       0.6533   1.2766e+05
  11       0.6353   1.2636e+05
  12       0.6209   1.2561e+05
  13       0.6072   1.2462e+05
  14       0.5965   1.2394e+05
  15       0.5868   1.2352e+05
  16       0.5782   1.2279e+05
  17       0.5713   1.2227e+05
  18       0.5637   1.2190e+05
  19       0.5604   1.2178e+05
=============== Evaluating the model ===============
Rms: 0.977175077487166
RSquared: 0.43233349213192
=============== Making a prediction ===============
Movie 10 is recommended for user 6
=============== Saving the model to a file ===============

Herzlichen Glückwunsch!Congratulations! Sie haben ein Machine Learning-Modell zur Empfehlung von Filmen erstellt.You've now successfully built a machine learning model for recommending movies. Sie finden den Quellcode für dieses Tutorial im Repository dotnet/samples.You can find the source code for this tutorial at the dotnet/samples repository.

Verbessern des ModellsImprove your model

Es gibt mehrere Möglichkeiten, die Leistung des Modells zu verbessern, um so genauere Vorhersagen treffen zu können.There are several ways that you can improve the performance of your model so that you can get more accurate predictions.

DatenData

Wenn Sie mehr Trainingsdaten mit ausreichend Beispielen für jeden Benutzer und für jede movieId hinzufügen, kann die Qualität des Empfehlungsmodells gesteigert werden.Adding more training data that has enough samples for each user and movie id can help improve the quality of the recommendation model.

Die Kreuzvalidierung ist eine Methode zur Auswertung von Modellen, bei der nicht –wie in diesem Tutorial – Testdaten aus dem Dataset extrahiert, sondern stattdessen nach dem Zufallsprinzip Daten in Teilmengen aufgeteilt werden. Anschließend werden einige Gruppen als Trainingsdaten und einige als Testdaten verwendet.Cross validation is a technique for evaluating models that randomly splits up data into subsets (instead of extracting out test data from the dataset like you did in this tutorial) and takes some of the groups as train data and some of the groups as test data. Diese Methode führt im Vergleich zur Aufteilung von Daten in Trainings- und Testdatasets zu einer höheren Modellqualität.This method outperforms making a train-test split in terms of model quality.

FeaturesFeatures

In diesem Tutorial verwenden Sie nur die drei Features (user id, movie id und rating), die vom Dataset bereitgestellt werden.In this tutorial, you only use the three Features (user id, movie id, and rating) that are provided by the dataset.

Dies ist für den Anfang ausreichend. In einem echten Szenario sollten Sie jedoch weitere Attribute oder Features (beispielsweise Alter, Geschlecht, Standort usw.) hinzufügen, falls diese im Dataset enthalten sind.While this is a good start, in reality you might want to add other attributes or Features (for example, age, gender, geo-location, etc.) if they are included in the dataset. Durch das Hinzufügen relevanter Features können Sie die Leistung des Empfehlungsmodells verbessern.Adding more relevant Features can help improve the performance of your recommendation model.

Wenn Sie nicht genau wissen, welche Features für Ihre Machine Learning-Aufgabe am relevantesten sind, können Sie auch die Methoden Feature Contribution Calculation (FCC) und Permutation Feature Importance verwenden, die ML.NET zur Ermittlung der wichtigsten Features bereitstellt.If you are unsure about which Features might be the most relevant for your machine learning task, you can also make use of Feature Contribution Calculation (FCC) and permutation feature importance, which ML.NET provides to discover the most influential Features.

Hyperparameter für AlgorithmenAlgorithm hyperparameters

ML.NET stellt viele effiziente Trainingsalgorithmen bereit. Sie können die Leistung allerdings noch weiter optimieren, indem Sie die Hyperparameter des Algorithmus anpassen.While ML.NET provides good default training algorithms, you can further fine-tune performance by changing the algorithm's hyperparameters.

Bei Matrix Factorization können Sie mit Hyperparametern wie NumberOfIterations und ApproximationRank experimentieren, um möglicherweise bessere Ergebnisse zu erzielen.For Matrix Factorization, you can experiment with hyperparameters such as NumberOfIterations and ApproximationRank to see if that gives you better results.

In diesem Tutorial werden beispielsweise folgende Algorithmusoptionen verwendet:For instance, in this tutorial the algorithm options are:

var options = new MatrixFactorizationTrainer.Options
{
    MatrixColumnIndexColumnName = "userIdEncoded",
    MatrixRowIndexColumnName = "movieIdEncoded",
    LabelColumnName = "Label",
    NumberOfIterations = 20,
    ApproximationRank = 100
};

Weitere EmpfehlungsalgorithmenOther Recommendation Algorithms

Der Algorithmus zur Matrixfaktorisierung mit kollaborativen Filtern ist nur eine Möglichkeit für Filmempfehlungen.The matrix factorization algorithm with collaborative filtering is only one approach for performing movie recommendations. In vielen Fällen verfügen Sie möglicherweise nicht über die Bewertungsdaten, sondern nur über den Filmverlauf der Benutzer.In many cases, you may not have the ratings data available and only have movie history available from users. In anderen Fällen sind eventuell zusätzlich zu den Bewertungsdaten der Benutzer noch weitere Daten verfügbar.In other cases, you may have more than just the user’s rating data.

AlgorithmusAlgorithm SzenarioScenario BeispielSample
One Class Matrix Factorization (Matrixfaktorisierung mit einer Klasse)One Class Matrix Factorization Verwenden Sie diesen Algorithmus, wenn nur userId und movieId zur Verfügung stehen.Use this when you only have userId and movieId. Diese Empfehlungsstrategie wird für Szenarios eingesetzt, in denen Produkte oft zusammen gekauft werden. Kunden werden auf diese Weise empfohlene Produkte auf Grundlage des eigenen Bestellverlaufs angezeigt.This style of recommendation is based upon the co-purchase scenario, or products frequently bought together, which means it will recommend to customers a set of products based upon their own purchase order history. > Ausprobieren>Try it out
Field Aware Factorization Machines (Faktorisierungsverfahren mit Berücksichtigung von Feldern)Field Aware Factorization Machines Verwenden Sie diesen Algorithmus für Empfehlungen, wenn zusätzlich zur userId, productId und Bewertung noch weitere Features wie eine Produktbeschreibung oder ein Produktpreis vorhanden sind.Use this to make recommendations when you have more Features beyond userId, productId, and rating (such as product description or product price). Auch bei dieser Methode kommen kollaborative Filter zum Einsatz.This method also uses a collaborative filtering approach. > Ausprobieren>Try it out

Szenario mit neuen BenutzernNew user scenario

Bei kollaborativen Filtern tritt häufig das sogenannte Kaltstartproblem auf. Hierbei müssen für neue Benutzer Rückschlüsse gezogen werden, obwohl noch keine Datengrundlage vorhanden ist.One common problem in collaborative filtering is the cold start problem, which is when you have a new user with no previous data to draw inferences from. Das Problem wird oft dadurch gelöst, dass neue Benutzer aufgefordert werden, ein Profil zu erstellen und z. B. bereits gesehene Filme zu bewerten.This problem is often solved by asking new users to create a profile and, for instance, rate movies they have seen in the past. Diese Methode stellt zwar für Benutzer einen gewissen Aufwand dar, liefert jedoch zumindest einige Startdaten für neue Benutzer ohne Bewertungsverlauf.While this method puts some burden on the user, it provides some starting data for new users with no rating history.

RessourcenResources

Die Daten aus diesem Tutorial stammen aus dem MovieLens-Dataset.The data used in this tutorial is derived from MovieLens Dataset.

Nächste SchritteNext steps

In diesem Tutorial haben Sie gelernt, wie die folgenden Aufgaben ausgeführt werden:In this tutorial, you learned how to:

  • Auswählen eines Machine Learning-AlgorithmusSelect a machine learning algorithm
  • Vorbereiten und Laden von DatenPrepare and load your data
  • Erstellen und Trainieren eines ModellsBuild and train a model
  • Auswerten eines ModellsEvaluate a model
  • Bereitstellen und Nutzen eines ModellsDeploy and consume a model

Wechseln Sie zum nächsten Tutorial, um mehr zu erfahren.Advance to the next tutorial to learn more