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
- A Visual Studio 2022-ben telepítve van a ".NET Desktop-fejlesztés" számítási feladat.
Konzolalkalmazás létrehozása
Hozzon létre egy "TaxiFarePrediction" nevű C#- konzolalkalmazást .
Válassza a .NET 6-ot a használni kívánt keretrendszerként. Kattintson a Létrehozás gombra.
Hozzon létre egy Data nevű könyvtárat a projektben az adatkészlet és a modellfájlok tárolásához.
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
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.
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.
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 Features
bemenetek, 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:
A Megoldáskezelő kattintson a jobb gombbal a projektre, majd válassza azÚj elemhozzáadása> lehetőséget.
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.
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 TaxiTripFarePrediction
van, 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, FareAmount
amelynek attribútuma Score
ColumnNameAttribute 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 FareAmount
ki 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
, RateCode
RateCodeEncoded
é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 ObjectPool
PredictionEngine
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 TaxiTrip
lé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.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: