Vytváření předpovědí pomocí natrénovaného modelu

Naučte se používat natrénovaný model k vytváření předpovědí.

Vytváření datových modelů

Vstupní data

public class HousingData
{
    [LoadColumn(0)]
    public float Size { get; set; }

    [LoadColumn(1, 3)]
    [VectorType(3)]
    public float[] HistoricalPrices { get; set; }

    [LoadColumn(4)]
    [ColumnName("Label")]
    public float CurrentPrice { get; set; }
}

Výstupní data

Stejně jako názvy vstupních FeaturesLabel sloupců má ML.NET výchozí názvy sloupců predikovaných hodnot vytvořených modelem. V závislosti na úkolu se název může lišit.

Vzhledem k tomu, že algoritmus použitý v této ukázce je lineární regresní algoritmus, výchozí název výstupního sloupce je Score definován atributem ColumnName vlastnosti PredictedPrice .

class HousingPrediction
{
    [ColumnName("Score")]
    public float PredictedPrice { get; set; }
}

Nastavení kanálu předpovědi

Ať už vytváříte jednu nebo dávkovou předpověď, musí se kanál předpovědi načíst do aplikace. Tento kanál obsahuje transformace předběžného zpracování dat i natrénovaný model. Následující fragment kódu načte kanál předpovědi ze souboru s názvem model.zip.

//Create MLContext
MLContext mlContext = new MLContext();

// Load Trained Model
DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = mlContext.Model.Load("model.zip", out predictionPipelineSchema);

Jedna předpověď

Pokud chcete vytvořit jednu předpověď, vytvořte PredictionEngine pomocí načteného kanálu předpovědi.

// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(predictionPipeline);

Pak použijte metodu Predict a předejte vstupní data jako parametr. Všimněte si, že použití Predict metody nevyžaduje vstup jako IDataView). Je to proto, že pohodlně interně interně zvládá manipulaci se vstupním datovým typem, abyste mohli předat objekt vstupního datového typu. Vzhledem k tomu, že CurrentPrice se jedná o cíl nebo popisek, který se pokoušíte předpovědět pomocí nových dat, předpokládá se, že v tuto chvíli neexistuje žádná hodnota.

// Input Data
HousingData inputData = new HousingData
{
    Size = 900f,
    HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
};

// Get Prediction
HousingPrediction prediction = predictionEngine.Predict(inputData);

Pokud přistupujete k Score vlastnosti objektu prediction , měli byste získat hodnotu podobnou 150079.

Tip

PredictionEngine není bezpečný pro přístup z více vláken. Kromě toho musíte vytvořit instanci všude, kde je potřeba v aplikaci. S rostoucím růstem aplikace se tento proces může stát nespravovatelným. Pro zvýšení výkonu a bezpečnosti vláken použijte kombinaci injektáže závislostí a služby PredictionEnginePool , která vytváří ObjectPoolPredictionEngine objekty pro použití v celé aplikaci.

Příklady použití služby PredictionEnginePool najdete v tématu Nasazení modelu do webového rozhraní API a nasazení modelu do azure Functions.

Další informace najdete v části injektáž závislostí v ASP.NET Core .

Více predikcí (IDataView)

Vzhledem k následujícím datům je načtěte do objektu IDataView. V tomto případě je název IDataViewinputData. Vzhledem k tomu CurrentPrice , že se jedná o cíl nebo popisek, který se pokoušíte předpovědět pomocí nových dat, předpokládá se, že v tuto chvíli neexistuje žádná hodnota.

// Actual data
HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 850f,
        HistoricalPrices = new float[] { 150000f, 175000f, 210000f }
    },
    new HousingData
    {
        Size = 900f,
        HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
    },
    new HousingData
    {
        Size = 550f,
        HistoricalPrices = new float[] { 99000f, 98000f, 130000f }
    }
};

Pak použijte metodu Transform k použití transformací dat a generování předpovědí.

// Predicted Data
IDataView predictions = predictionPipeline.Transform(inputData);

Pomocí metody zkontrolujte predikované hodnoty GetColumn .

// Get Predictions
float[] scoreColumn = predictions.GetColumn<float>("Score").ToArray();

Předpovězené hodnoty ve sloupci skóre by měly vypadat takto:

Pozorování Predikce
0 144638.2
2 150079.4
3 107789.8

Více predikcí (PredictionEnginePool)

Pokud chcete vytvořit více předpovědí pomocí PredictionEnginePool, můžete vzít IEnumerable obsahující více instancí vstupu modelu. Například IEnumerable<HousingInput> a použít metodu Predict pro každý prvek pomocí LINQ Select metody.

V této ukázce kódu se předpokládá, že máte název predictionEnginePool PredictionEnginePool a volána IEnumerable<HousingData>housingData.

IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));

Výsledkem je IEnumerable obsahující instance vašich předpovědí. V tomto případě by to bylo IEnumerable<HousingPrediction>.