Realización de predicciones con un modelo entrenado

Aprenda a usar un modelo entrenado para realizar predicciones.

Creación de modelos de datos

Datos de entrada

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; }
}

Datos de salida

Al igual que los nombres de las columnas de entrada Features y Label, ML.NET tiene nombres predeterminados para las columnas del valor predicho que produce un modelo. Los nombres pueden diferir en función de la tarea.

Dado que el algoritmo utilizado en esta muestra es un algoritmo de regresión lineal, el nombre predeterminado de la columna de salida es Score, que está definido por el atributo ColumnName en la propiedad PredictedPrice.

class HousingPrediction
{
    [ColumnName("Score")]
    public float PredictedPrice { get; set; }
}

Configura una canalización de predicción

Independientemente de realizar una predicción por lotes o única, la canalización de predicción debe cargarse en la aplicación. Esta canalización contiene las transformaciones de preprocesamiento de datos y el modelo entrenado. El siguiente fragmento de código carga la canalización de predicción desde un archivo denominado model.zip.

Importante

Cargue solo modelos de fuentes de confianza. La carga de modelos desde orígenes que no son de confianza es un riesgo de seguridad.

//Create MLContext
MLContext mlContext = new MLContext();

// Load Trained Model
DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = mlContext.Model.Load("model.zip", out predictionPipelineSchema);

Predicción única

Para realizar una sola predicción, cree un PredictionEngine mediante la canalización de predicción cargada.

// Create PredictionEngines
PredictionEngine<HousingData, HousingPrediction> predictionEngine = mlContext.Model.CreatePredictionEngine<HousingData, HousingPrediction>(predictionPipeline);

A continuación, utilice el método Predict y pase los datos de entrada como parámetro. Observe que el uso del Predict método no requiere que la entrada sea .IDataView Eso se debe a que internaliza convenientemente la manipulación del tipo de datos de entrada, de modo que puedes pasar un objeto del tipo de datos de entrada. Además, dado que CurrentPrice es la variable objetivo o la etiqueta que está intentando predecir a partir de nuevos datos, se asume que en este momento no tiene ningún valor asignado.

// Input Data
HousingData inputData = new HousingData
{
    Size = 900f,
    HistoricalPrices = new float[] { 155000f, 190000f, 220000f }
};

// Get Prediction
HousingPrediction prediction = predictionEngine.Predict(inputData);

Si tiene acceso a la Score propiedad del prediction objeto , debe obtener un valor similar a 150079.

Sugerencia

PredictionEngine no es seguro para subprocesos. Además, tiene que crear una instancia de ella en cualquier lugar en que se necesite dentro de la aplicación. A medida que crece la aplicación, este proceso puede volverse difícil de administrar. Para mejorar el rendimiento y la seguridad de los subprocesos, use una combinación de inserción de dependencias y el servicio PredictionEnginePool , que crea un ObjectPool de PredictionEngine objetos para su uso en toda la aplicación.

Para obtener ejemplos sobre cómo usar el servicio PredictionEnginePool, consulte Implementación de un modelo en una API web e implementación de un modelo en Azure Functions.

Para más información, consulte Inserción de dependencias en ASP.NET Core.

Varias predicciones (IDataView)

Con los siguientes datos, cárguelos en un IDataView. En este caso, el nombre de IDataView es inputData. Como CurrentPrice es la variable objetivo o la etiqueta que intenta predecir a partir de nuevos datos, se asume que en ese momento no tiene ningún valor.

// 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 }
    }
};

A continuación, use el Transform método para aplicar las transformaciones de datos y generar predicciones.

// Predicted Data
IDataView predictions = predictionPipeline.Transform(inputData);

Inspeccione los valores previstos mediante el GetColumn método .

// Get Predictions
float[] scoreColumn = predictions.GetColumn<float>("Score").ToArray();

Los valores previstos en la columna de puntuación deben ser similares a los siguientes:

Observación Prediction
1 144638,2
2 150079.4
3 107789.8

Varias predicciones (PredictionEnginePool)

Para realizar varias predicciones mediante PredictionEnginePool, puede usar un IEnumerable que contenga varias instancias de los datos de entrada del modelo. Por ejemplo, tome un IEnumerable<HousingInput> y aplique el método Predict a cada elemento usando el método Select de LINQ.

En este ejemplo de código se supone que tiene un elemento PredictionEnginePool llamado predictionEnginePool y un IEnumerable<HousingData> denominado housingData.

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

El resultado es un IEnumerable que contiene instancias de sus predicciones. En este caso, sería IEnumerable<HousingPrediction>.