Tutorial: Prognose des Bedarfs eines Fahrradverleihs mit Zeitreihenanalyse und ML.NETTutorial: Forecast bike rental service demand with time series analysis and ML.NET

Erfahren Sie, wie Sie den Bedarf für einen Fahrradverleih mithilfe einer univariaten Zeitreihenanalyse für in einer SQL Server-Datenbank gespeicherte Daten mit ML.NET prognostizieren können.Learn how to forecast demand for a bike rental service using univariate time series analysis on data stored in a SQL Server database with ML.NET.

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

  • Das Problem verstehenUnderstand the problem
  • Laden von Daten aus einer DatenbankLoad data from a database
  • Erstellen eines VorhersagemodellsCreate a forecasting model
  • Auswerten eines VorhersagemodellsEvaluate forecasting model
  • Speichern eines VorhersagemodellsSave a forecasting model
  • Verwenden eines VorhersagemodellsUse a forecasting model

Erforderliche KomponentenPrerequisites

Übersicht über das Beispiel zur ZeitreihenvorhersageTime series forecasting sample overview

Bei diesem Beispiel handelt es sich um eine C#.NET Core-Konsolenanwendung, die den Bedarf für einen Fahrradverleih mithilfe eines univariaten Zeitreihenanalyse-Algorithmus prognostiziert, der unter dem Namen „singuläre Spektralanalyse“ bekannt ist.This sample is a C# .NET Core console application that forecasts demand for bike rentals using a univariate time series analysis algorithm known as Single Spectrum Analysis. Den Code für dieses Beispiel finden Sie im Repository dotnet/machinelearning-samples auf GitHub.The code for this sample can be found on the dotnet/machinelearning-samples repository on GitHub.

Das Problem verstehenUnderstand the problem

Um einen effizienten Betrieb zu gewährleisten, spielt die Inventarverwaltung eine wichtige Rolle.In order to run an efficient operation, inventory management plays a key role. Zu viel von einem Produkt auf Lager zu haben, bedeutet, dass unverkaufte Produkte in den Regalen stehen und keine Umsätze generieren.Having too much of a product in stock means unsold products sitting on the shelves not generating any revenue. Zu wenig Produktvorrat führt zu Umsatzeinbußen und Kunden, die von Wettbewerbern kaufen.Having too little product leads to lost sales and customers purchasing from competitors. Daher stellt sich immer wieder die folgende Frage: Wie hoch ist die optimale Menge an Lagerbestand, die vorgehalten werden sollte?Therefore, the constant question is, what is the optimal amount of inventory to keep on hand? Die Zeitreihenanalyse hilft, eine Antwort auf diese Fragen zu geben, indem sie historische Daten untersucht, Muster identifiziert und diese Informationen verwendet, um Werte irgendwann in der Zukunft vorherzusagen.Time-series analysis helps provide an answer to these questions by looking at historical data, identifying patterns, and using this information to forecast values some time in the future.

Das Verfahren zum Analysieren von Daten, das in diesem Tutorial verwendet wird, ist die univariate Zeitreihenanalyse.The technique for analyzing data used in this tutorial is univariate time-series analysis. Die univariate Zeitreihenanalyse untersucht eine einzelne numerische Beobachtung über einen bestimmten Zeitraum in bestimmten Intervallen, z.B. die monatlichen Umsätze.Univariate time-series analysis takes a look at a single numerical observation over a period of time at specific intervals such as monthly sales.

Der in diesem Tutorial verwendete Algorithmus ist singuläre Spektralanalyse (Singular Spectrum Analysis, SSA).The algorithm used in this tutorial is Single Spectrum Analysis(SSA). SSA zerlegt eine Zeitreihe in ihre Hauptkomponenten.SSA works by decomposing a time-series into a set of principal components. Diese Komponenten können als Teile eines Signals interpretiert werden, das Trends, Rauschen, Saisonalität und vielen anderen Faktoren entspricht.These components can be interpreted as the parts of a signal that correspond to trends, noise, seasonality, and many other factors. Anschließend werden diese Komponenten rekonstruiert und verwendet, um Werte in der Zukunft vorherzusagen.Then, these components are reconstructed and used to forecast values some time in the future.

