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 Score
ColumnName
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.
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>
.