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