Oktatóanyag: Árak előrejelzése regresszióval ML.NET

Ez az oktatóanyag bemutatja, hogyan hozhat létre regressziós modellt a ML.NET használatával az árak előrejelzéséhez, különösen a New York-i taxiárak előrejelzéséhez.

Eben az oktatóanyagban az alábbiakkal fog megismerkedni:

  • Az adatok előkészítése és értelmezése
  • Adatok betöltése és átalakítása
  • Tanulási algoritmus kiválasztása
  • A modell betanítása
  • A modell értékelése
  • A modell használata előrejelzésekhez

Előfeltételek

Konzolalkalmazás létrehozása

  1. Hozzon létre egy "TaxiFarePrediction" nevű C#- konzolalkalmazást .

  2. Válassza a .NET 6-ot a használni kívánt keretrendszerként. Kattintson a Létrehozás gombra.

  3. Hozzon létre egy Data nevű könyvtárat a projektben az adatkészlet és a modellfájlok tárolásához.

  4. Telepítse a Microsoft.ML és a Microsoft.ML.FastTree NuGet-csomagot:

    Megjegyzés

    Ez a minta az említett NuGet-csomagok legújabb stabil verzióját használja, hacsak másként nem rendelkezik.

    A Megoldáskezelő kattintson a jobb gombbal a projektre, és válassza a Manage NuGet Packages (NuGet-csomagok kezelése) lehetőséget. Válassza a "nuget.org" lehetőséget a Csomag forrásaként, válassza a Tallózás lapot, keresse meg a Microsoft.ML, jelölje ki a csomagot a listában, és válassza a Telepítés gombot. Válassza az OK gombot a Módosítások előnézete párbeszédpanelen, majd válassza az Elfogadom gombot a Licenc elfogadása párbeszédpanelen, ha elfogadja a felsorolt csomagok licencfeltételét. Tegye ugyanezt a Microsoft.ML.FastTree NuGet-csomag esetében is.

Az adatok előkészítése és értelmezése

  1. Töltse le a taxi-fare-train.csv és a taxi-fare-test.csv adatkészleteket, és mentse őket az előző lépésben létrehozott Adatok mappába. Ezekkel az adatkészletekkel tanítjuk be a gépi tanulási modellt, majd kiértékeljük, hogy mennyire pontos a modell. Ezek az adatkészletek eredetileg a NYC TLC Taxi Trip adatkészletből származnak.

  2. A Megoldáskezelő kattintson a jobb gombbal az egyes *.csv fájlokra, és válassza a Tulajdonságok parancsot. A Speciális területen módosítsa a Másolás kimeneti könyvtárra értékét Másolás, ha újabb értékre.

  3. Nyissa meg a taxi-fare-train.csv adatkészletet, és tekintse meg az oszlopfejléceket az első sorban. Tekintse meg az egyes oszlopokat. Ismerje meg az adatokat, és döntse el, hogy mely oszlopok jellemzők , és melyik a címke.

Az label az oszlop, amelyet előre szeretne jelezni. Az azonosított Featuresbemenetek, amelyeket a modellnek ad a előrejelzéséhez Label.

A megadott adatkészlet a következő oszlopokat tartalmazza:

  • vendor_id: A taxiszolgáltató azonosítója egy funkció.
  • rate_code: A taxiút díjtípusa funkció.
  • passenger_count: Az utazás során az utasok száma egy funkció.
  • trip_time_in_secs: Az utazás időtartama. Az utazás befejezése előtt előre szeretné jelezni az utazás viteldíját. Abban a pillanatban nem tudod, mennyi ideig tart az út. Így az utazási idő nem funkció, és ezt az oszlopot ki fogja zárni a modellből.
  • trip_distance: Az utazás távolsága funkció.
  • payment_type: A fizetési mód (készpénz vagy hitelkártya) egy funkció.
  • fare_amount: A teljes taxi viteldíj a címke.

Adatosztályok létrehozása