Erstellen einer KonsolenanwendungCreate console application

  1. Erstellen Sie eine neue C# .NET Core-Konsolenanwendung mit dem Namen „BikeDemandForecasting“.Create a new C# .NET Core console application called "BikeDemandForecasting".
  2. Installieren des NuGet-Pakets Microsoft.ML Version 1.4.0Install Microsoft.ML version 1.4.0 NuGet package
    1. 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.
    2. Wählen Sie „nuget.org“ als Paketquelle aus, wählen Sie die Registerkarte Durchsuchen aus, und suchen Sie nach Microsoft.ML.Choose "nuget.org" as the Package source, select the Browse tab, search for Microsoft.ML.
    3. Aktivieren Sie das Kontrollkästchen Vorabversion einbeziehen.Check the Include prerelease checkbox.
    4. Wählen Sie die Schaltfläche Installieren aus.Select the Install button.
    5. 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.
    6. Wiederholen Sie diese Schritte für System.Data.SqlClient Version 4.7.0 und Microsoft.ML.TimeSeries Version 1.4.0.Repeat these steps for System.Data.SqlClient version 4.7.0 and Microsoft.ML.TimeSeries version 1.4.0.

Vorbereiten und Verstehen der DatenPrepare and understand the data

  1. Erstellen Sie ein Verzeichnis namens Data.Create a directory called Data.
  2. Laden Sie die Datenbankdatei DailyDemand.mdf herunter, und speichern Sie sie im Verzeichnis Data.Download the DailyDemand.mdf database file and save it to the Data directory.

Hinweis

Die in diesem Tutorial verwendeten Daten stammen aus dem UCI Bike Sharing-Dataset.The data used in this tutorial comes from the UCI Bike Sharing Dataset. Fanaee-T, Hadi und Gama, Joao, „Event labeling combining ensemble detectors and background knowledge“, Progress in Artificial Intelligence (2013): S. 1-15, Springer Berlin Heidelberg, Weblink.Fanaee-T, Hadi, and Gama, Joao, 'Event labeling combining ensemble detectors and background knowledge', Progress in Artificial Intelligence (2013): pp. 1-15, Springer Berlin Heidelberg, Web Link.

Das ursprüngliche Dataset enthält mehrere Spalten, die der Saisonalität und dem Wetter entsprechen.The original dataset contains several columns corresponding to seasonality and weather. Aus Gründen der Kürze und weil der in diesem Tutorial verwendete Algorithmus nur die Werte einer einzigen numerischen Spalte benötigt, wurde das ursprüngliche Dataset so zusammengefasst, dass es nur die folgenden Spalten enthält:For brevity and because the algorithm used in this tutorial only requires the values from a single numerical column, the original dataset has been condensed to include only the following columns:

  • dteday: Das Datum der Beobachtung.dteday: The date of the observation.
  • year: Das codierte Jahr der Beobachtung (0 = 2011, 1 = 2012).year: The encoded year of the observation (0=2011, 1=2012).
  • cnt: Die Gesamtzahl der Fahrradvermietungen für diesen Tag.cnt: The total number of bike rentals for that day.

Das ursprüngliche Dataset wird einer Datenbanktabelle mit dem folgenden Schema in einer SQL Server Datenbank zugeordnet.The original dataset is mapped to a database table with the following schema in a SQL Server database.

CREATE TABLE [Rentals] (
    [RentalDate] DATE NOT NULL,
    [Year] INT NOT NULL,
    [TotalRentals] INT NOT NULL
);

Im Folgenden finden Sie ein Beispiel für die Daten:The following is a sample of the data:

RentalDateRentalDate JahrYear TotalRentalsTotalRentals
1/1/20111/1/2011 00 985985
1/2/20111/2/2011 00 801801
1/3/20111/3/2011 00 13491349

