Tutorial: Erkennen von Anomalien in Produktverkäufen mit ML.NETTutorial: Detect anomalies in product sales with ML.NET

Erfahren Sie, wie Sie eine Anwendung zur Anomalieerkennung bei Produktvertriebsdaten erstellen.Learn how to build an anomaly detection application for product sales data. Dieses Tutorial erstellt mithilfe von C# in Visual Studio eine .NET Core-Konsolenanwendung.This tutorial creates a .NET Core console application using C# in Visual Studio.

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

  • Laden der DatenLoad the data
  • Erstellen einer Transformation zur Erkennung von AnomaliespitzenCreate a transform for spike anomaly detection
  • Erkennen von Anomaliespitzen mit der TransformationDetect spike anomalies with the transform
  • Erstellen einer Transformation für die Anomalieerkennung bei ÄnderungspunktenCreate a transform for change point anomaly detection
  • Erkennen von Änderungspunktanomalien mit der TransformationDetect change point anomalies with the transform

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.

Erforderliche KomponentenPrerequisites

Hinweis

Das Datenformat in product-sales.csv basiert auf dem Dataset „Shampoo Sales Over a Three Year Period“ von Rob Hyndman, ursprünglich aus dem DataMarket und von der Time Series Data Library (TSDL) bereitgestellt.The data format in product-sales.csv is based on the dataset “Shampoo Sales Over a Three Year Period” originally sourced from DataMarket and provided by Time Series Data Library (TSDL), created by Rob Hyndman. Das Dataset „Shampoo Sales Over a Three Year Period“ ist im Rahmen der DataMarket Default Open License lizenziert.“Shampoo Sales Over a Three Year Period” Dataset Licensed Under the DataMarket Default Open License.

Erstellen einer KonsolenanwendungCreate a console application

  1. Erstellen Sie eine .NET Core-Konsolenanwendung mit dem Namen „ProductSalesAnomalyDetection“.Create a .NET Core Console Application called "ProductSalesAnomalyDetection".

  2. Erstellen Sie ein Verzeichnis mit dem Namen Data in Ihrem Projekt, um die Datasetdateien zu speichern.Create a directory named Data in your project to save your data set files.

  3. Installieren des Microsoft.ML NuGet-Pakets:Install the Microsoft.ML NuGet Package:

    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 on your project and select Manage NuGet Packages. Wählen Sie als Paketquelle „nuget.org“ aus. Klicken Sie dann auf die Registerkarte „Durchsuchen“ aus, suchen Sie nach Microsoft.ML, und klicken Sie anschließend auf Installieren.Choose "nuget.org" as the Package source, select the Browse tab, search for Microsoft.ML 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.TimeSeries.Repeat these steps for Microsoft.ML.TimeSeries.

  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 System.Collections.Generic;
    

Herunterladen der DatenDownload your data

  1. Laden Sie die das Dataset herunter, und speichern Sie es im Ordner Data, den Sie vorher erstellt haben:Download the dataset and save it to the Data folder you previously created:

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

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

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die *CSV Datei, und wählen Sie Eigenschaften aus.In Solution Explorer, right-click the *.csv file 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.

Die folgende Tabelle enthält eine Datenvorschau aus Ihrem *CSV-Datei:The following table is a data preview from your *.csv file:

MonatMonth ProductSalesProductSales
1-Jan1-Jan 271271
2-Jan2-Jan 150,9150.9
.......... ..........
1-Feb1-Feb 199,3199.3
.......... ..........

Erstellen von Klassen und Definieren von PfadenCreate classes and define paths