Hozzon létre osztályokat a bemeneti adatokhoz és az előrejelzésekhez:

  1. A Megoldáskezelő kattintson a jobb gombbal a projektre, majd válassza azÚj elemhozzáadása> lehetőséget.

  2. Az Új elem hozzáadása párbeszédpanelen válassza az Osztály lehetőséget, és módosítsa a Név mezőt TaxiTrip.cs névre. Ezután válassza a Hozzáadás gombot.

  3. Adja hozzá a következő using irányelveket az új fájlhoz:

    using Microsoft.ML.Data;
    

Távolítsa el a meglévő osztálydefiníciót, és adja hozzá a következő kódot, amelynek két osztálya TaxiTrip és TaxiTripFarePredictionvan, a TaxiTrip.cs fájlhoz:

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 A a bemeneti adatosztály, és definíciókkal rendelkezik az adatkészlet egyes oszlopaihoz. LoadColumnAttribute Az attribútummal adhatja meg az adathalmaz forrásoszlopainak indexeit.

Az TaxiTripFarePrediction osztály az előrejelzett eredményeket jelöli. Egyetlen lebegőpontos mezővel rendelkezik, FareAmountamelynek attribútuma ScoreColumnNameAttribute van alkalmazva. A regressziós feladat esetében a Pontszám oszlop előrejelzett címkeértékeket tartalmaz.

Megjegyzés

A típussal float lebegőpontos értékeket jelölhet a bemeneti és előrejelzési adatosztályokban.

Adat- és modellútvonalak definiálása

Adja hozzá a következő további using utasításokat a Program.cs fájl elejéhez:

using Microsoft.ML;
using TaxiFarePrediction;

Három mezőt kell létrehoznia az adatkészleteket tartalmazó fájlok elérési útjának és a modell mentéséhez szükséges fájlnak a tárolásához:

  • _trainDataPath A tartalmazza a fájl elérési útját a modell betanítása során használt adatkészlettel.
  • _testDataPath A tartalmazza a fájl elérési útját a modell kiértékeléséhez használt adatkészlettel.
  • _modelPath a betanított modell tárolására szolgáló fájl elérési útját tartalmazza.

Adja hozzá a következő kódot közvetlenül a usings szakasz alá az elérési utak és a _textLoader változó megadásához:

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

Minden ML.NET művelet az MLContext osztályban kezdődik. Az inicializálás mlContext új ML.NET környezetet hoz létre, amely megosztható a modelllétrehozás munkafolyamat-objektumai között. Ez fogalmilag hasonló az Entity Frameworkhez DBContext .

Változók inicializálása

Cserélje le a Console.WriteLine("Hello World!") sort a következő kódra a változó deklarálásához és inicializálásához mlContext :

MLContext mlContext = new MLContext(seed: 0);

Adja hozzá a következő kódsort a Train metódus meghívásához:

var model = Train(mlContext, _trainDataPath);

A Train() metódus a következő feladatokat hajtja végre:

  • Betölti az adatokat.
  • Kinyeri és átalakítja az adatokat.
  • Betanítása a modellnek.
  • A modellt adja vissza.

A Train metódus betanítása a modellt. Hozza létre ezt a metódust az alábbi kóddal:

ITransformer Train(MLContext mlContext, string dataPath)
{

}

Adatok betöltése és átalakítása

ML.NET az IDataView felületet használja a numerikus vagy szöveges táblázatos adatok rugalmas, hatékony leírására. IDataView betölthet szöveges fájlokat vagy valós időben (például SQL-adatbázist vagy naplófájlokat). Adja hozzá a következő kódot a Train() metódus első soraként:

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

Ahogy előre szeretné jelezni a taxiút viteldíját, az FareAmount oszlop az Label , amelyet előre fog jelezni (a modell kimenete). CopyColumnsEstimator Az átalakítási osztály használatával másolja FareAmountki a fájlt, és adja hozzá a következő kódot:

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

