Fare previsioni con un modello addestrato
Scopri come utilizzare un modello addestrato per fare previsioni.
Creare 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 ha nomi predefiniti per le colonne del valore stimato 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; }
}
Impostare una pipeline di previsione
Che si tratti di effettuare una predizione singola o batch, la pipeline di predizione deve essere caricata nell'applicazione. Questa pipeline contiene sia le trasformazioni di pre-elaborazione dei dati che il modello sottoposto a 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 un'unica previsione, creare un PredictionEngine
utilizzando la pipeline di previsione caricata.
// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(predictionPipeline);
Usare quindi il metodo Predict
e passare i dati di input come parametro. Si noti che utilizzando il metodo Predict
non è necessario che l'input sia un IDataView
. Ciò è dovuto al fatto che consente di internalizzare facilmente la manipolazione del tipo di dati di input in modo da poter passare un oggetto del tipo di dati di input. Inoltre, poiché CurrentPrice
è la destinazione o l'etichetta che si sta tentando di prevedere usando nuovi dati, si presume che al momento non vi sia 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 dovrebbe ottenere un valore simile a 150079
.
Consiglio
PredictionEngine
non è thread-safe. Inoltre, è necessario crearne un'istanza ovunque sia necessaria all'interno dell'applicazione. Man mano che l'applicazione cresce, questo processo può diventare non gestibile. Per migliorare le prestazioni e la thread safety, usare una combinazione di inserimento delle dipendenze e servizio PredictionEnginePool, che crea un ObjectPool
di oggetti PredictionEngine
da usare in tutta l'applicazione.
Per esempi su come usare il servizio PredictionEnginePool
Per altre informazioni, vedere inserimento delle dipendenze in ASP.NET Core.
Predizioni multiple (IDataView)
Dato i dati seguenti, caricarli in un IDataView
. In questo caso, il nome del IDataView
è inputData
. Poiché CurrentPrice
è la destinazione o l'etichetta che si sta tentando di prevedere usando nuovi dati, si presuppone che al momento non esista 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 }
}
};
Usare quindi il metodo Transform
per applicare le trasformazioni dei dati e generare stime.
// Predicted Data
IDataView predictions = predictionPipeline.Transform(inputData);
Esaminare i valori stimati usando il metodo GetColumn
.
// Get Predictions
float[] scoreColumn = predictions.GetColumn<float>("Score").ToArray();
I valori stimati nella colonna score devono essere simili ai valori seguenti:
Osservazione | Predizione |
---|---|
1 | 144638.2 |
2 | 150079.4 |
3 | 107789,8 |
Previsioni multiple (PredictionEnginePool)
Per fare più previsioni usando PredictionEnginePool, puoi prendere un IEnumerable
contenente più istanze dell'input del modello. Ad esempio, prendere un IEnumerable<HousingInput>
e applicare il metodo Predict
a ciascun elemento usando il metodo LINQ Select
.
Questo esempio di codice presuppone che sia presente un PredictionEnginePool
IEnumerable<HousingPrediction> predictions = housingData.Select(input => predictionEnginePool.Predict(input));
Il risultato è un IEnumerable
contenente istanze delle previsioni. In questo caso, sarebbe IEnumerable<HousingPrediction>
.