Teilen über


Lernprogramm: Vorhersagen von Preisen mithilfe von Regression mit ML.NET

In diesem Lernprogramm wird veranschaulicht, wie Sie ein Regressionsmodell mit ML.NET erstellen, um Preise, insbesondere new York City Taxipreise, vorherzusagen.

In diesem Tutorial erfahren Sie, wie:

  • Vorbereiten und Verstehen der Daten
  • Laden und Transformieren der Daten
  • Auswählen eines Lernalgorithmus
  • Trainieren des Modells
  • Auswerten des Modells
  • Verwenden des Modells für Vorhersagen

Voraussetzungen

Erstellen einer Konsolenanwendung

  1. Erstellen Sie eine C# -Konsolenanwendung namens "TaxiFarePrediction".

  2. Wählen Sie .NET 8 als zu verwendende Framework aus. Klicken Sie auf die Schaltfläche " Erstellen ".

  3. Erstellen Sie ein Verzeichnis mit dem Namen "Daten " in Ihrem Projekt, um die Dataset- und Modelldateien zu speichern.

  4. Installieren Sie das Microsoft.ML - und Microsoft.ML.FastTree NuGet-Paket:

    Hinweis

    In diesem Beispiel wird die neueste stabile Version der erwähnten NuGet-Pakete verwendet, sofern nichts anderes angegeben ist.

    Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie NuGet-Pakete verwalten aus. Wählen Sie "nuget.org" als Paketquelle aus, wählen Sie die Registerkarte " Durchsuchen " aus, suchen Sie nach Microsoft.ML, wählen Sie das Paket in der Liste und dann "Installieren" aus. Wählen Sie im Dialogfeld "Vorschauänderungen" die Schaltfläche "OK" und dann im Dialogfeld "Lizenzakzeptanz" die Schaltfläche "Ich stimme zu", wenn Sie den Lizenzbedingungen für die aufgeführten Pakete zustimmen. Führen Sie dieselbe Vorgehensweise für das Microsoft.ML.FastTree NuGet-Paket aus.

Vorbereiten und Verstehen der Daten

  1. Laden Sie die taxi-fare-train.csv und die taxi-fare-test.csv Datensätze herunter, und speichern Sie sie im Ordner "Daten ", den Sie im vorherigen Schritt erstellt haben. Wir verwenden diese Datasets, um das Machine Learning-Modell zu trainieren und dann zu bewerten, wie genau das Modell ist. Diese Datensätze stammen ursprünglich aus dem Datensatz NYC TLC Taxi Trip.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die dateien *.csv, und wählen Sie "Eigenschaften" aus. Unter Erweitert ändern Sie den Wert von In Ausgabeverzeichnis kopieren zu Kopieren, wenn neuer.

  3. Öffnen Sie das taxi-fare-train.csv Dataset, und sehen Sie sich die Spaltenüberschriften in der ersten Zeile an. Sehen Sie sich die einzelnen Spalten an. Verstehen Sie die Daten, und entscheiden Sie, welche Spalten Features sind und welches die Bezeichnung ist.

Dies label ist die Spalte, die Sie vorhersagen möchten. Die identifizierten FeaturesEingaben sind die Eingaben, die Sie dem Modell zur Vorhersage des LabelModells geben.

Das bereitgestellte Dataset enthält die folgenden Spalten:

  • vendor_id: Die ID des Taxianbieters ist ein Feature.
  • rate_code: Der Preistyp der Taxifahrt ist ein Feature.
  • passenger_count: Die Anzahl der Passagiere auf der Reise ist ein Feature.
  • trip_time_in_secs: Die Zeitspanne, die die Reise dauerte. Sie möchten den Tarif der Reise vorhersagen, bevor die Reise abgeschlossen ist. Zu diesem Zeitpunkt wissen Sie nicht, wie lange die Reise dauern würde. Daher ist die Reisezeit kein Feature, und Sie schließen diese Spalte aus dem Modell aus.
  • trip_distance: Die Entfernung der Reise ist ein Feature.
  • payment_type: Die Zahlungsmethode (Bargeld oder Kreditkarte) ist ein Feature.
  • fare_amount: Der gesamt bezahlte Taxipreis ist das Etikett.

Erstellen von Datenklassen

Erstellen Sie Klassen für die Eingabedaten und die Vorhersagen:

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie dann "> hinzufügen" aus.

  2. Wählen Sie im Dialogfeld " Neues Element hinzufügen " " Klasse " aus, und ändern Sie das Feld "Name " in TaxiTrip.cs. Klicken Sie anschließend auf Hinzufügen.

  3. Fügen Sie der neuen Datei die folgenden using Direktiven hinzu:

    using Microsoft.ML.Data;
    

Entfernen Sie die vorhandene Klassendefinition und fügen Sie den folgenden Code mit zwei Klassen TaxiTrip und TaxiTripFarePrediction in die Datei TaxiTrip.cs ein.

public class TaxiTrip
{
    [LoadColumn(0)]
    public string? VendorId;

    [LoadColumn(1)]
    public string? RateCode;

    [LoadColumn(2)]
    public float PassengerCount;

    [LoadColumn(3)]
    public float TripTime;

    [LoadColumn(4)]
    public float TripDistance;

    [LoadColumn(5)]
    public string? PaymentType;

    [LoadColumn(6)]
    public float FareAmount;
}

public class TaxiTripFarePrediction
{
    [ColumnName("Score")]
    public float FareAmount;
}

TaxiTrip ist die Eingabedatenklasse und enthält Definitionen für jede der Datasetspalten. Verwenden Sie das LoadColumnAttribute Attribut, um die Indizes der Quellspalten im Dataset anzugeben.

Die TaxiTripFarePrediction Klasse stellt vorhergesagte Ergebnisse dar. Es verfügt über ein einzelnes Float-Feld, FareAmountauf das ein ScoreColumnNameAttribute Attribut angewendet wird. Im Fall der Regressionsaufgabe enthält die Spalte "Score " vorhergesagte Bezeichnungswerte.

Hinweis

Verwenden Sie den float Typ, um Gleitkommawerte in den Eingabe- und Vorhersagedatenklassen darzustellen.

Definieren von Daten- und Modellpfaden

Fügen Sie oben in der using die folgenden zusätzlichen Direktiven hinzu:

using Microsoft.ML;
using TaxiFarePrediction;

Sie müssen drei Felder erstellen, um die Pfade zu den Dateien mit Datensätzen und der Datei zum Speichern des Modells zu speichern:

  • _trainDataPath enthält den Pfad zur Datei mit dem Datensatz, der zum Trainieren des Modells verwendet wird.
  • _testDataPath enthält den Pfad zur Datei mit dem Datensatz, der zum Auswerten des Modells verwendet wird.
  • _modelPath enthält den Pfad zu der Datei, in der das trainierte Modell gespeichert ist.

Fügen Sie den folgenden Code direkt unterhalb des Usings-Abschnitts hinzu, um diese Pfade und die _textLoader Variable anzugeben:

string _trainDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "taxi-fare-train.csv");
string _testDataPath = Path.Combine(Environment.CurrentDirectory, "Data", "taxi-fare-test.csv");
string _modelPath = Path.Combine(Environment.CurrentDirectory, "Data", "Model.zip");

Alle ML.NET Vorgänge beginnen in der MLContext-Klasse. Beim Initialisieren mlContext wird eine neue ML.NET Umgebung erstellt, die für die Workflowobjekte der Modellerstellung freigegeben werden kann. Es ist konzeptionell ähnlich wie DBContext im Entity Framework.

Initialisieren der Variablen

Ersetzen Sie die Console.WriteLine("Hello World!") Zeile durch den folgenden Code, um die mlContext Variable zu deklarieren und zu initialisieren:

MLContext mlContext = new MLContext(seed: 0);

Fügen Sie Folgendes als nächste Codezeile hinzu, um die Train Methode aufzurufen:

var model = Train(mlContext, _trainDataPath);

Die Train() Methode führt die folgenden Aufgaben aus:

  • Lädt die Daten.
  • Extrahiert und transformiert die Daten.
  • Trainiert das Modell.
  • Gibt das Modell zurück.

Die Train Methode trainiert das Modell. Erstellen Sie diese Methode unten, indem Sie den folgenden Code verwenden:

ITransformer Train(MLContext mlContext, string dataPath)
{

}

Laden und Transformieren von Daten

ML.NET verwendet die IDataView-Schnittstelle als flexible, effiziente Methode zum Beschreiben numerischer oder Text tabellarischer Daten. IDataView kann textdateien oder in Echtzeit laden (z. B. SQL-Datenbank oder Protokolldateien). Fügen Sie den folgenden Code als erste Zeile der Train() Methode hinzu:

IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(dataPath, hasHeader: true, separatorChar: ',');

Um den Taxifahrtpreis vorherzusagen, ist die FareAmount Spalte diejenige, die Sie vorhersagen werden (die Ausgabe des Modells). Verwenden Sie die Transformationsklasse CopyColumnsEstimator , um sie zu kopieren FareAmount, und fügen Sie den folgenden Code hinzu:

var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName:"FareAmount")

Der Algorithmus, der das Modell trainiert, erfordert numerische Features, sodass Sie die kategorisierten Daten (, VendorIdund RateCode) Werte in Zahlen (PaymentType, VendorIdEncodedund RateCodeEncoded) transformieren müssen.PaymentTypeEncoded Verwenden Sie dazu die OneHotEncodingTransformer-Transformationsklasse , die den verschiedenen Werten für numerische Schlüssel in jeder Spalte unterschiedliche Werte zuweist, und fügen Sie den folgenden Code hinzu:

.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "VendorIdEncoded", inputColumnName:"VendorId"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "RateCodeEncoded", inputColumnName: "RateCode"))
.Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "PaymentTypeEncoded", inputColumnName: "PaymentType"))

Der letzte Schritt in der Datenvorbereitung kombiniert alle Featurespalten in der Spalte "Features " mithilfe der mlContext.Transforms.Concatenate Transformationsklasse. Standardmäßig verarbeitet ein Lernalgorithmus nur Features aus der Spalte "Features ". Fügen Sie den folgenden Code hinzu:

.Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripDistance", "PaymentTypeEncoded"))

Auswählen eines Lernalgorithmus

Bei diesem Problem geht es darum, den Fahrpreis einer Taxifahrt in New York City vorherzusagen. Auf den ersten Blick scheint es einfach von der entfernung abhängig zu sein. Taxianbieter in New York berechnen jedoch unterschiedliche Beträge für andere Faktoren wie zusätzliche Passagiere oder bezahlen mit einer Kreditkarte anstelle von Bargeld. Sie möchten den Preiswert prognostizieren, bei dem es sich um einen realen Wert handelt, der auf den anderen Faktoren im Dataset basiert. Dazu wählen Sie eine Regressionsaufgabe für maschinelles Lernen aus.

Fügen Sie die Machine Learning-Aufgabe FastTreeRegressionTrainer an die Datentransformationsdefinitionen an, indem Sie Folgendes als nächste Codezeile in Train():

.Append(mlContext.Regression.Trainers.FastTree());

Trainieren des Modells

Passen Sie das Modell an die Schulung dataview an, und geben Sie das trainierte Modell zurück, indem Sie die folgende Codezeile in der Train() Methode hinzufügen:

var model = pipeline.Fit(dataView);

Die Fit()- Methode trainiert Ihr Modell, indem das Dataset transformiert und die Schulung angewendet wird.

Gibt das trainierte Modell mit der folgenden Codezeile in der Train() Methode zurück:

return model;

Auswerten des Modells

Bewerten Sie als Nächstes die Modellleistung mit Ihren Testdaten für die Qualitätssicherung und Validierung. Erstellen Sie die Evaluate() Methode direkt hinter Train()dem folgenden Code:

void Evaluate(MLContext mlContext, ITransformer model)
{

}

Die Evaluate Methode führt die folgenden Aufgaben aus:

  • Lädt das Test-Dataset.
  • Erstellt den Regressions-Evaluator.
  • Wertet das Modell aus und erstellt Metriken.
  • Zeigt die Metriken an.

Fügen Sie direkt unter dem Train Methodenaufruf einen Aufruf der neuen Methode mithilfe des folgenden Codes hinzu:

Evaluate(mlContext, model);

Laden Sie das Testdatenset mithilfe der LoadFromTextFile()- Methode. Bewerten Sie das Modell mithilfe dieses Datasets als Qualitätsüberprüfung, indem Sie den folgenden Code in der Evaluate Methode hinzufügen:

IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(_testDataPath, hasHeader: true, separatorChar: ',');

Transformieren Sie als Nächstes die Test Daten, indem Sie den folgenden Code hinzufügen:Evaluate()

var predictions = model.Transform(dataView);

Die Transform()- Methode macht Vorhersagen für die Eingabezeilen des Testdatensets.

Die RegressionContext.Evaluate Methode berechnet die Qualitätsmetriken für die PredictionModel Verwendung des angegebenen Datasets. Es gibt ein RegressionMetrics Objekt zurück, das die von Regressions-Evaluatoren berechneten Gesamtmetriken enthält.

Um diese anzuzeigen, um die Qualität des Modells zu ermitteln, müssen Sie zuerst die Metriken abrufen. Fügen Sie den folgenden Code als nächste Zeile in der Evaluate Methode hinzu:

var metrics = mlContext.Regression.Evaluate(predictions, "Label", "Score");

Nachdem Sie den Vorhersagesatz festgelegt haben, bewertet die Evaluate() -Methode das Modell, das die vorhergesagten Werte mit dem tatsächlichen Labels Im Testdatensatz vergleicht und Metriken zur Leistung des Modells zurückgibt.

Fügen Sie den folgenden Code hinzu, um das Modell auszuwerten und die Auswertungsmetriken zu erstellen:

Console.WriteLine();
Console.WriteLine($"*************************************************");
Console.WriteLine($"*       Model quality metrics evaluation         ");
Console.WriteLine($"*------------------------------------------------");

RSquared ist eine weitere Auswertungsmetrik der Regressionsmodelle. RSquared akzeptiert Werte zwischen 0 und 1. Je näher sein Wert auf 1 liegt, desto besser ist das Modell. Fügen Sie der Evaluate Methode den folgenden Code hinzu, um den RSquared-Wert anzuzeigen:

Console.WriteLine($"*       RSquared Score:      {metrics.RSquared:0.##}");

RMS ist eine der Auswertungsmetriken des Regressionsmodells. Je niedriger es ist, desto besser ist das Modell. Fügen Sie der Methode den folgenden Code Evaluate hinzu, um den RMS-Wert anzuzeigen:

Console.WriteLine($"*       Root Mean Squared Error:      {metrics.RootMeanSquaredError:0.##}");

Verwenden des Modells für Vorhersagen

Erstellen Sie die TestSinglePrediction Methode direkt nach der Evaluate Methode mithilfe des folgenden Codes:

void TestSinglePrediction(MLContext mlContext, ITransformer model)
{

}

Die TestSinglePrediction Methode führt die folgenden Aufgaben aus:

  • Erstellt einen einzelnen Kommentar von Testdaten.
  • Prognostiziert den Tarifbetrag basierend auf Testdaten.
  • Kombiniert Testdaten und Vorhersagen für die Berichterstellung.
  • Zeigt die vorhergesagten Ergebnisse an.

Fügen Sie direkt unter dem Evaluate Methodenaufruf einen Aufruf der neuen Methode mithilfe des folgenden Codes hinzu:

TestSinglePrediction(mlContext, model);

Verwenden Sie die PredictionEngine Zusagung, um den Tarif vorherzusagen, indem Sie den folgenden Code hinzufügen:TestSinglePrediction()

var predictionFunction = mlContext.Model.CreatePredictionEngine<TaxiTrip, TaxiTripFarePrediction>(model);

Die PredictionEngine ist eine Komfort-API, mit der Sie eine Vorhersage für eine einzelne Instanz von Daten durchführen können. PredictionEngine ist nicht threadsicher. Es ist akzeptabel, in Singlethread- oder Prototypumgebungen zu verwenden. Um die Leistung und Threadsicherheit in Produktionsumgebungen zu verbessern, verwenden Sie den PredictionEnginePool Dienst, der eine ObjectPool Von PredictionEngine Objekten für die gesamte Anwendung erstellt. In diesem Handbuch erfahren Sie, wie Sie in einer ASP.NET Core Web-API verwendenPredictionEnginePool.

Hinweis

PredictionEnginePool Die Diensterweiterung befindet sich derzeit in der Vorschau.

In diesem Tutorial wird innerhalb dieses Kurses eine Testreise verwendet. Später können Sie weitere Szenarien hinzufügen, um mit dem Modell zu experimentieren. Fügen Sie eine Reise hinzu, um die Kostenvorhersage des trainierten Modells in der TestSinglePrediction() Methode zu testen, indem Sie eine Instanz von TaxiTrip:

var taxiTripSample = new TaxiTrip()
{
    VendorId = "VTS",
    RateCode = "1",
    PassengerCount = 1,
    TripTime = 1140,
    TripDistance = 3.75f,
    PaymentType = "CRD",
    FareAmount = 0 // To predict. Actual/Observed = 15.5
};

Als Nächstes sagen Sie den Tarif basierend auf einer einzelnen Instanz der Taxifahrt-Daten voraus und übergeben ihn an den PredictionEngine, indem Sie Folgendes als die nächsten Codezeilen in der TestSinglePrediction()-Methode hinzufügen:

var prediction = predictionFunction.Predict(taxiTripSample);

Die Funktion "Vorhersagen()" macht eine Vorhersage für eine einzelne Instanz von Daten.

Um den vorhergesagten Tarif der angegebenen Reise anzuzeigen, fügen Sie der Methode den folgenden Code hinzu TestSinglePrediction :

Console.WriteLine($"**********************************************************************");
Console.WriteLine($"Predicted fare: {prediction.FareAmount:0.####}, actual fare: 15.5");
Console.WriteLine($"**********************************************************************");

Führen Sie das Programm aus, um den vorhergesagten Taxipreis für Ihren Testfall zu sehen.

Glückwunsch! Sie haben nun erfolgreich ein Machine Learning-Modell für die Vorhersage der Taxi-Reisetarife erstellt, ihre Genauigkeit bewertet und verwendet, um Vorhersagen zu treffen. Den Quellcode für dieses Lernprogramm finden Sie im GitHub-Repository "dotnet/samples ".

Nächste Schritte

In diesem Tutorial haben Sie Folgendes gelernt:

  • Vorbereiten und Verstehen der Daten
  • Erstellen einer Lernpipeline
  • Laden und Transformieren der Daten
  • Auswählen eines Lernalgorithmus
  • Trainieren des Modells
  • Auswerten des Modells
  • Verwenden des Modells für Vorhersagen

Wechseln Sie zum nächsten Lernprogramm, um mehr zu erfahren.