Als Nächstes definieren Sie Ihre Datenstruktur der Eingabe- und Vorhersageklasse.Next, define your input and prediction class data structures.

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 inProductSalesData.cs.In the Add New Item dialog box, select Class and change the Name field to ProductSalesData.cs. Wählen Sie dann die Schaltfläche Hinzufügen aus.Then, select the Add button.

    Die Datei ProductSalesData.cs wird im Code-Editor geöffnet.The ProductSalesData.cs file opens in the code editor.

  3. Fügen Sie die folgende using-Anweisung am Anfang der ProductSalesData.cs-Datei hinzu:Add the following using statement to the top of ProductSalesData.cs:

    using Microsoft.ML.Data;
    
  4. Entfernen Sie die vorhandene Klassendefinition, und fügen Sie der Datei ProductSalesData.cs den folgenden Code mit den beiden Klassen ProductSalesData und ProductSalesPrediction hinzu:Remove the existing class definition and add the following code, which has two classes ProductSalesData and ProductSalesPrediction, to the ProductSalesData.cs file:

    public class ProductSalesData
    {
        [LoadColumn(0)]
        public string Month;
    
        [LoadColumn(1)]
        public float numSales;
    }
    
    public class ProductSalesPrediction
    {
        //vector to hold alert,score,p-value values
        [VectorType(3)]
        public double[] Prediction { get; set; }
    }
    

    ProductSalesData ist eine Klasse für Eingabedaten.ProductSalesData 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.

    ProductSalesPrediction gibt die Vorhersagedatenklasse an.ProductSalesPrediction specifies the prediction data class. Zur Anomalieerkennung besteht die Vorhersage aus einer Warnung, die angibt, ob eine Anomalie, eine Rohbewertung und ein Signifikanzwert (p-value; P-Wert) vorhanden sind.For anomaly detection, the prediction consists of an alert to indicate whether there is an anomaly, a raw score, and p-value. Je näher der Signifikanzwert an 0 ist, desto größer ist die Wahrscheinlichkeit einer Anomalie.The closer the p-value is to 0, the more likely an anomaly has occurred.

  5. Erstellen Sie zwei globale Felder zum Speichern des gerade heruntergeladenen Datasetdateipfads und des gespeicherten Modelldateipfads:Create two global fields to hold the recently downloaded dataset file path and the saved model file path:

    • _dataPath enthält den Pfad zu dem Dataset, das zum Trainieren des Modells verwendet wird._dataPath has the path to the dataset used to train the model.
    • _docsize enthält die Anzahl der Datensätze in der Datendatei._docsize has the number of records in dataset file. Sie verwenden _docSize zum Berechnen von pvalueHistoryLength.You'll use _docSize to calculate pvalueHistoryLength.
  6. Fügen Sie den folgenden Code der Zeile direkt über der Main-Methode hinzu, um diese Pfade anzugeben:Add the following code to the line right above the Main method to specify those paths:

    static readonly string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "product-sales.csv");
    //assign the Number of records in dataset file to constant variable
    const int _docsize = 36;
    

Initialisieren von Variablen in MainInitialize variables in Main

  1. Ersetzen Sie die Zeile Console.WriteLine("Hello World!") in der Main-Methode durch den folgenden Code, um die Variable mlContext zu deklarieren und zu initialisieren:Replace the Console.WriteLine("Hello World!") line in the Main method with the following code to declare and initialize the mlContext variable:

    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.

Laden der DatenLoad the data

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 aus anderen Ressourcen (z. B. aus einer SQL-Datenbank oder aus Protokolldateien) in ein IDataView-Objekt geladen werden.Data can be loaded from a text file or from other sources (for example, SQL database or log files) to an IDataView object.

  1. Fügen Sie der Main()-Methode folgenden Code als nächste Zeile hinzu:Add the following code as the next line of the Main() method:

    IDataView dataView = mlContext.Data.LoadFromTextFile<ProductSalesData>(path: _dataPath, hasHeader: true, separatorChar: ',');
    

    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.

Anomalieerkennung in ZeitreihenTime series anomaly detection

Die Anomalieerkennung zeigt unerwartete oder ungewöhnliche Ereignisse oder Verhaltensweisen an.Anomaly detection flags unexpected or unusual events or behaviors. Sie erhalten Hinweise darauf, wo Sie nach Problemen schauen müssen, und können die Frage beantworten, ob das Ereignis oder Verhalten ungewöhnlich ist.It gives clues where to look for problems and helps you answer the question "Is this weird?".