Erstellen von Eingabe- und AusgabeklassenCreate input and output classes

  1. Ersetzen Sie in Program.cs die vorhandenen using-Anweisungen durch Folgendes:Open Program.cs file and replace the existing using statements with the following:

    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.IO;
    using System.Linq;
    using Microsoft.ML;
    using Microsoft.ML.Data;
    using Microsoft.ML.Transforms.TimeSeries;
    
  2. Erstellen Sie die ModelInput-Klasse.Create ModelInput class. Fügen Sie unter der Program-Klasse den folgenden Code hinzu.Below the Program class, add the following code.

    public class ModelInput
    {
        public DateTime RentalDate { get; set; }
    
        public float Year { get; set; }
    
        public float TotalRentals { get; set; }
    }
    

    Die ModelInput-Klasse enthält die folgenden Spalten:The ModelInput class contains the following columns:

    • RentalDate: Das Datum der Beobachtung.RentalDate: The date of the observation.
    • Year: Das codierte Jahr der Beobachtung (0 = 2011, 1 = 2012).Year: The encoded year of the observation (0=2011, 1=2012).
    • TotalRentals: Die Gesamtzahl der Fahrradvermietungen für diesen Tag.TotalRentals: The total number of bike rentals for that day.
  3. Erstellen Sie die ModelOutput-Klasse unterhalb der neu erstellten ModelInput-Klasse.Create ModelOutput class below the newly created ModelInput class.

    public class ModelOutput
    {
        public float[] ForecastedRentals { get; set; }
    
        public float[] LowerBoundRentals { get; set; }
    
        public float[] UpperBoundRentals { get; set; }
    }
    

    Die ModelOutput-Klasse enthält die folgenden Spalten:The ModelOutput class contains the following columns:

    • ForecastedRentals: Die vorhergesagten Werte für den Vorhersagezeitraum.ForecastedRentals: The predicted values for the forecasted period.
    • LowerBoundRentals: Die vorhergesagten Mindestwerte für den Vorhersagezeitraum.LowerBoundRentals: The predicted minimum values for the forecasted period.
    • UpperBoundRentals: Die vorhergesagten Maximalwerte für den Vorhersagezeitraum.UpperBoundRentals: The predicted maximum values for the forecasted period.

Definieren von Pfaden und Initialisieren von VariablenDefine paths and initialize variables

  1. Definieren Sie innerhalb der Main-Methode Variablen, um den Speicherort der Daten, die Verbindungszeichenfolge und den Speicherort für das trainierte Modell zu speichern.Inside the Main method, define variables to store the location of your data, connection string, and where to save the trained model.

    string rootDir = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../../"));
    string dbFilePath = Path.Combine(rootDir, "Data", "DailyDemand.mdf");
    string modelPath = Path.Combine(rootDir, "MLModel.zip");
    var connectionString = $"Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename={dbFilePath};Integrated Security=True;Connect Timeout=30;";
    
  2. Initialisieren Sie die mlContext-Variable mit einer neuen Instanz von MLContext, indem Sie der Main-Methode die folgende Zeile hinzufügen.Initialize the mlContext variable with a new instance of MLContext by adding the following line to the Main method.

    MLContext mlContext = new MLContext();
    

    Die MLContext-Klasse ist der Ausgangspunkt 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

  1. Erstellen Sie das DatabaseLoader-Element, mit dem Datensätze des Typs ModelInput geladen werden.Create DatabaseLoader that loads records of type ModelInput.

    DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<ModelInput>();
    
  2. Definieren Sie die Abfrage, um die Daten aus der Datenbank zu laden.Define the query to load the data from the database.

    string query = "SELECT RentalDate, CAST(Year as REAL) as Year, CAST(TotalRentals as REAL) as TotalRentals FROM Rentals";
    

    ML.NET-Algorithmen erwarten, dass Daten vom Typ Single sind.ML.NET algorithms expect data to be of type Single. Daher müssen numerische Werte aus der Datenbank, die nicht vom Typ Real (ein Gleitkommawert mit einfacher Genauigkeit) sind, in Real konvertiert werden.Therefore, numerical values coming from the database that are not of type Real, a single-precision floating-point value, have to be converted to Real.

    Die Spalten Year und TotalRental sind Integertypen in der Datenbank.The Year and TotalRental columns are both integer types in the database. Mithilfe der integrierten Funktion CAST werden beide Werte in Real umgewandelt.Using the CAST built-in function, they are both cast to Real.

  3. Erstellen Sie eine DatabaseSource, um eine Verbindung mit der Datenbank herzustellen und die Abfrage auszuführen.Create a DatabaseSource to connect to the database and execute the query.

    DatabaseSource dbSource = new DatabaseSource(SqlClientFactory.Instance,
                                    connectionString,
                                    query);
    
  4. Laden Sie die Daten in eine IDataView.Load the data into an IDataView.

    IDataView dataView = loader.Load(dbSource);
    
  5. Das Dataset enthält Daten aus zwei Jahren.The dataset contains two years worth of data. Nur Daten aus dem ersten Jahr werden für das Training verwendet, das zweite Jahr wird zum Vergleichen der tatsächlichen Werte mit der vom Modell generierten Vorhersage verwendet.Only data from the first year is used for training, the second year is held out to compare the actual values against the forecast produced by the model. Filtern Sie die Daten mithilfe der FilterRowsByColumn-Transformation.Filter the data using the FilterRowsByColumn transform.

    IDataView firstYearData = mlContext.Data.FilterRowsByColumn(dataView, "Year", upperBound: 1);
    IDataView secondYearData = mlContext.Data.FilterRowsByColumn(dataView, "Year", lowerBound: 1);
    

    Für das erste Jahr werden nur die Werte in der Spalte Year, die kleiner als 1 ist, durch Festlegen des upperBound-Parameters auf 1 ausgewählt.For the first year, only the values in the Year column less than 1 are selected by setting the upperBound parameter to 1. Umgekehrt werden für das zweite Jahr Werte größer oder gleich 1 ausgewählt, indem der lowerBound-Parameter auf 1 festgelegt wird.Conversely, for the second year, values greater than or equal to 1 are selected by setting the lowerBound parameter to 1.

