Прогнозирование с помощью обученной модели

Сведения об использовании обученной модели для прогнозирования

Создание моделей данных

Входные данные

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

Выходные данные

Как в случае с именами входных столбцов Features и Label, ML.NET использует имена по умолчанию для столбцов прогнозируемых значений, создаваемых моделью. Имя может отличаться в зависимости от задачи.

Так как в этом примере используется алгоритм линейной регрессии, имя по умолчанию выходного столбца имеет значение Score, которое определяется атрибутом ColumnName в свойстве PredictedPrice.

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

Настройка конвейера прогнозирования

Выполняется ли отдельный или пакетный прогноз, конвейер прогнозирования нужно загрузить в приложение. Этот конвейер содержит как преобразования для предварительной обработки данных, так и обученную модель. Приведенный ниже фрагмент кода загружает конвейер прогнозирования из файла с именем model.zip.

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

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

Отдельный прогноз

Чтобы создать отдельный прогноз, создайте PredictionEngine с помощью загруженного конвейера прогнозирования.

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

Затем с помощью метода Predict передайте входные данные как параметр. Обратите внимание, что для использования метода Predict не нужно, чтобы входные данные были IDataView. Это обусловлено тем, что он беспрепятственно осуществляет внутреннюю обработку типов входных данных, чтобы вы могли передать объект типа входных данных. Кроме того, так как CurrentPrice является целью или меткой, которую вы пытаетесь спрогнозировать с помощью новых данных, предполагается, что на данный момент значения для него нет.

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

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

При обращении к свойству Score объекта prediction вы должны получить значение, аналогичное 150079.

Совет

PredictionEngine не является потокобезопасным. Кроме того, необходимо создать его экземпляр везде, где он понадобится в вашем приложении. По мере увеличения размера приложения этот процесс может стать неуправляемым. Для улучшенной производительности и потокобезопасности используйте сочетание внедрения зависимостей и службы PredictionEnginePool, которое создает ObjectPool объектов PredictionEngine для использования во всем приложении.

Примеры использования службы PredictionEnginePool см. в статьях о развертывании модели в веб-API и Функциях Azure.

См . дополнительные сведения о внедрении зависимостей в ASP.NET Core.

Множественное прогнозирование (IDataView)

Получив следующие данные, загрузите их в IDataView. В этом случае имя IDataView — inputData. Так как CurrentPrice является целью или меткой, которую вы пытаетесь спрогнозировать с помощью новых данных, предполагается, что на данный момент значения для него нет.

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

Затем воспользуйтесь методом Transform, чтобы применить преобразования данных и сформировать прогнозы.

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

Проверьте прогнозируемые значения с помощью метода GetColumn.

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

Прогнозируемые значения в столбце оценки должны выглядеть следующим образом:

Наблюдение Прогнозирование
1 144 638,2
2 150 079,4
3 107 789,8

Множественное прогнозирование (PredictionEnginePool)

Для получения нескольких прогнозов с помощью PredictionEnginePool, вы можете использовать IEnumerable с несколькими экземплярами входных данных модели. Например, укажите IEnumerable<HousingInput> и примените метод Predict к каждому элементу с помощью метода Select LINQ.

В этом примере кода предполагается, что вы у вас есть PredictionEnginePool с именем predictionEnginePool и IEnumerable<HousingData> с именем housingData.

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

В результате вы получите IEnumerable с экземплярами своих прогнозов. В данном случае это число IEnumerable<HousingPrediction>.