A modellt betanító algoritmus numerikus jellemzőket igényel, ezért a kategorikus adatokat (, és PaymentType) számokkáVendorIdEncoded (VendorId, RateCodeRateCodeEncodedés PaymentTypeEncoded) kell átalakítani. Ehhez használja a OneHotEncodingTransformer átalakítási osztályt , amely különböző numerikus kulcsértékeket rendel az egyes oszlopok különböző értékeihez, és adja hozzá a következő kódot:

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

Az adatelőkészítés utolsó lépése az összes funkcióoszlopot egyesíti a Szolgáltatások oszlopban az mlContext.Transforms.Concatenate átalakítási osztály használatával. Alapértelmezés szerint a tanulási algoritmus csak a Szolgáltatások oszlopban szereplő funkciókat dolgozza fel. Adja hozzá a következő kódot:

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

Tanulási algoritmus kiválasztása

Ez a probléma a taxiút viteldíjának előrejelzéséről szól New York city-ben. Első pillantásra úgy tűnhet, hogy egyszerűen a megtett távolságtól függ. A New York-i taxigyártók azonban eltérő összegeket számolnak fel más tényezőkért, például további utasokért, vagy készpénz helyett hitelkártyával fizetnek. Az adathalmaz többi tényezője alapján szeretné előrejelezni az árértéket, amely egy valós érték. Ehhez válasszon ki egy regressziós gépi tanulási feladatot.

Fűzze hozzá a FastTreeRegressionTrainer gépi tanulási feladatot az adatátalakítási definíciókhoz. Ehhez adja hozzá a következő kódot a következő kódsorként:Train()

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

A modell betanítása

Illesztse be a modellt a betanításhoz dataview , és adja vissza a betanított modellt a metódus következő Train() kódsorának hozzáadásával:

var model = pipeline.Fit(dataView);

A Fit() metódus az adathalmaz átalakításával és a betanítás alkalmazásával tanítja be a modellt.

Adja vissza a betanított modellt a metódus következő Train() kódsorával:

return model;

A modell értékelése

Ezután értékelje ki a modell teljesítményét a minőségbiztosítási és ellenőrzési tesztadatokkal. Hozza létre a metódust Evaluate() közvetlenül Train()utána a következő kóddal:

void Evaluate(MLContext mlContext, ITransformer model)
{

}

A Evaluate metódus a következő feladatokat hajtja végre:

  • Betölti a tesztadatkészletet.
  • Létrehozza a regresszió-kiértékelőt.
  • Kiértékeli a modellt, és metrikákat hoz létre.
  • Megjeleníti a metrikákat.

Adjon hozzá egy hívást az új metódushoz közvetlenül a Train metódushívás alatt, a következő kód használatával:

Evaluate(mlContext, model);

Töltse be a tesztadatkészletet a LoadFromTextFile() metódussal. Értékelje ki a modellt ezzel az adathalmazsal minőség-ellenőrzésként, ha hozzáadja a következő kódot a Evaluate metódushoz:

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

Ezután alakítsa át az Test adatokat úgy, hogy hozzáadja a következő kódot a következőhöz Evaluate():

var predictions = model.Transform(dataView);

A Transform() metódus előrejelzéseket készít a tesztadatkészlet bemeneti soraihoz.

A RegressionContext.Evaluate metódus kiszámítja a megadott adatkészlethez tartozó PredictionModel minőségi metrikákat. Egy objektumot RegressionMetrics ad vissza, amely a regresszió kiértékelői által kiszámított általános metrikákat tartalmazza.

A modell minőségének meghatározásához először le kell szereznie a metrikákat. Adja hozzá a következő kódot a metódus következő soraként Evaluate :

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

Miután elkészült az előrejelzési készlettel, az Evaluate() metódus kiértékeli a modellt, amely összehasonlítja az előrejelzett értékeket a tesztadatkészlet tényleges Labels értékével, és metrikákat ad vissza a modell teljesítményéről.