Definieren einer Zeitreihenanalyse-PipelineDefine time series analysis pipeline

  1. Definieren Sie eine Pipeline, die SsaForecastingEstimator verwendet, um Werte in einem Zeitreihendataset vorherzusagen.Define a pipeline that uses the SsaForecastingEstimator to forecast values in a time-series dataset.

    var forecastingPipeline = mlContext.Forecasting.ForecastBySsa(
        outputColumnName: "ForecastedRentals",
        inputColumnName: "TotalRentals",
        windowSize: 7,
        seriesLength: 30,
        trainSize: 365,
        horizon: 7,
        confidenceLevel: 0.95f,
        confidenceLowerBoundColumn: "LowerBoundRentals",
        confidenceUpperBoundColumn: "UpperBoundRentals");
    

    Die forecastingPipeline nimmt für das erste Jahr 365 Datenpunkte an und teilt ein Zeitreihendataset in Stichproben von jeweils 30 Tagen (monatlich) auf, wie vom seriesLength-Parameter angegeben.The forecastingPipeline takes 365 data points for the first year and samples or splits the time-series dataset into 30-day (monthly) intervals as specified by the seriesLength parameter. Jede dieser Stichproben wird anhand eines wöchentlichen oder ein 7-tägigen Fensters analysiert.Each of these samples is analyzed through weekly or a 7-day window. Bei der Ermittlung des prognostizierten Werts für die nächste(n) Zeitspanne(n) werden die Werte der letzten sieben Tage verwendet, um eine Prognose zu erstellen.When determining what the forecasted value for the next period(s) is, the values from previous seven days are used to make a prediction. Das Modell wird so festgelegt, dass sieben Zeitspannen in der Zukunft vorhergesagt werden, wie durch den horizon-Parameter definiert.The model is set to forecast seven periods into the future as defined by the horizon parameter. Da eine Vorhersage eine fundierte Vermutung ist, ist sie nicht immer zu 100 % genau.Because a forecast is an informed guess, it's not always 100% accurate. Daher ist es gut, den Wertebereich in den besten und schlechtesten Szenarien zu kennen, wie durch die oberen und unteren Grenzen definiert.Therefore, it's good to know the range of values in the best and worst-case scenarios as defined by the upper and lower bounds. In diesem Fall wird der Vertrauensgrad für die untere und obere Grenze auf 95 % festgelegt.In this case, the level of confidence for the lower and upper bounds is set to 95%. Der Vertrauensgrad kann entsprechend angehoben oder gesenkt werden.The confidence level can be increased or decreased accordingly. Je höher der Wert, desto größer ist der Bereich zwischen der oberen und unteren Grenze, um das gewünschte Maß an Vertrauen zu erreichen.The higher the value, the wider the range is between the upper and lower bounds to achieve the desired level of confidence.

  2. Verwenden Sie die Fit-Methode, um das Modell zu trainieren und die Daten an die zuvor definierte forecastingPipeline anzupassen.Use the Fit method to train the model and fit the data to the previously defined forecastingPipeline.

    SsaForecastingTransformer forecaster = forecastingPipeline.Fit(firstYearData);
    

Evaluieren des ModellsEvaluate the model

