Share via


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

Deze zelfstudie laat zien hoe u een regressiemodel bouwt met behulp van ML.NET om prijzen te voorspellen, met name taxitarieven in New York City.

In deze zelfstudie leert u het volgende:

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

Vereisten

Een consoletoepassing maken

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

  2. Kies .NET 6 als het 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 nuget-pakket Microsoft.ML en Microsoft.ML.FastTree :

    Notitie

    In dit voorbeeld wordt de meest recente stabiele versie van de genoemde 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 de knop Installeren . Selecteer de knop OK in het dialoogvenster Voorbeeld van wijzigingen en selecteer vervolgens de knop Ik ga akkoord in het dialoogvenster Licentie-acceptatie als u akkoord gaat met de licentievoorwaarden voor de vermelde pakketten. Doe hetzelfde voor het NuGet-pakket Microsoft.ML.FastTree .

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 inKopiëren indien nieuwer.

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

De label is de kolom die u wilt voorspellen. De geïdentificeerde Featureszijn de invoer die u het model geeft om de 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 kenmerk.
  • trip_time_in_secs: De hoeveelheid tijd die de reis in beslag nam. 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 taxirit is het label.

Gegevensklassen maken

Klassen maken voor de invoergegevens en de voorspellingen:

  1. Klik in Solution Explorer met de rechtermuisknop op het project en selecteervervolgens Nieuw itemtoevoegen>.

  2. Selecteer in het dialoogvenster Nieuw item toevoegen de optie Klasse en wijzig het veld Naam in TaxiTrip.cs. Selecteer vervolgens de knop 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, die twee klassen TaxiTrip en TaxiTripFarePredictionheeft, toe aan het bestand TaxiTrip.cs :

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 gegevenssetkolommen. Gebruik het LoadColumnAttribute kenmerk om de indexen van de bronkolommen in de gegevensset op te geven.

De TaxiTripFarePrediction klasse vertegenwoordigt voorspelde resultaten. Het heeft één float-veld, FareAmount, met een ScoreColumnNameAttribute kenmerk toegepast. In het geval van de regressietaak bevat de kolom Score voorspelde labelwaarden.

Notitie

Gebruik het float type om drijvendekommagewaarden 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 voor de paden naar de bestanden met gegevenssets en het bestand om het model op te slaan:

  • _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 waar het getrainde model is opgeslagen.

Voeg de volgende code toe direct onder de sectie usings 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 worden gestart in de klasse MLContext. Als u initialiseert mlContext , wordt er een nieuwe ML.NET omgeving gemaakt die kan worden gedeeld met de werkstroomobjecten voor het maken van modellen. Het is conceptueel DBContext vergelijkbaar met 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 regel code om de Train methode aan te roepen:

var model = Train(mlContext, _trainDataPath);

Met Train() de methode worden de volgende taken uitgevoerd:

  • Laadt de gegevens.
  • Extraheert en transformeert de gegevens.
  • Traint het model.
  • Retourneert het model.

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

ITransformer Train(MLContext mlContext, string dataPath)
{

}

Gegevens laden en transformeren

ML.NET gebruikt de IDataView-interface als een flexibele, efficiënte manier om numerieke gegevens of gegevens 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: ',');

Omdat u het tarief van de taxirit wilt voorspellen, is de FareAmount kolom de Label 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")

Het algoritme waarmee het model wordt getraind, vereist numerieke functies, dus u moet de categorische gegevens (VendorId, RateCodeen PaymentType) -waarden transformeren in getallen (VendorIdEncoded, RateCodeEncodeden PaymentTypeEncoded). Hiervoor gebruikt u de transformatieklasse OneHotEncodingTransformer , die verschillende numerieke sleutelwaarden toewijst aan de verschillende waarden in elk van de kolommen en de volgende code toevoegt:

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

In de laatste stap van de gegevensvoorbereiding worden alle functiekolommen gecombineerd 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 het tarief 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, die een echte waarde is, voorspellen op basis van de andere factoren in de gegevensset. Hiervoor kiest u een regressie-machine learning-taak.

Voeg de machine learning-taak FastTreeRegressionTrainer toe aan de definities van de 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 methode Fit() wordt uw model getraind door de gegevensset te transformeren en de training toe te passen.

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

return model;

Het model evalueren

Evalueer vervolgens de prestaties van uw model met uw testgegevens voor kwaliteitsborging en validatie. Maak de Evaluate() methode, net na Train(), met de volgende code:

void Evaluate(MLContext mlContext, ITransformer model)
{

}

Met Evaluate de methode worden de volgende taken uitgevoerd:

  • Laadt de testgegevensset.
  • Hiermee maakt u de regressie-evaluator.
  • 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 een 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 de PredictionModel met behulp van de opgegeven gegevensset. Het retourneert een RegressionMetrics -object dat de algemene metrische gegevens bevat die zijn 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 Labels waarden 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 bij 1 ligt, 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:#.##}");

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)
{

}

Met TestSinglePrediction de methode worden de volgende taken uitgevoerd:

  • Hiermee maakt u één opmerking van testgegevens.
  • Voorspelt het tarief 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 om het tarief te voorspellen door de volgende code toe te voegen aan TestSinglePrediction():

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

De 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 een ObjectPool van PredictionEngine -objecten wordt gemaakt voor gebruik in uw toepassing. Raadpleeg deze handleiding over het gebruik PredictionEnginePool in een ASP.NET Core web-API.

Notitie

PredictionEnginePool de service-extensie is momenteel in preview.

In deze zelfstudie wordt gebruikgemaakt van één testrit binnen deze klasse. Later kunt u andere scenario's toevoegen om met het model te experimenteren. Voeg een reis toe om de voorspelling van de kosten van het getrainde model in de TestSinglePrediction() methode te testen door een exemplaar van te maken: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 één exemplaar van de taxiritgegevens en geeft u deze door aan de PredictionEngine door het volgende toe te voegen als de volgende coderegels in de TestSinglePrediction() methode:

var prediction = predictionFunction.Predict(taxiTripSample);

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

Als u het voorspelde tarief van de opgegeven rit 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 taxiritte voor uw testcase te zien.

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 zelfstudie heeft u het volgende geleerd:

  • 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 zelfstudie voor meer informatie.