Effettuare previsioni con un modello con training
Informazioni su come usare un modello con training per effettuare previsioni
Creare i modelli di dati
Dati di input
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; }
}
Dati di output
Analogamente ai nomi delle colonne di input Features
e Label
, ML.NET include nomi predefiniti per le colonne di valori previsti prodotte da un modello. I nomi possono variare a seconda dell'attività.
Poiché l'algoritmo usato in questo esempio è un algoritmo di regressione lineare, il nome predefinito della colonna di output è Score
definito dall'attributo ColumnName
nella proprietà PredictedPrice
.
class HousingPrediction
{
[ColumnName("Score")]
public float PredictedPrice { get; set; }
}
Configurare una pipeline di previsione
Per effettuare previsioni in batch o singole, è necessario caricare la pipeline di previsione nell'applicazione. La pipeline contiene le trasformazioni di pre-elaborazione dei dati e il modello con training. Il frammento di codice seguente carica la pipeline di previsione da un file denominato model.zip
.
//Create MLContext
MLContext mlContext = new MLContext();
// Load Trained Model
DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = mlContext.Model.Load("model.zip", out predictionPipelineSchema);
Previsione singola
Per effettuare una previsione singola, creare una classe PredictionEngine
usando la pipeline di previsione caricata.
// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(predictionPipeline);
Quindi usare il metodo Predict
e passare i dati di input come parametro. Si noti che per usare il metodo Predict
non è necessario che l'input sia IDataView
. Poiché il metodo acquisisce la modifica del tipo di dati dell'input, è possibile passare un oggetto del tipo di dati dell'input. Inoltre, poiché CurrentPrice
è la destinazione o etichetta per cui si tenta di effettuare la previsione usando i nuovi dati, si presuppone che non includa ancora alcun valore.
// Input Data
HousingData inputData = new HousingData
{
Size = 900f,
HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
};
// Get Prediction
HousingPrediction prediction = predictionEngine.Predict(inputData);
Se si accede alla proprietà Score
dell'oggetto prediction
, si otterrà un valore simile a 150079
.
Suggerimento
PredictionEngine
non è thread-safe. Inoltre, è necessario crearne un'istanza ovunque sia necessaria all'interno dell'applicazione. Man mano che l'applicazione cresce, la gestione di questo processo può rivelarsi difficile. Per migliorare le prestazioni e la thread safety, usare una combinazione di inserimento delle dipendenze e il servizio PredictionEnginePool, che crea un ObjectPool
di oggetti PredictionEngine
da usare in tutta l'applicazione.
Per consultare esempi su come usare il servizio PredictionEnginePool, vedere distribuire un modello in un'API Web e distribuire un modello in Funzioni di Azure.
Per altre informazioni, vedere Inserimento di dipendenze in ASP.NET Core.
Stime multiple (IDataView)
Caricare i dati seguenti in IDataView
. In questo caso, il nome di IDataView
è inputData
. Poiché CurrentPrice
è la destinazione o etichetta per cui si tenta di effettuare la previsione usando i nuovi dati, si presuppone che non includa ancora alcun valore.
// 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 }
}
};
Quindi usare il metodo Transform
per applicare le trasformazioni di dati e generare le previsioni.
// Predicted Data
IDataView predictions = predictionPipeline.Transform(inputData);
Esaminare i valori previsti usando il metodo GetColumn
.
// Get Predictions
float[] scoreColumn = predictions.GetColumn<float>("Score").ToArray();
I valori previsti nella colonna di punteggio dovrebbero essere simili ai seguenti:
Osservazione | Previsione |
---|---|
1 | 144638.2 |
2 | 150079.4 |
3 | 107789.8 |
Stime multiple (PredictionEnginePool)
Per eseguire stime multiple usando PredictionEnginePool, è possibile accettare un oggetto IEnumerable
contenente più istanze dell'input del modello. Ad esempio, un oggetto IEnumerable<HousingInput>
e applicare il metodo Predict
a ogni elemento usando il metodo Select
di LINQ.
Questo esempio di codice presuppone che sia presente un PredictionEnginePool denominato predictionEnginePool
e un IEnumerable<HousingData>
denominato housingData
.
IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));
Il risultato è un IEnumerable
contenente le istanze delle stime. In questo caso, sarebbe IEnumerable<HousingPrediction>
.