Adja hozzá a következő kódot a modell kiértékeléséhez és a kiértékelési metrikák létrehozásához:

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

Az RSquared a regressziós modellek másik értékelési metrikája. Az RSquared 0 és 1 közötti értékeket vesz fel. Minél közelebb van az értéke az 1-hez, annál jobb a modell. Adja hozzá a következő kódot a metódushoz az Evaluate RSquared érték megjelenítéséhez:

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

Az RMS a regressziós modell egyik értékelési metrikája. Minél alacsonyabb, annál jobb a modell. Adja hozzá a következő kódot a metódushoz az Evaluate RMS-érték megjelenítéséhez:

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

A modell használata előrejelzésekhez

Hozza létre a metódust TestSinglePrediction közvetlenül a Evaluate metódus után a következő kóddal:

void TestSinglePrediction(MLContext mlContext, ITransformer model)
{

}

A TestSinglePrediction metódus a következő feladatokat hajtja végre:

  • Egyetlen megjegyzést hoz létre a tesztadatokról.
  • A tesztadatok alapján előrejelzi a viteldíj összegét.
  • A tesztelési adatokat és a jelentéskészítési előrejelzéseket kombinálja.
  • Megjeleníti az előrejelzett eredményeket.

Adjon hozzá egy hívást az új metódushoz közvetlenül a Evaluate metódushívás alatt, a következő kód használatával:

TestSinglePrediction(mlContext, model);

PredictionEngine A viteldíj előrejelzéséhez adja hozzá a következő kódot a következőhözTestSinglePrediction():

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

A PredictionEngine egy kényelmi API, amely lehetővé teszi, hogy egyetlen adatpéldányon végezzen előrejelzést. PredictionEngine nem szálbiztos. Egyszálas vagy prototípusos környezetben is használható. Az éles környezetekben a jobb teljesítmény és a szálbiztonság érdekében használja a PredictionEnginePool szolgáltatást, amely objektumokat hoz létre ObjectPoolPredictionEngine az alkalmazás teljes területén való használatra. Ebből az útmutatóból megtudhatja, hogyan használható PredictionEnginePool ASP.NET Core webes API-ban.

Megjegyzés

PredictionEnginePool A szolgáltatásbővítmény jelenleg előzetes verzióban érhető el.

Ez az oktatóanyag egyetlen tesztutat használ ebben az osztályban. Később további forgatókönyveket is hozzáadhat a modell kipróbálásához. Adjon hozzá egy utat a betanított modell költség-előrejelzésének teszteléséhez a metódusban a TestSinglePrediction() következő példány TaxiTriplétrehozásával:

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
};

Ezután előrejelezheti a viteldíjat a taxiút adatainak egyetlen példánya alapján, és adja át a PredictionEngine metódus következő kódsoraiként a következőt TestSinglePrediction() :

var prediction = predictionFunction.Predict(taxiTripSample);

A Predict() függvény egyetlen adatpéldányra készít előrejelzést.

A megadott út előrejelzett viteldíjának megjelenítéséhez adja hozzá a következő kódot a TestSinglePrediction metódushoz:

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

Futtassa a programot a tesztesethez előrejelzett taxidíj megtekintéséhez.

Gratulálunk! Most sikeresen létrehozott egy gépi tanulási modellt a taxiút-viteldíjak előrejelzéséhez, a pontosságának kiértékeléséhez és az előrejelzések készítéséhez. Az oktatóanyag forráskódját a dotnet/samples GitHub-adattárban találja.

További lépések

Ez az oktatóanyag bemutatta, hogyan végezheti el az alábbi műveleteket:

  • Az adatok előkészítése és értelmezése
  • Tanulási folyamat létrehozása
  • Adatok betöltése és átalakítása
  • Tanulási algoritmus kiválasztása
  • A modell betanítása
  • A modell értékelése
  • A modell használata előrejelzésekhez

További információért lépjen tovább a következő oktatóanyagra.