Delen via


Zelfstudie: Prijzen voorspellen met behulp van regressie met ML.NET

In deze zelfstudie ziet u hoe u een regressiemodel bouwt met behulp van ML.NET om prijzen te voorspellen, met name de taxitarieven van New York City.

In deze handleiding leer je hoe je:

  • De gegevens voorbereiden en begrijpen
  • De gegevens laden en transformeren
  • Een leeralgoritmen kiezen
  • Het model trainen
  • Het model evalueren
  • Het model gebruiken voor voorspellingen

Vereiste voorwaarden

Een consoletoepassing maken

  1. Maak een C# -consoletoepassing met de naam 'TaxiFarePrediction'.

  2. Kies .NET 8 als framework dat u wilt gebruiken. Klik op de knop Maken.

  3. Maak een map met de naam Gegevens in uw project om de gegevensset en modelbestanden op te slaan.

  4. Installeer het Microsoft.ML - en Microsoft.ML.FastTree NuGet-pakket:

    Opmerking

    In dit voorbeeld wordt de laatste stabiele versie van de vermelde NuGet-pakketten gebruikt, tenzij anders vermeld.

    Klik in Solution Explorer met de rechtermuisknop op het project en klik op NuGet-pakketten beheren. Kies 'nuget.org' als pakketbron, selecteer het tabblad Bladeren , zoek naar Microsoft.ML, selecteer het pakket in de lijst en selecteer Installeren. Selecteer de knop OK in het dialoogvenster Voorbeeld van wijzigingen en selecteer vervolgens de knop Accepteren in het dialoogvenster Acceptatie van licenties als u akkoord gaat met de licentievoorwaarden voor de vermelde pakketten. Doe hetzelfde voor het Microsoft.ML.FastTree NuGet-pakket.

De gegevens voorbereiden en begrijpen

  1. Download de taxi-fare-train.csv en de taxi-fare-test.csv gegevenssets en sla deze op in de map Gegevens die u in de vorige stap hebt gemaakt. We gebruiken deze gegevenssets om het machine learning-model te trainen en vervolgens te evalueren hoe nauwkeurig het model is. Deze gegevenssets zijn oorspronkelijk afkomstig uit de NYC TLC Taxi Trip-gegevensset.

  2. Klik in Solution Explorer met de rechtermuisknop op elk van de *.csv bestanden en selecteer Eigenschappen. Wijzig onder Geavanceerd de waarde van Kopiëren naar Uitvoermap naar Kopiëren als nieuwer.

  3. Open de taxi-fare-train.csv gegevensset en bekijk kolomkoppen in de eerste rij. Bekijk elk van de kolommen. Begrijp de gegevens en bepaal welke kolommen functies zijn en welke het label is.

De label kolom die u wilt voorspellen. De geïdentificeerde Featuresinvoer zijn de invoer die u het model geeft om het Labelte voorspellen.

De opgegeven gegevensset bevat de volgende kolommen:

  • vendor_id: De id van de taxileverancier is een functie.
  • rate_code: Het tarieftype van de taxirit is een functie.
  • passenger_count: Het aantal passagiers op de reis is een functie.
  • trip_time_in_secs: De tijd die de reis duurde. U wilt het tarief van de reis voorspellen voordat de reis is voltooid. Op dat moment weet je niet hoe lang de reis zou duren. De reistijd is dus geen functie en u sluit deze kolom uit van het model.
  • trip_distance: De afstand van de reis is een functie.
  • payment_type: De betalingswijze (contant of creditcard) is een functie.
  • fare_amount: Het totaal betaalde taxitarief vormt het label.

Gegevensklassen maken

Maak klassen voor de invoergegevens en de voorspellingen:

  1. Klik in Solution Explorer met de rechtermuisknop op het project en selecteerNieuw item>.

  2. Selecteer in het dialoogvenster Nieuw item toevoegen de optie Klasse en wijzig het veld Naamin TaxiTrip.cs. Selecteer vervolgens Toevoegen.

  3. Voeg de volgende using instructies toe aan het nieuwe bestand:

    using Microsoft.ML.Data;
    

Verwijder de bestaande klassedefinitie en voeg de volgende code toe, die twee klassen TaxiTrip heeft en TaxiTripFarePrediction, aan het TaxiTrip.cs-bestand :

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 is de invoergegevensklasse en bevat definities voor elk van de kolommen in de gegevensset. Gebruik het LoadColumnAttribute kenmerk om de indexen van de bronkolommen in de gegevensset op te geven.

De TaxiTripFarePrediction klasse vertegenwoordigt voorspelde resultaten. Er is één floatveld, FareAmountwaarbij een ScoreColumnNameAttribute kenmerk is toegepast. In het geval van de regressietaak bevat de kolom Score voorspelde labelwaarden.

Opmerking

Gebruik het float type om drijvende-kommawaarden in de invoer- en voorspellingsgegevensklassen weer te geven.