Bewerten Sie die Leistungsfähigkeit des Modells, indem Sie die Daten des nächsten Jahrs prognostizieren und mit den tatsächlichen Werten vergleichen.Evaluate how well the model performs by forecasting next year's data and comparing it against the actual values.

  1. Erstellen Sie unter der Main-Methode eine neue Hilfsmethode namens Evaluate.Below the Main method, create a new utility method called Evaluate.

    static void Evaluate(IDataView testData, ITransformer model, MLContext mlContext)
    {
    
    }
    
  2. Prognostizieren Sie in der Evaluate-Methode die Daten des zweiten Jahrs mithilfe der Transform-Methode mit dem trainierten Modell.Inside the Evaluate method, forecast the second year's data by using the Transform method with the trained model.

    IDataView predictions = model.Transform(testData);
    
  3. Verwenden Sie die CreateEnumerable-Methode, um die tatsächlichen Werte aus den Daten abzurufen.Get the actual values from the data by using the CreateEnumerable method.

    IEnumerable<float> actual =
        mlContext.Data.CreateEnumerable<ModelInput>(testData, true)
            .Select(observed => observed.TotalRentals);
    
  4. Verwenden Sie die CreateEnumerable-Methode, um die Vorhersagewerte abzurufen.Get the forecast values by using the CreateEnumerable method.

    IEnumerable<float> forecast =
        mlContext.Data.CreateEnumerable<ModelOutput>(predictions, true)
            .Select(prediction => prediction.ForecastedRentals[0]);
    
  5. Berechnen Sie die Differenz zwischen den tatsächlichen Werten und den Vorhersagewerten, die im Allgemeinen als „Fehler“ bezeichnet wird.Calculate the difference between the actual and forecast values, commonly referred to as the error.

    var metrics = actual.Zip(forecast, (actualValue, forecastValue) => actualValue - forecastValue);
    
  6. Messen Sie die Leistung, indem Sie die Werte Mean Absolute Error (Mittlerer absoluter Fehler) und Root Mean Squared Error (Mittlerer quadratischer Fehler) berechnen.Measure performance by computing the Mean Absolute Error and Root Mean Squared Error values.

    var MAE = metrics.Average(error => Math.Abs(error)); // Mean Absolute Error
    var RMSE = Math.Sqrt(metrics.Average(error => Math.Pow(error, 2))); // Root Mean Squared Error
    

    Die folgenden Metriken werden verwendet, um die Leistung auszuwerten:To evaluate performance, the following metrics are used:

    • Mean Absolute Error (Mittlerer absoluter Fehler): Misst, wie nahe Vorhersagen am tatsächlichen Wert liegen.Mean Absolute Error: Measures how close predictions are to the actual value. Dieser Wert liegt zwischen 0 und unendlich.This value ranges between 0 and infinity. Je näher der Wert an 0 ist, desto besser ist die Qualität des Modells.The closer to 0, the better the quality of the model.
    • Root Mean Squared Error (Mittlerer quadratischer Fehler): Fasst den Fehler im Modell zusammen.Root Mean Squared Error: Summarizes the error in the model. Dieser Wert liegt zwischen 0 und unendlich.This value ranges between 0 and infinity. Je näher der Wert an 0 ist, desto besser ist die Qualität des Modells.The closer to 0, the better the quality of the model.
  7. Geben Sie die Metriken an die Konsole aus.Output the metrics to the console.

    Console.WriteLine("Evaluation Metrics");
    Console.WriteLine("---------------------");
    Console.WriteLine($"Mean Absolute Error: {MAE:F3}");
    Console.WriteLine($"Root Mean Squared Error: {RMSE:F3}\n");
    
  8. Verwenden Sie die Evaluate-Methode in der Main-Methode.Use the Evaluate method inside the Main method.

    Evaluate(secondYearData, forecaster, mlContext);
    

Speichern des ModellsSave the model

Wenn Sie mit Ihrem Modell zufrieden sind, speichern Sie es zur späteren Verwendung in anderen Anwendungen.If you're satisfied with your model, save it for later use in other applications.

  1. Erstellen Sie in der Main-Methode eine TimeSeriesPredictionEngine.In the Main method, create a TimeSeriesPredictionEngine. TimeSeriesPredictionEngine ist eine bequeme Methode, um einzelne Vorhersagen zu treffen.TimeSeriesPredictionEngine is a convenience method to make single predictions.

    var forecastEngine = forecaster.CreateTimeSeriesEngine<ModelInput, ModelOutput>(mlContext);
    
  2. Speichern Sie das Modell in einer Datei namens MLModel.zip, wie durch die zuvor definierten modelPath-Variable angegeben.Save the model to a file called MLModel.zip as specified by the previously defined modelPath variable. Verwenden Sie die Checkpoint-Methode, um das Modell zu speichern.Use the Checkpoint method to save the model.

    forecastEngine.CheckPoint(mlContext, modelPath);
    

Verwenden des Modells zum Vorhersagen des BedarfsUse the model to forecast demand

  1. Erstellen Sie unter der Evaluate-Methode eine neue Hilfsmethode namens Forecast.Below the Evaluate method, create a new utility method called Forecast.

    static void Forecast(IDataView testData, int horizon, TimeSeriesPredictionEngine<ModelInput, ModelOutput> forecaster, MLContext mlContext)
    {
    
    }
    
  2. Verwenden Sie innerhalb der Forecast-Methode die Predict-Methode, um die Vermietungen der nächsten sieben Tage vorherzusagen.Inside the Forecast method, use the Predict method to forecast rentals for the next seven days.

    ModelOutput forecast = forecaster.Predict();
    
  3. Bringen Sie die tatsächlichen und die vorhergesagten Werte für sieben Zeiträume in Einklang.Align the actual and forecast values for seven periods.

    IEnumerable<string> forecastOutput =
        mlContext.Data.CreateEnumerable<ModelInput>(testData, reuseRowObject: false)
            .Take(horizon)
            .Select((ModelInput rental, int index) =>
            {
                string rentalDate = rental.RentalDate.ToShortDateString();
                float actualRentals = rental.TotalRentals;
                float lowerEstimate = Math.Max(0, forecast.LowerBoundRentals[index]);
                float estimate = forecast.ForecastedRentals[index];
                float upperEstimate = forecast.UpperBoundRentals[index];
                return $"Date: {rentalDate}\n" +
                $"Actual Rentals: {actualRentals}\n" +
                $"Lower Estimate: {lowerEstimate}\n" +
                $"Forecast: {estimate}\n" +
                $"Upper Estimate: {upperEstimate}\n";
            });
    
  4. Iterieren Sie durch die Vorhersageausgabe, und zeigen Sie diese in der Konsole an.Iterate through the forecast output and display it on the console.

    Console.WriteLine("Rental Forecast");
    Console.WriteLine("---------------------");
    foreach (var prediction in forecastOutput)
    {
        Console.WriteLine(prediction);
    }
    

Ausführen der AnwendungRun the application

  1. Rufen Sie in der Main-Methode die Forecast-Methode auf.Inside the Main method, call the Forecast method.

    Forecast(secondYearData, 7, forecastEngine, mlContext);
    
  2. Führen Sie die Anwendung aus.Run the application. Eine ähnliche Ausgabe wie die folgende sollte in der Konsole angezeigt werden.Output similar to that below should appear on the console. Aus Gründen der Kürze wurde die Ausgabe komprimiert.For brevity, the output has been condensed.

    Evaluation Metrics
    ---------------------
    Mean Absolute Error: 726.416
    Root Mean Squared Error: 987.658
    
    Rental Forecast
    ---------------------
    Date: 1/1/2012
    Actual Rentals: 2294
    Lower Estimate: 1197.842
    Forecast: 2334.443
    Upper Estimate: 3471.044
    
    Date: 1/2/2012
    Actual Rentals: 1951
    Lower Estimate: 1148.412
    Forecast: 2360.861
    Upper Estimate: 3573.309
    

Bei der Untersuchung der tatsächlichen und der vorhergesagten Werte werden die folgenden Beziehungen angezeigt:Inspection of the actual and forecasted values shows the following relationships:

Vergleich der tatsächlichen und der vorhergesagten Werte

Obwohl die vorhergesagten Werte nicht die genaue Anzahl von Vermietungen vorhersagen, stellen sie einen engeren Bereich von Werten bereit, der es im Betrieb ermöglicht, die Verwendung von Ressourcen zu optimieren.While the forecasted values are not predicting the exact number of rentals, they provide a more narrow range of values that allows an operation to optimize their use of resources.

Herzlichen Glückwunsch!Congratulations! Sie haben nun erfolgreich ein Machine Learning-Zeitreihenmodell erstellt, um den Bedarf für die Fahrradvermietung zu prognostizieren.You've now successfully built a time series machine learning model to forecast bike rental demand.

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

Nächste SchritteNext steps