Sdílet prostřednictvím


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í údaje

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 sloupců Features a Label má ML.NET výchozí názvy sloupců predikovaných hodnot vytvořených modelem. Názvy se můžou lišit v závislosti na úkolu.

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, který je definován atributem ColumnName ve 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 tré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ěď

Chcete-li vytvořit jednu předpověď, vytvořte PredictionEngine pomocí načteného predikčního pipeline.

// 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í metody Predict nevyžaduje, aby vstup byl IDataView. Je to proto, že pohodlně interně manipuluje se vstupním datovým typem, abyste mohli předat objekt tohoto datového typu. Vzhledem k tomu, že CurrentPrice je cíl nebo popisek, který se pokoušíte předpovědět pomocí nových dat, předpokládá se, že v současné 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 vlastnosti Score objektu prediction, měli byste získat hodnotu podobnou 150079.

Spropitné

PredictionEngine není vláknově bezpečný. 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žbu PredictionEnginePool, která vytvoří ObjectPool objektů PredictionEngine 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 služby Azure Functions.

Další informace naleznete v tématu Injektáž závislostí v ASP.NET Core.

Více predikcí (IDataView)

Vzhledem k následujícím datům je načtěte do IDataView. Název IDataView je v tomto případě inputData. Vzhledem k tomu, že CurrentPrice je cíl nebo popisek, který se pokoušíte předpovědět pomocí nových dat, předpokládá se, že pro něj v tuto chvíli není žá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 }
    }
};

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

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

Zkontrolujte predikované hodnoty pomocí metody GetColumn.

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

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

Pozorování Předpověď
1 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. Vezměte například IEnumerable<HousingInput> a použijte metodu Predict pro každý prvek pomocí metody LINQ Select.

Tento vzorový kód předpokládá, že máte PredictionEnginePool s názvem predictionEnginePool a IEnumerable<HousingData> s názvem housingData.

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

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