Gegevens- en modelpaden definiëren

Voeg de volgende aanvullende using instructies toe aan het begin van het bestand Program.cs :

using Microsoft.ML;
using TaxiFarePrediction;

U moet drie velden maken om de paden naar de bestanden met datasets en het bestand voor het opslaan van het model vast te leggen.

  • _trainDataPath bevat het pad naar het bestand met de gegevensset die wordt gebruikt om het model te trainen.
  • _testDataPath bevat het pad naar het bestand met de gegevensset die wordt gebruikt om het model te evalueren.
  • _modelPath bevat het pad naar het bestand waarin het getrainde model is opgeslagen.

Voeg de volgende code direct onder de sectie usings toe om deze paden en voor de _textLoader variabele op te geven:

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 bewerkingen beginnen in de MLContext-klasse. Als u initialiseert mlContext , wordt er een nieuwe ML.NET omgeving gemaakt die kan worden gedeeld in de werkstroomobjecten voor het maken van modellen. Het is vergelijkbaar, conceptueel gezien, met DBContext in Entity Framework.

Variabelen initialiseren

Vervang de Console.WriteLine("Hello World!") regel door de volgende code om de mlContext variabele te declareren en te initialiseren:

MLContext mlContext = new MLContext(seed: 0);

Voeg het volgende toe als de volgende coderegel om de Train methode aan te roepen:

var model = Train(mlContext, _trainDataPath);

De Train() methode voert de volgende taken uit:

  • Laadt de gegevens.
  • Hiermee worden de gegevens geëxtraheerd en getransformeerd.
  • Traint het model.
  • Retourneert het model.

De Train methode traint het model. Maak die methode net hieronder met behulp van de volgende code:

ITransformer Train(MLContext mlContext, string dataPath)
{

}

Gegevens laden en transformeren

ML.NET maakt gebruik van de IDataView-interface als een flexibele, efficiënte manier om numerieke of tekstgegevens in tabelvorm te beschrijven. IDataView kan tekstbestanden of in realtime laden (bijvoorbeeld SQL-database- of logboekbestanden). Voeg de volgende code toe als de eerste regel van de Train() methode:

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

Als u het rittarief van de taxi wilt voorspellen, is de FareAmount kolom de Label kolom die u wilt voorspellen (de uitvoer van het model). Gebruik de CopyColumnsEstimator transformatieklasse om te kopiëren FareAmounten voeg de volgende code toe:

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

Voor het algoritme waarmee het model wordt getraind, zijn numerieke functies vereist, zodat u de categorische gegevens (VendorId, RateCodeen PaymentType) moet transformeren in getallen (VendorIdEncoded, RateCodeEncodeden ).PaymentTypeEncoded Gebruik hiervoor de transformatieklasse OneHotEncodingTransformer , die verschillende numerieke sleutelwaarden toewijst aan de verschillende waarden in elk van de kolommen en voeg de volgende code toe:

.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"))

De laatste stap in de gegevensvoorbereiding combineert alle functiekolommen in de kolom Functies met behulp van de mlContext.Transforms.Concatenate transformatieklasse. Standaard verwerkt een leeralgoritmen alleen functies uit de kolom Functies . Voeg de volgende code toe:

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

Een leeralgoritmen kiezen

Dit probleem gaat over het voorspellen van een taxirit in New York City. Op het eerste gezicht lijkt het misschien gewoon afhankelijk te zijn van de afgelegde afstand. Taxileveranciers in New York brengen echter verschillende bedragen in rekening voor andere factoren, zoals extra passagiers of betalen met een creditcard in plaats van contant geld. U wilt de prijswaarde, een echte waarde, voorspellen op basis van de andere factoren in de gegevensset. Hiervoor kiest u een machine learning-taak voor regressie .

Voeg de machine learning-taak FastTreeRegressionTrainer toe aan de definities van gegevenstransformatie door het volgende toe te voegen als de volgende regel code in Train():

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

Het model trainen

Pas het model aan de training dataview aan en retourneer het getrainde model door de volgende coderegel toe te voegen in de Train() methode:

var model = pipeline.Fit(dataView);

Met de Fit() -methode traint u uw model door de gegevensset te transformeren en de training toe te passen.

Retourneert het getrainde model met de volgende coderegel in de Train() methode:

return model;

Het model evalueren

Evalueer vervolgens uw modelprestaties met uw testgegevens voor kwaliteitscontrole en validatie. Maak de Evaluate() methode, net na Train(), met de volgende code:

void Evaluate(MLContext mlContext, ITransformer model)
{

}

De Evaluate methode voert de volgende taken uit:

  • Laadt de testgegevensset.
  • Er wordt een regressie-evaluator gemaakt.
  • Evalueert het model en maakt metrische gegevens.
  • Geeft de metrische gegevens weer.

Voeg een aanroep toe aan de nieuwe methode direct onder de Train methode-aanroep met behulp van de volgende code:

Evaluate(mlContext, model);

Laad de testgegevensset met behulp van de methode LoadFromTextFile(). Evalueer het model met behulp van deze gegevensset als kwaliteitscontrole door de volgende code toe te voegen in de Evaluate methode:

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

Transformeer vervolgens de Test gegevens door de volgende code toe te voegen aan Evaluate():

var predictions = model.Transform(dataView);

De methode Transform() doet voorspellingen voor de invoerrijen van de testgegevensset.

De RegressionContext.Evaluate methode berekent de metrische kwaliteitsgegevens voor het PredictionModel gebruik van de opgegeven gegevensset. Het retourneert een RegressionMetrics object dat de algemene metrische gegevens bevat die worden berekend door regressie-evaluators.

Als u deze wilt weergeven om de kwaliteit van het model te bepalen, moet u eerst de metrische gegevens ophalen. Voeg de volgende code toe als de volgende regel in de Evaluate methode:

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

Zodra u de voorspellingsset hebt, evalueert de methode Evaluate() het model, waarmee de voorspelde waarden worden vergeleken met de werkelijke waarden Labels in de testgegevensset en metrische gegevens worden geretourneerd over hoe het model presteert.

Voeg de volgende code toe om het model te evalueren en de metrische evaluatiegegevens te produceren:

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

RSquared is een andere evaluatiemetriek van de regressiemodellen. RSquared neemt waarden tussen 0 en 1. Hoe dichter de waarde is bij 1, hoe beter het model is. Voeg de volgende code toe aan de Evaluate methode om de RSquared-waarde weer te geven:

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

RMS is een van de metrische evaluatiegegevens van het regressiemodel. Hoe lager het is, hoe beter het model is. Voeg de volgende code toe aan de Evaluate methode om de RMS-waarde weer te geven:

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

Het model gebruiken voor voorspellingen

Maak de TestSinglePrediction methode net na de Evaluate methode met behulp van de volgende code:

void TestSinglePrediction(MLContext mlContext, ITransformer model)
{

}

De TestSinglePrediction methode voert de volgende taken uit:

  • Hiermee maakt u één aantekening van testgegevens.
  • Voorspelt het tariefbedrag op basis van testgegevens.
  • Combineert testgegevens en voorspellingen voor rapportage.
  • Geeft de voorspelde resultaten weer.

Voeg een aanroep toe aan de nieuwe methode direct onder de Evaluate methode-aanroep met behulp van de volgende code:

TestSinglePrediction(mlContext, model);

Gebruik de PredictionEngine opdracht om het tarief te voorspellen door de volgende code toe te voegen aan TestSinglePrediction():

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

PredictionEngine is een handige API, waarmee u een voorspelling kunt uitvoeren op één exemplaar van gegevens. PredictionEngine is niet thread-safe. Het is acceptabel om te gebruiken in omgevingen met één thread of prototype. Voor verbeterde prestaties en threadveiligheid in productieomgevingen gebruikt u de PredictionEnginePool service, waarmee u objecten ObjectPoolPredictionEngine maakt voor gebruik in uw toepassing. Raadpleeg deze handleiding voor het gebruik PredictionEnginePool in een ASP.NET Core Web-API.

Opmerking

PredictionEnginePool de service-extensie is momenteel beschikbaar als preview-versie.

In deze zelfstudie wordt één testreis binnen deze klasse gebruikt. Later kunt u andere scenario's toevoegen om te experimenteren met het model. Voeg een reis toe om de voorspelling van de kosten van het getrainde model in de TestSinglePrediction() methode te testen door een instantie van 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
};

Vervolgens voorspelt u het tarief op basis van een enkele instantie van de taxiritgegevens en geeft u deze door aan het PredictionEngine door de volgende regels code toe te voegen in de TestSinglePrediction() methode:

var prediction = predictionFunction.Predict(taxiTripSample);

De functie Predict() doet een voorspelling voor één exemplaar van gegevens.

Als u het voorspelde tarief van de opgegeven reis wilt weergeven, voegt u de volgende code toe aan de TestSinglePrediction methode:

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

Voer het programma uit om het voorspelde taxitarief voor uw testcase te bekijken.

Gefeliciteerd! U hebt nu een machine learning-model gebouwd voor het voorspellen van tarieven voor taxiritten, de nauwkeurigheid ervan geëvalueerd en gebruikt om voorspellingen te doen. U vindt de broncode voor deze zelfstudie in de GitHub-opslagplaats dotnet/samples .

Volgende stappen

In deze tutorial leerde je hoe je:

  • De gegevens voorbereiden en begrijpen
  • Een leerpijplijn maken
  • De gegevens laden en transformeren
  • Een leeralgoritmen kiezen
  • Het model trainen
  • Het model evalueren
  • Het model gebruiken voor voorspellingen

Ga naar de volgende tutorial om meer te leren.