Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez az oktatóanyag bemutatja, hogyan hozhat létre regressziós modellt ML.NET az árak előrejelzéséhez, különösen a New York-i taxidíjakhoz.
Ebben az oktatóanyagban a következőket sajátíthatja el:
- 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 kiértékelése
- A modell használata előrejelzésekhez
Előfeltételek
- A Visual Studio 2022 vagy újabb verziója telepítve van a .NET Desktop Development számítási feladattal.
Konzolalkalmazás létrehozása
Hozzon létre egy "TaxiFarePrediction" nevű C#- konzolalkalmazást .
Válassza a .NET 8-at 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 NuGet-csomagok kezelése lehetőséget. Válassza a "nuget.org" lehetőséget csomagforráské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 lehetőséget. Kattintson az OK gombra a Változá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 Adat mappába. Ezekkel az adatkészletekkel tanítjuk be a gépi tanulási modellt, majd kiértékeljük a modell pontosságát. Ezek az adatkészletek eredetileg az NYC TLC Taxi Trip adatkészletéből származnak.
A Megoldáskezelőben kattintson a jobb gombbal az egyes *.csv fájlokra, és válassza a Tulajdonságok lehetőséget. A Speciális területen módosítsa a Kimeneti könyvtárba másolás értékét Másolás, ha újabb.
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.
Ez label az az oszlop, amelyet előre szeretne jelezni. Az azonosított Featuresbemenetek, amelyeket a modellnek ad a modell 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 egy funkció.
- passenger_count: Az utazás során az utasok száma jellemző.
- trip_time_in_secs: Az utazás időtartama. Előre szeretné jelezni az utazás viteldíját az utazás befejezése előtt. 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 kifizetett 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őben kattintson a jobb gombbal a projektre, majd válassza azÚj elem>.
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. Ezután válassza a Hozzáadás lehetőséget.
Adja hozzá a következő
usingirá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, amely két osztályt TaxiTrip és TaxiTripFarePredictiona TaxiTrip.cs fájlt tartalmazza:
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 bemeneti adatosztály, és definíciókkal rendelkezik az adatkészlet egyes oszlopaihoz.
LoadColumnAttribute Az attribútummal megadhatja az adathalmaz forrásoszlopainak indexeit.
Az TaxiTripFarePrediction osztály az előrejelzett eredményeket jelöli. Egyetlen lebegőpontos szám mezője van, FareAmount, egy alkalmazott ScoreColumnNameAttribute attribútummal. Regressziós tevékenység esetén 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 irányelveket a Program.cs fájl elejéhez:
using Microsoft.ML;
using TaxiFarePrediction;
A modell mentéséhez három mezőt kell létrehoznia, hogy az adatkészletekkel rendelkező fájlok elérési útjait és a fájlt tárolja:
-
_trainDataPathA modell betanítása során használt adatkészlettel együtt tartalmazza a fájl elérési útját. -
_testDataPathA modell kiértékeléséhez használt adatkészlettel együtt tartalmazza a fájl elérési útját. -
_modelPatha 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 használat szakasz alatt 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.
- A modell betanítása.
- A modellt adja vissza.
A Train metódus betanozza 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 és 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: ',');
Mivel előre szeretné jelezni a taxiút viteldíját, az FareAmount oszlop az Label, amit meg kell jósolnia (a modell kimenete). Másolja az CopyColumnsEstimator átalakítási osztályt FareAmount, és adja hozzá a következő kódot:
var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName:"FareAmount")
A modellt betanító algoritmus numerikus funkciókat igényel, ezért a kategorikus adatokat (és VendorIdRateCode) számokká (PaymentTypeVendorIdEncodedRateCodeEncodedé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 hozzá 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ése New Yorkban. Első pillantásra úgy tűnhet, hogy egyszerűen a megtett távolságtól függ. A New York-i taxisok azonban különböző összegeket számolnak fel más tényezőkért, például a további utasokért, vagy készpénz helyett hitelkártyával fizetnek. Az adathalmaz egyéb tényezői alapján szeretné előrejelezni az árértéket, amely valós érték. Ehhez válasszon 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 úgy, hogy a következő kódsort adja hozzá a következő kódsorhoz Train():
.Append(mlContext.Regression.Trainers.FastTree());
A modell betanítása
Illesztse a modellt a betanításhoz dataview , és adja vissza a betanított modellt a következő kódsor hozzáadásával a Train() metódusban:
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ő kódsorával Train() :
return model;
A modell kiértékelése
Ezután értékelje ki a modell teljesítményét a minőségbiztosítási és érvényesítési tesztadatokkal. Hozza létre a metódust Evaluate() az után Train(), 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ós 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óddal:
Evaluate(mlContext, model);
Töltse be a tesztadatkészletet a LoadFromTextFile() metódussal. Értékelje ki a modellt ezzel az adatkészletgel minőség-ellenőrzésként a következő kód hozzáadásával a Evaluate metódusban:
IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(_testDataPath, hasHeader: true, separatorChar: ',');
Ezután alakítsa át az Test adatokat a következő kód Evaluate()hozzáadásával:
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 a metrikákat kell megjelenítenie. 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 csoporttal, a Evaluate() metódus kiértékeli a modellt, amely összehasonlítja az előrejelzett értékeket a tesztadatkészlet tényleges Labels értékeivel, é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 értéke 0 és 1 között van. 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 kié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:0.##}");
A modell használata előrejelzésekhez
Hozza létre a metódust TestSinglePrediction a metódus után Evaluate , 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 tesztadatokhoz.
- A tesztadatok alapján előrejelzi a viteldíj összegét.
- A jelentéskészítéshez használt tesztadatokat és előrejelzéseket egyesíti.
- 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óddal:
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 egyszerű API, amely lehetővé teszi az előrejelzés végrehajtását egyetlen adatpéldányon.
PredictionEngine nincs 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 egy ASP.NET Core Web API-ban.
Megjegyzés:
PredictionEnginePool A szolgáltatásbővítmény jelenleg előzetes verzióban érhető el.
Ez az oktatóanyag egy tesztkirándulást 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 a taxiút adatainak egyetlen példánya alapján előrejelezheti a viteldíjat, és adja át a PredictionEngine következő kódsorokat a TestSinglePrediction() metódushoz:
var prediction = predictionFunction.Predict(taxiTripSample);
A Predict() függvény egyetlen adatpéldányra készít előrejelzést.
A megadott utazás 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 taxi viteldíj megtekintéséhez.
Gratulálok! 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.
Következő 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 kiértékelése
- A modell használata előrejelzésekhez
További információért lépjen tovább a következő oktatóanyagra.