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 creare un'istanza di essa 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 sicurezza dei thread, usare una combinazione di inserimento delle dipendenze e del servizio PredictionEnginePool , che crea un ObjectPool oggetto per PredictionEngine l'uso in tutta l'applicazione.

Per esempi su come usare il servizio PredictionEnginePool, vedere Distribuire un modello in un'API Web e distribuire un modello inFunzioni di Azure.

Per altre informazioni, vedere inserimento delle dipendenze in ASP.NET Core.

Più stime (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 Stima
1 144638.2
2 150079.4
3 107789.8

Stime multiple (PredictionEnginePool)

Per eseguire più stime usando PredictionEnginePool, è possibile accettare un IEnumerable oggetto contenente più istanze dell'input del modello. Ad esempio, un IEnumerable<HousingInput> oggetto e applicare il metodo a ogni elemento usando il Predict metodo LINQ Select .

Questo esempio di codice presuppone che sia presente un Oggetto PredictionEnginePool chiamato predictionEnginePool e un IEnumerable<HousingData> denominato housingData.

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

Il risultato è un IEnumerable oggetto contenente le istanze delle stime. In questo caso, sarebbe IEnumerable<HousingPrediction>.