Beispiel der Anomalieerkennung „Ist das ungewöhnlich“

Die Anomalieerkennung ist ein Prozess, bei dem Ausreißer in Zeitreihendaten ermittelt. Damit wird auf Eingabezeitreihen hingewiesen, bei denen nicht das erwartete oder ein ungewöhnliches Verhalten aufgetreten ist.Anomaly detection is the process of detecting time-series data outliers; points on a given input time-series where the behavior isn't what was expected, or "weird".

Die Anomalieerkennung kann auf viele Weisen nützlich sein.Anomaly detection can be useful in lots of ways. Zum Beispiel:For instance:

Wenn Sie ein Auto besitzen, möchten Sie vielleicht wissen: Ist diese Ölstandsanzeige normal oder habe ich ein Leck?If you have a car, you might want to know: Is this oil gauge reading normal, or do I have a leak? Wenn Sie den Energieverbrauch überwachen, möchten Sie vielleicht wissen: Gibt es einen Stromausfall?If you're monitoring power consumption, you’d want to know: Is there an outage?

Es können zwei Arten von Zeitreihenanomalien erkannt werden:There are two types of time series anomalies that can be detected:

  • Spitzen zeigen temporäre Häufungen von anomalem Verhalten im System an.Spikes indicate temporary bursts of anomalous behavior in the system.

  • Änderungspunkte zeigen den Beginn anhaltender Änderungen im Zeitverlauf im System an.Change points indicate the beginning of persistent changes over time in the system.

In ML.NET eignen sich die Algorithmen „IID Spike Detection“ oder „IID Change point Detection“ für unabhängige und identisch verteilte Datasets.In ML.NET, The IID Spike Detection or IID Change point Detection algorithms are suited for independent and identically distributed datasets.

Im Gegensatz zu den Modellen in den anderen Tutorials werden die Transformationen für die Zeitreihenanomalieerkennung direkt auf Eingabedaten angewendet.Unlike the models in the other tutorials, the time series anomaly detector transforms operate directly on input data. Die IEstimator.Fit()-Methode benötigt keine Trainingsdaten, um die Transformation zu entwickeln.The IEstimator.Fit() method does not need training data to produce the transform. Sie benötigt jedoch das Datenschema, das aus einer Datenansicht bereitgestellt wird, die aus einer leeren Liste von ProductSalesData generiert wird.It does need the data schema though, which is provided by a data view generated from an empty list of ProductSalesData.

Sie analysieren die gleichen Produktvertriebsdaten, um Spitzen und Änderungspunkte zu erkennen.You'll analyze the same product sales data to detect spikes and change points. Der Prozess zum Erstellen und Trainieren eines Modells ist für die Erkennung von Spitzen und Änderungspunkten gleich; der Hauptunterschied besteht in dem verwendeten spezifischen Erkennungsalgorithmus.The building and training model process is the same for spike detection and change point detection; the main difference is the specific detection algorithm used.

SpitzenerkennungSpike detection

Das Ziel der Spitzenerkennung ist es, plötzliche, aber temporäre Häufungen zu identifizieren, die sich signifikant von der Mehrzahl der Zeitreihen-Datenwerte unterscheiden.The goal of spike detection is to identify sudden yet temporary bursts that significantly differ from the majority of the time series data values. Es ist wichtig, diese verdächtigen seltenen Elemente, Ereignisse oder Beobachtungen rechtzeitig zu erkennen, um sie zu minimieren.It's important to detect these suspicious rare items, events, or observations in a timely manner to be minimized. Der folgende Ansatz kann zur Erkennung einer Vielzahl von Anomalien verwendet werden: z.B. Ausfälle, Cyberangriffe oder virale Webinhalte.The following approach can be used to detect a variety of anomalies such as: outages, cyber-attacks, or viral web content. Das folgende Bild zeigt ein Beispiel für Spitzen in einem Zeitreihen-Dataset:The following image is an example of spikes in a time series dataset:

Screenshot: zwei ermittelte Spitzen

Hinzufügen der CreateEmptyDataView()-MethodeAdd the CreateEmptyDataView() method

Fügen Sie Program.cs zur folgenden Methode hinzu:Add the following method to Program.cs:

static IDataView CreateEmptyDataView(MLContext mlContext) {
    // Create empty DataView. We just need the schema to call Fit() for the time series transforms
    IEnumerable<ProductSalesData> enumerableData = new List<ProductSalesData>();
    return mlContext.Data.LoadFromEnumerable(enumerableData);
}

Die Methode CreateEmptyDataView() erzeugt ein leeres Datenansichtsobjekt mit dem korrekten Schema, das für die Methode IEstimator.Fit() als Eingabe verwendet werden soll.The CreateEmptyDataView() produces an empty data view object with the correct schema to be used as input to the IEstimator.Fit() method.

Erstellen der DetectSpike()-MethodeCreate the DetectSpike() method

Die DetectSpike()-Methode:The DetectSpike() method:

  • erstellt die Transformation aus der SchätzungCreates the transform from the estimator.
  • Erkennen von Spitzen basierend auf historischen Vertriebsdaten.Detects spikes based on historical sales data.
  • Anzeigen der Ergebnisse.Displays the results.
  1. Erstellen Sie die DetectSpike()-Methode mit dem folgenden Code direkt nach der Main()-Methode:Create the DetectSpike() method, just after the Main() method, using the following code:

    static void DetectSpike(MLContext mlContext, int docSize, IDataView productSales)
    {
    
    }
    
  2. Verwenden Sie IidSpikeEstimator, um das Modell zum Erkennen von Spitzen zu trainieren.Use the IidSpikeEstimator to train the model for spike detection. Fügen Sie ihn mit dem folgenden Code zur DetectSpike()-Methode hinzu:Add it to the DetectSpike() method with the following code:

    var iidSpikeEstimator = mlContext.Transforms.DetectIidSpike(outputColumnName: nameof(ProductSalesPrediction.Prediction), inputColumnName: nameof(ProductSalesData.numSales), confidence: 95, pvalueHistoryLength: docSize / 4);
    
  3. Fügen Sie den unten aufgeführten Code als nächste Codezeile in die DetectSpike()-Methode ein, um die Spitzenerkennungstransformation zu erstellen.Create the spike detection transform by adding the following as the next line of code in the DetectSpike() method:

    ITransformer iidSpikeTransform = iidSpikeEstimator.Fit(CreateEmptyDataView(mlContext));
    
  4. Fügen Sie die folgende Codezeile hinzu, um die productSales-Daten als nächste Zeile in der DetectSpike()-Methode zu transformieren:Add the following line of code to transform the productSales data as the next line in the DetectSpike() method:

    IDataView transformedData = iidSpikeTransform.Transform(productSales);
    

    Der vorherige Code verwendet die Transform()-Methode trifft Vorhersagen für mehrere Eingabezeilen eines Datasets.The previous code uses the Transform() method to make predictions for multiple input rows of a dataset.

  5. Konvertieren Sie Ihre transformedData mit der CreateEnumerable()-Methode mit dem folgenden Code in ein stark typisiertes IEnumerable zur einfacheren Anzeige:Convert your transformedData into a strongly-typed IEnumerable for easier display using the CreateEnumerable() method with the following code:

    var predictions = mlContext.Data.CreateEnumerable<ProductSalesPrediction>(transformedData, reuseRowObject: false);
    
  6. Erstellen Sie mit dem folgenden Console.WriteLine()-Code eine Anzeige für die Kopfzeile:Create a display header line using the following Console.WriteLine() code:

    Console.WriteLine("Alert\tScore\tP-Value");
    

    In den Ergebnissen der Spitzenerkennung werden folgende Informationen angezeigt:You'll display the following information in your spike detection results:

    • Alert gibt eine Spitzenwarnung für einen bestimmten Datenpunkt an.Alert indicates a spike alert for a given data point.
    • Score ist der ProductSales-Wert für einen bestimmten Datenpunkt im Dataset.Score is the ProductSales value for a given data point in the dataset.
    • P-Value Das „P“ steht für „Probability“ (Wahrscheinlichkeit).P-Value The "P" stands for probability. Je näher der Signifikanzwert an 0 ist, desto größer ist die Wahrscheinlichkeit, dass der Datenpunkt eine Anomalie darstellt.The closer the p-value is to 0, the more likely the data point is an anomaly.
  7. Verwenden Sie den folgenden Code, um predictions IEnumerable zu durchlaufen und die Ergebnisse anzuzeigen:Use the following code to iterate through the predictions IEnumerable and display the results:

    foreach (var p in predictions)
    {
        var results = $"{p.Prediction[0]}\t{p.Prediction[1]:f2}\t{p.Prediction[2]:F2}";
    
        if (p.Prediction[0] == 1)
        {
            results += " <-- Spike detected";
        }
    
        Console.WriteLine(results);
    }
    Console.WriteLine("");
    
  8. Fügen Sie den Aufruf der DetectSpike()-Methode in der Main()-Methode hinzu:Add the call to the DetectSpike()method in the Main() method:

    DetectSpike(mlContext, _docsize, dataView);
    

