Kurz: Předpověď cen pomocí regrese s využitím ML.NET
Tento kurz ukazuje, jak vytvořit regresní model s využitím ML.NET k predikci cen, konkrétně jízdného taxislužby v New Yorku.
V tomto kurzu se naučíte:
- Příprava a pochopení dat
- Načtení a transformace dat
- Volba algoritmu učení
- Trénování modelu
- Vyhodnocení modelu
- Použití modelu pro předpovědi
Požadavky
- Visual Studio 2022 se sadou vývoj desktopových aplikací .NET.
Vytvoření konzolové aplikace
Vytvořte konzolovou aplikaci jazyka C# s názvem TaxiFarePrediction.
Jako architekturu, která se má použít, zvolte .NET 8. Klikněte na tlačítko Vytvořit.
Vytvořte adresář s názvem Data v projektu pro uložení datové sady a souborů modelu.
Nainstalujte balíček NuGet Microsoft.ML a Microsoft.ML.FastTree:
Poznámka
Tato ukázka používá nejnovější stabilní verzi uvedených balíčků NuGet, pokud není uvedeno jinak.
V Průzkumníku řešeníklikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet. Jako zdroj balíčku zvolte "nuget.org", vyberte kartu Procházet, vyhledejte Microsoft.ML, vyberte balíček v seznamu a vyberte Nainstalovat. V dialogovém okně
Náhled změn vyberte tlačítkoOK a pak v dialogovém okněSouhlas s licenčními podmínkami pro uvedené balíčky vyberte tlačítko . Totéž proveďte u balíčku NuGet Microsoft.ML.FastTree.Přijmout
Příprava a pochopení dat
Stáhněte si taxi-fare-train.csv a sady dat taxi-fare-test.csv a uložte je do složky Data, kterou jste vytvořili v předchozím kroku. Tyto datové sady používáme k trénování modelu strojového učení a následnému vyhodnocení, jak přesný je model. Tyto datové sady jsou původně ze sady dat NYC TLC Taxi Trip.
V průzkumníku řešení klikněte pravým tlačítkem myši na každý ze souborů *.csv a vyberte Vlastnosti. V části Upřesnitzměňte hodnotu Kopírovat do výstupního adresáře na Kopírovat, pokud je novější.
Otevřete sadu dat taxi-fare-train.csv a podívejte se na záhlaví sloupců v prvním řádku. Podívejte se na každý ze sloupců. Seznamte se s daty a rozhodněte se, které sloupce jsou funkce a který je label.
label
je sloupec, který chcete předpovědět. Identifikovaná Features
jsou vstupy, které modelu poskytnete k predikci Label
.
Zadaná datová sada obsahuje následující sloupce:
- vendor_id: ID dodavatele taxislužby je funkce.
- rate_code: Typ sazby jízdy taxíkem je vlastnost.
- passenger_count: Počet cestujících na cestě je atribut.
- trip_time_in_secs: Množství času, které cesta zabrala. Chcete předpovědět jízdné před dokončením jízdy. V tu chvíli nevíte, jak dlouho bude cesta trvat. Doba jízdy tedy není funkcí a tento sloupec z modelu vyloučíte.
- trip_distance: Vzdálenost cesty je funkce.
- payment_type: Způsob platby (hotovost nebo platební karta) je funkce.
- fare_amount: Celkové jízdné zaplacené je popisek.
Vytváření datových tříd
Vytvořte třídy pro vstupní data a předpovědi:
V Průzkumníku řešeníklikněte pravým tlačítkem myši na projekt a potom vyberte Přidat>Novou položku.
V dialogovém okně Přidat Novou Položku vyberte Třída a změňte pole Název na TaxiTrip.cs. Pak vyberte Přidat.
Do nového souboru přidejte následující direktivy
using
:using Microsoft.ML.Data;
Odeberte existující definici třídy a do souboru TaxiTrip.cs přidejte následující kód, který má dvě třídy TaxiTrip
a TaxiTripFarePrediction
:
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
je vstupní datová třída a má definice pro každý sloupec sady dat. Pomocí atributu LoadColumnAttribute určete indexy zdrojových sloupců v sadě dat.
Třída TaxiTripFarePrediction
představuje predikované výsledky. Má jedno plovoucí pole, FareAmount
, s použitým atributem Score
ColumnNameAttribute. V případě regresní úlohy obsahuje sloupec Score hodnoty předpovězených štítků.
Poznámka
Typ float
slouží k reprezentaci hodnot s pohyblivou řádovou čárkou v datových třídách pro vstup a predikci.
Definování cest k datům a modelům
Na začátek souboru Program.cs přidejte následující další direktivy using
:
using Microsoft.ML;
using TaxiFarePrediction;
Abyste mohli uložit model, musíte vytvořit tři pole pro uložení cest k souborům s datovými sadami a souborem:
-
_trainDataPath
obsahuje cestu k souboru s datovou sadou používanou k trénování modelu. -
_testDataPath
obsahuje cestu k souboru s datovou sadou použitou k vyhodnocení modelu. -
_modelPath
obsahuje cestu k souboru, kde je trénovaný model uložený.
Přidejte následující kód přímo pod oddíl usings k určení těchto cest a pro _textLoader
proměnnou:
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");
Všechny operace ML.NET se spouštějí ve třídě MLContext . Inicializace mlContext
vytvoří nové ML.NET prostředí, které lze sdílet mezi objekty pracovního postupu vytváření modelu. Je to podobné, koncepčně, DBContext
v Entity Frameworku.
Inicializujte proměnné
Nahraďte řádek Console.WriteLine("Hello World!")
následujícím kódem, který deklaruje a inicializuje proměnnou mlContext
:
MLContext mlContext = new MLContext(seed: 0);
Přidejte následující řádek kódu, který zavolá metodu Train
:
var model = Train(mlContext, _trainDataPath);
Metoda Train()
provádí následující úlohy:
- Načte data.
- Extrahuje a transformuje data.
- Trénuje model.
- Vrátí model.
Metoda Train
trénuje model. Pomocí následujícího kódu vytvořte následující metodu:
ITransformer Train(MLContext mlContext, string dataPath)
{
}
Načtení a transformace dat
ML.NET používá rozhraní IDataView jako flexibilní efektivní způsob popisu číselných nebo textových tabulkových dat.
IDataView
může načíst buď textové soubory, nebo data v reálném čase (například z databáze SQL či souborů protokolů). Jako první řádek metody Train()
přidejte následující kód:
IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(dataPath, hasHeader: true, separatorChar: ',');
Jakmile chcete předpovědět jízdné taxi, sloupec FareAmount
je hodnotou Label
, kterou budete predikovat (výstup modelu). Pomocí třídy transformace CopyColumnsEstimator
zkopírujte FareAmount
a přidejte následující kód:
var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName:"FareAmount")
Algoritmus, který trénuje model, vyžaduje číselné funkce, takže je nutné transformovat kategorická data (VendorId
, RateCode
a PaymentType
) na čísla (VendorIdEncoded
, RateCodeEncoded
a PaymentTypeEncoded
). K tomu použijte OneHotEncodingTransformer transformační třídu, která přiřadí různé číselné klíčové hodnoty různým hodnotám v jednotlivých sloupcích a přidá následující kód:
.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"))
Poslední krok přípravy dat kombinuje všechny sloupce funkcí do sloupce Features pomocí třídy transformace mlContext.Transforms.Concatenate
. Ve výchozím nastavení zpracovává algoritmus učení pouze funkce ze sloupce Funkce. Přidejte následující kód:
.Append(mlContext.Transforms.Concatenate("Features", "VendorIdEncoded", "RateCodeEncoded", "PassengerCount", "TripDistance", "PaymentTypeEncoded"))
Volba algoritmu učení
Tento problém se týká předpovědi jízdného taxíkem v New Yorku. Na první pohled se může zdát, že závisí jednoduše na cestované vzdálenosti. Dodavatelé taxislužby v New Yorku však účtují různé částky za jiné faktory, jako jsou další cestující nebo platby platební kartou místo hotovosti. Chcete předpovědět cenovou hodnotu, což je skutečná hodnota na základě dalších faktorů v datové sadě. Uděláte to tak, že zvolíte úlohu strojového učení typu regrese.
Přidejte úlohu strojového učení FastTreeRegressionTrainer k definicím transformace dat přidáním dalšího řádku kódu v Train()
.
.Append(mlContext.Regression.Trainers.FastTree());
Trénování modelu
Přizpůsobit model trénovacímu dataview
a vrátit trénovaný model přidáním následujícího řádku kódu do metody Train()
:
var model = pipeline.Fit(dataView);
Metoda Fit() trénuje váš model transformací datové sady a prováděním tréninkového procesu.
Vraťte natrénovaný model s následujícím řádkem kódu v metodě Train()
:
return model;
Vyhodnocení modelu
V dalším kroku vyhodnoťte výkon modelu pomocí testovacích dat pro zajištění kvality a ověření. Vytvořte metodu Evaluate()
hned po Train()
s následujícím kódem:
void Evaluate(MLContext mlContext, ITransformer model)
{
}
Metoda Evaluate
provádí následující úlohy:
- Načte testovací datovou sadu.
- Vytvoří regresní vyhodnocovač.
- Vyhodnotí model a vytvoří metriky.
- Zobrazí metriky.
Přidejte volání nové metody přímo pod volání metody Train
pomocí následujícího kódu:
Evaluate(mlContext, model);
Načtěte testovací datovou sadu pomocí metody LoadFromTextFile(). Vyhodnoťte model pomocí této datové sady jako kontrolu kvality přidáním následujícího kódu do metody Evaluate
:
IDataView dataView = mlContext.Data.LoadFromTextFile<TaxiTrip>(_testDataPath, hasHeader: true, separatorChar: ',');
Dále transformujte data Test
přidáním následujícího kódu do Evaluate()
:
var predictions = model.Transform(dataView);
Metoda Transform() vytváří předpovědi vstupních řádků testovací datové sady.
Metoda RegressionContext.Evaluate
vypočítá metriky kvality pro PredictionModel
pomocí zadané datové sady. Vrátí objekt RegressionMetrics, který obsahuje celkové metriky vypočítané regresními vyhodnocovači.
Pokud chcete tyto údaje zobrazit, abyste zjistili kvalitu modelu, musíte nejprve získat metriky. Do metody Evaluate
přidejte následující kód jako další řádek:
var metrics = mlContext.Regression.Evaluate(predictions, "Label", "Score");
Jakmile máte sadu predikcí, metoda Evaluate() vyhodnotí model, který porovná predikované hodnoty se skutečnými Labels
v testovací datové sadě a vrátí metriky o výkonu modelu.
Přidejte následující kód, který vyhodnotí model a vytvoří metriky vyhodnocení:
Console.WriteLine();
Console.WriteLine($"*************************************************");
Console.WriteLine($"* Model quality metrics evaluation ");
Console.WriteLine($"*------------------------------------------------");
RSquared je další metrika vyhodnocení regresních modelů. RSquared přebírá hodnoty mezi 0 a 1. Čím blíže je jeho hodnota 1, tím lepší je model. Do metody Evaluate
přidejte následující kód, který zobrazí hodnotu RSquared:
Console.WriteLine($"* RSquared Score: {metrics.RSquared:0.##}");
RMS je jednou z metrik vyhodnocení regresního modelu. Čím nižší je, tím lepší je model. Do metody Evaluate
přidejte následující kód, který zobrazí hodnotu RMS:
Console.WriteLine($"* Root Mean Squared Error: {metrics.RootMeanSquaredError:0.##}");
Použití modelu pro předpovědi
Pomocí následujícího kódu vytvořte metodu TestSinglePrediction
hned za metodou Evaluate
:
void TestSinglePrediction(MLContext mlContext, ITransformer model)
{
}
Metoda TestSinglePrediction
provádí následující úlohy:
- Vytvoří jeden komentář testovacích dat.
- Predikuje množství jízdného na základě testovacích dat.
- Kombinuje testovací data a předpovědi pro reportování.
- Zobrazí predikované výsledky.
Přidejte volání nové metody přímo pod volání metody Evaluate
pomocí následujícího kódu:
TestSinglePrediction(mlContext, model);
Pomocí PredictionEngine
můžete předpovědět jízdné přidáním následujícího kódu do TestSinglePrediction()
:
var predictionFunction = mlContext.Model.CreatePredictionEngine<TaxiTrip, TaxiTripFarePrediction>(model);
PredictionEngine je pohodlné rozhraní API, které umožňuje provádět predikci pro jednu instanci dat.
PredictionEngine
není bezpečná pro přístup z více vláken. Je přijatelné použít v jednovláknovém nebo prototypovém prostředí. Pokud chcete zvýšit výkon a bezpečnost vláken v produkčních prostředích, použijte službu PredictionEnginePool
, která vytvoří ObjectPool
objektů PredictionEngine
pro použití v celé aplikaci. V této příručce se dozvíte, jak používat PredictionEnginePool
vwebového rozhraní API ASP.NET Core .
Poznámka
rozšíření služby PredictionEnginePool
je aktuálně ve verzi Preview.
Tento kurz používá jednu testovací cestu v rámci této třídy. Později můžete k experimentování s modelem přidat další scénáře. Přidejte cestu k otestování předpovědi nákladů na trénovaný model v metodě TestSinglePrediction()
vytvořením instance 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
};
Dále předpovědět jízdné na základě jedné instance dat o jízdě taxíkem a předat je do PredictionEngine
tak, že do metody TestSinglePrediction()
přidáte následující řádky kódu:
var prediction = predictionFunction.Predict(taxiTripSample);
Funkce Predict() vytvoří předpověď na jednu instanci dat.
Pokud chcete zobrazit predikované jízdné zadané cesty, přidejte do metody TestSinglePrediction
následující kód:
Console.WriteLine($"**********************************************************************");
Console.WriteLine($"Predicted fare: {prediction.FareAmount:0.####}, actual fare: 15.5");
Console.WriteLine($"**********************************************************************");
Spuštěním programu zobrazíte predikovanou jízdu taxíkem pro váš testovací případ.
Blahopřejeme! Teď jste úspěšně vytvořili model strojového učení pro predikci jízdného taxíkem, vyhodnotili jeho přesnost a použili ho k předpovědím. Zdrojový kód pro tento kurz najdete v úložišti dotnet/samples GitHubu.
Další kroky
V tomto kurzu jste se naučili:
- Příprava a pochopení dat
- Vytvoření výukového kanálu
- Načtení a transformace dat
- Volba algoritmu učení
- Trénování modelu
- Vyhodnocení modelu
- Použití modelu pro předpovědi
Další informace najdete v dalším kurzu.