Dela via


Göra förutsägelser med en tränad modell

Lär dig hur du använder en tränad modell för att göra förutsägelser

Skapa datamodeller

Indata

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; }
}

Utdata

Precis som kolumnnamnen Features och Label indata har ML.NET standardnamn för de förutsagda värdekolumnerna som skapas av en modell. Beroende på aktiviteten kan namnet skilja sig åt.

Eftersom algoritmen som används i det här exemplet är en linjär regressionsalgoritm definieras standardnamnet för utdatakolumnen ScoreColumnName av attributet på PredictedPrice egenskapen.

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

Konfigurera en förutsägelsepipeline

Oavsett om du gör en enstaka förutsägelse eller batchförutsägelse måste förutsägelsepipelinen läsas in i programmet. Den här pipelinen innehåller både dataförbearbetningstransformeringar och den tränade modellen. Kodfragmentet nedan läser in förutsägelsepipelinen från en fil med namnet model.zip.

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

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

Enkel förutsägelse

Om du vill göra en enda förutsägelse skapar du en PredictionEngine med den inlästa förutsägelsepipelinen.

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

Predict Använd sedan metoden och skicka in dina indata som en parameter. Observera att metoden Predict inte kräver att indata är en IDataView). Det beror på att det på ett bekvämt sätt internaliserar manipuleringen av indatatypen så att du kan skicka in ett objekt av indatatypen. Eftersom CurrentPrice är det mål eller den etikett som du försöker förutsäga med hjälp av nya data antas det dessutom att det inte finns något värde för det just nu.

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

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

Om du har åtkomst till Score objektets prediction egenskap bör du få ett värde som liknar 150079.

Dricks

PredictionEngine är inte trådsäker. Dessutom måste du skapa en instans av den överallt där den behövs i ditt program. När programmet växer kan den här processen bli ohanterlig. För bättre prestanda och trådsäkerhet använder du en kombination av beroendeinmatning och tjänsten PredictionEnginePool , som skapar ett ObjectPool objekt PredictionEngine som ska användas i hela programmet.

Exempel på hur du använder tjänsten PredictionEnginePool finns i distribuera en modell till ett webb-API och distribuera en modell till Azure Functions.

Mer information finns i beroendeinmatning i ASP.NET Core .

Flera förutsägelser (IDataView)

Med hjälp av följande data läser du in dem i en IDataView. I det här fallet är namnet på IDataView .inputData Eftersom CurrentPrice är målet eller etiketten som du försöker förutsäga med nya data antas det att det inte finns något värde för det just nu.

// 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 }
    }
};

Transform Använd sedan metoden för att tillämpa datatransformeringar och generera förutsägelser.

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

Granska de förutsagda värdena med hjälp GetColumn av metoden.

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

De förutsagda värdena i poängkolumnen bör se ut så här:

Observation Förutsägelse
1 144638.2
2 150079.4
3 107789.8

Flera förutsägelser (PredictionEnginePool)

Om du vill göra flera förutsägelser med PredictionEnginePool kan du ta en IEnumerable som innehåller flera instanser av dina modellindata. Till exempel en IEnumerable<HousingInput> och tillämpa metoden på Predict varje element med linq-metoden Select .

Det här kodexemplet förutsätter att du har en PredictionEnginePool som heter predictionEnginePool och heter IEnumerable<HousingData>housingData.

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

Resultatet är en IEnumerable innehållande instanser av dina förutsägelser. I det här fallet är det IEnumerable<HousingPrediction>.