Realizar predicciones con un modelo entrenado

Obtenga información sobre cómo 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 de valores de predicción que genera un modelo. En función de la tarea, el nombre puede ser diferente.

Dado que el algoritmo utilizado en este ejemplo es un algoritmo de regresión lineal, el nombre predeterminado de la columna de salida es Score, que se define mediante el atributo ColumnName en la propiedad PredictedPrice.

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

Configuración de una canalización de predicción

Independientemente de si se crea una predicción única o por lotes, la canalización de predicción necesita cargarse en la aplicación. Esta canalización contiene las transformaciones del procesamiento previo de datos, así como el modelo entrenado. El siguiente fragmento de código carga la canalización de predicción desde un archivo denominado model.zip.

//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 la 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 un parámetro. Tenga en cuenta que el uso del método Predict no requiere que la entrada sea un IDataView). Esto se debe a que interioriza cómodamente la manipulación del tipo de datos de entrada para que pueda pasar un objeto del tipo de datos de entrada. Además, dado que CurrentPrice es el destino o la etiqueta que intenta predecir mediante datos nuevos, se asume que en este momento no hay ningún valor para este.

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

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

Si accede a la propiedad Score del objeto prediction, 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 para subprocesos, use una combinación de inserción de dependencias y el servicio PredictionEnginePool, que crea un elemento ObjectPool de objetos PredictionEngine para usarlo 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)

Dados los siguientes datos, cárguelos en un IDataView. En este caso, el nombre de la IDataView es inputData. Dado que CurrentPrice es el destino o la etiqueta que intenta predecir mediante datos nuevos, se asume que en este momento no hay ningún valor para este.

// 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, utilice el método Transform para aplicar las transformaciones de datos y generar predicciones.

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

Inspeccione los valores de predicción mediante el método GetColumn.

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

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

Observación Predicción
1 144638.2
2 150079.4
3 107789.8

Varias predicciones (PredictionEnginePool)

Para realizar varias predicciones mediante PredictionEnginePool, puede tomar una interfaz IEnumerable que contenga varias instancias de la entrada del modelo. Por ejemplo, IEnumerable<HousingInput> y aplique el método Predict a cada elemento mediante el método Select de LINQ.

En este ejemplo de código se da por supuesto que tiene una clase PredictionEnginePool denominada predictionEnginePool, y una IEnumerable<HousingData> denominada housingData.

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

El resultado es una interfaz IEnumerable que contiene instancia de las predicciones. En este caso, IEnumerable<HousingPrediction>.