Ergebnisse der SpitzenerkennungSpike detection results

Die Ergebnisse sollten den unten dargestellten ähneln.Your results should be similar to the following. Während der Verarbeitung werden Meldungen angezeigt.During processing, messages are displayed. Sie können Warnungen oder Verarbeitungsmeldungen sehen.You may see warnings, or processing messages. Einige dieser Nachrichten wurden der Übersichtlichkeit halber aus den folgenden Ergebnissen entfernt.Some of the messages have been removed from the following results for clarity.

Detect temporary changes in pattern
=============== Training the model ===============
=============== End of training process ===============
Alert   Score   P-Value
0       271.00  0.50
0       150.90  0.00
0       188.10  0.41
0       124.30  0.13
0       185.30  0.47
0       173.50  0.47
0       236.80  0.19
0       229.50  0.27
0       197.80  0.48
0       127.90  0.13
1       341.50  0.00 <-- Spike detected
0       190.90  0.48
0       199.30  0.48
0       154.50  0.24
0       215.10  0.42
0       278.30  0.19
0       196.40  0.43
0       292.00  0.17
0       231.00  0.45
0       308.60  0.18
0       294.90  0.19
1       426.60  0.00 <-- Spike detected
0       269.50  0.47
0       347.30  0.21
0       344.70  0.27
0       445.40  0.06
0       320.90  0.49
0       444.30  0.12
0       406.30  0.29
0       442.40  0.21
1       580.50  0.00 <-- Spike detected
0       412.60  0.45
1       687.00  0.01 <-- Spike detected
0       480.30  0.40
0       586.30  0.20
0       651.90  0.14

Erkennen von ÄnderungspunktenChange point detection

Change points sind anhaltende Änderungen in der Verteilung der Werte in einem Zeitreihen-Ereignisstrom, wie Niveauänderungen und Trends.Change points are persistent changes in a time series event stream distribution of values, like level changes and trends. Diese anhaltenden Änderungen dauern wesentlich länger als spikes und könnten auf katastrophale Ereignisse hinweisen.These persistent changes last much longer than spikes and could indicate catastrophic event(s). Change points sind in der Regel nicht mit bloßem Auge erkennbar, können aber mit Ansätzen wie beispielsweise der folgenden Methode in Ihren Daten festgestellt werden.Change points are not usually visible to the naked eye, but can be detected in your data using approaches such as in the following method. Das folgende Bild ist ein Beispiel für eine Änderungspunkterkennung:The following image is an example of a change point detection:

Screenshot: Änderungspunkterkennung

Erstellen der DetectChangepoint()-MethodeCreate the DetectChangepoint() method

Die DetectChangepoint()-Methode führt die folgenden Aufgaben aus:The DetectChangepoint() method executes the following tasks:

  • erstellt die Transformation aus der SchätzungCreates the transform from the estimator.
  • Erkennen von Änderungspunkten basierend auf historischen Vertriebsdaten.Detects change points based on historical sales data.
  • Anzeigen der Ergebnisse.Displays the results.
  1. Erstellen Sie die DetectChangepoint()-Methode mit dem folgenden Code direkt nach der Main()-Methode:Create the DetectChangepoint() method, just after the Main() method, using the following code:

    static void DetectChangepoint(MLContext mlContext, int docSize, IDataView productSales)
    {
    
    }
    
  2. Erstellen Sie den iidChangePointEstimator in der DetectChangepoint()-Methode mit folgendem Code:Create the iidChangePointEstimator in the DetectChangepoint() method with the following code:

    var iidChangePointEstimator = mlContext.Transforms.DetectIidChangePoint(outputColumnName: nameof(ProductSalesPrediction.Prediction), inputColumnName: nameof(ProductSalesData.numSales), confidence: 95, changeHistoryLength: docSize / 4);
    
  3. Erstellen Sie wie zuvor die Transformation aus der Schätzung, indem Sie die folgende Codezeile in der DetectChangePoint()-Methode hinzufügen.As you did previously, create the transform from the estimator by adding the following line of code in the DetectChangePoint() method:

    var iidChangePointTransform = iidChangePointEstimator.Fit(CreateEmptyDataView(mlContext));
    
  4. Verwenden Sie die Transform()-Methode, um die Daten zu transformieren, indem Sie den folgenden Code zu DetectChangePoint() hinzufügen:Use the Transform() method to transform the data by adding the following code to DetectChangePoint():

    IDataView transformedData = iidChangePointTransform.Transform(productSales);
    
  5. Konvertieren Sie wie bereits zuvor Ihre transformedData mit der CreateEnumerable()-Methode mit dem folgenden Code in ein stark typisiertes IEnumerable zur einfacheren Anzeige:As you did previously, convert your transformedData into a strongly-typed IEnumerable for easier display using the CreateEnumerable()method with the following code:

    var predictions = mlContext.Data.CreateEnumerable<ProductSalesPrediction>(transformedData, reuseRowObject: false);
    
  6. Erstellen Sie mit dem folgenden Code als nächste Zeile in der DetectChangePoint()-Methode einen Anzeigeheader:Create a display header with the following code as the next line in the DetectChangePoint() method:

    Console.WriteLine("Alert\tScore\tP-Value\tMartingale value");
    

    In den Ergebnissen der Änderungspunkterkennung werden folgende Informationen angezeigt:You'll display the following information in your change point detection results:

    • Alert gibt eine Änderungspunktwarnung für einen bestimmten Datenpunkt an.Alert indicates a change point alert for a given data point.
    • Score ist der ProductSales-Wert für einen bestimmten Datenpunkt im Dataset.Score is the ProductSales value for a given data point in the dataset.
    • P-Value Das „P“ steht für „Probability“ (Wahrscheinlichkeit).P-Value The "P" stands for probability. Je näher der Signifikanzwert an 0 ist, desto größer ist die Wahrscheinlichkeit, dass der Datenpunkt eine Anomalie darstellt.The closer the P-value is to 0, the more likely the data point is an anomaly.
    • Martingale value wird verwendet, um basierend auf der Reihenfolge der P-Werte zu bestimmen, wie „ungewöhnlich ein Datenpunkt ist.Martingale value is used to identify how "weird" a data point is, based on the sequence of P-values.
  7. Mit dem folgenden Code können Sie predictions IEnumerable durchlaufen und die Ergebnisse anzeigen:Iterate through the predictions IEnumerable and display the results with the following code:

    foreach (var p in predictions)
    {
        var results = $"{p.Prediction[0]}\t{p.Prediction[1]:f2}\t{p.Prediction[2]:F2}\t{p.Prediction[3]:F2}";
    
        if (p.Prediction[0] == 1)
        {
            results += " <-- alert is on, predicted changepoint";
        }
        Console.WriteLine(results);
    }
    Console.WriteLine("");
    
  8. Fügen Sie den folgenden Aufruf der DetectChangepoint()-Methode in der Main()-Methode hinzu:Add the following call to the DetectChangepoint()method in the Main() method:

    DetectChangepoint(mlContext, _docsize, dataView);
    

Ergebnisse der ÄnderungspunkterkennungChange point detection results

Die Ergebnisse sollten den unten dargestellten ähneln.Your results should be similar to the following. Während der Verarbeitung werden Meldungen angezeigt.During processing, messages are displayed. Sie können Warnungen oder Verarbeitungsmeldungen sehen.You may see warnings, or processing messages. Einige der Nachrichten wurden der Übersichtlichkeit halber aus den folgenden Ergebnissen entfernt.Some messages have been removed from the following results for clarity.

Detect Persistent changes in pattern
=============== Training the model Using Change Point Detection Algorithm===============
=============== End of training process ===============
Alert   Score   P-Value Martingale value
0       271.00  0.50    0.00
0       150.90  0.00    2.33
0       188.10  0.41    2.80
0       124.30  0.13    9.16
0       185.30  0.47    9.77
0       173.50  0.47    10.41
0       236.80  0.19    24.46
0       229.50  0.27    42.38
1       197.80  0.48    44.23 <-- alert is on, predicted changepoint
0       127.90  0.13    145.25
0       341.50  0.00    0.01
0       190.90  0.48    0.01
0       199.30  0.48    0.00
0       154.50  0.24    0.00
0       215.10  0.42    0.00
0       278.30  0.19    0.00
0       196.40  0.43    0.00
0       292.00  0.17    0.01
0       231.00  0.45    0.00
0       308.60  0.18    0.00
0       294.90  0.19    0.00
0       426.60  0.00    0.00
0       269.50  0.47    0.00
0       347.30  0.21    0.00
0       344.70  0.27    0.00
0       445.40  0.06    0.02
0       320.90  0.49    0.01
0       444.30  0.12    0.02
0       406.30  0.29    0.01
0       442.40  0.21    0.01
0       580.50  0.00    0.01
0       412.60  0.45    0.01
0       687.00  0.01    0.12
0       480.30  0.40    0.08
0       586.30  0.20    0.03
0       651.90  0.14    0.09

Herzlichen Glückwunsch!Congratulations! Sie haben jetzt erfolgreich Machine Learning-Modelle zur Erkennung von Spitzen und Änderungspunktanomalien in Vertriebsdaten erstellt.You've now successfully built machine learning models for detecting spikes and change point anomalies in sales data.

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.

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

  • Laden der DatenLoad the data
  • Trainieren des Modells zur Erkennung von AnomaliespitzenTrain the model for spike anomaly detection
  • Erkennen von Anomaliespitzen mit dem trainierten ModellDetect spike anomalies with the trained model
  • Trainieren des Modells zur Erkennung einer ÄnderungspunktanomalieTrain the model for change point anomaly detection
  • Erkennen von Änderungspunktanomalien mit dem trainierten ModellDetect change point anomalies with the trained mode

Nächste SchritteNext steps

Durchsuchen Sie das GitHub-Repository für Machine Learning-Beispiele nach einem Beispiel für die Erkennung von Stromverbrauchsanomalien, damit Sie es untersuchen können.Check out the Machine Learning samples GitHub repository to explore a Power Consumption Anomaly Detection sample.