Sdílet prostřednictvím


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

Vytvoření konzolové aplikace

  1. Vytvořte konzolovou aplikaci jazyka C# s názvem TaxiFarePrediction.

  2. Jako architekturu, která se má použít, zvolte .NET 8. Klikněte na tlačítko Vytvořit.

  3. Vytvořte adresář s názvem Data v projektu pro uložení datové sady a souborů modelu.

  4. 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čítko OK a pak v dialogovém okně Souhlas s licenčními podmínkami pro uvedené balíčky vyberte tlačítko Přijmout. Totéž proveďte u balíčku NuGet Microsoft.ML.FastTree.

Příprava a pochopení dat

  1. 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.

  2. 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ší.

  3. 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á Featuresjsou 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:

  1. V Průzkumníku řešeníklikněte pravým tlačítkem myši na projekt a potom vyberte Přidat>Novou položku.

  2. 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.

  3. 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 ScoreColumnNameAttribute. 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 FareAmounta 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, RateCodea PaymentType) na čísla (VendorIdEncoded, RateCodeEncodeda 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.