Исключение в PredictionEngineBase при использовании модели временных рядов с PredictionEnginePool (ML.NET) - PullRequest
0 голосов
/ 06 ноября 2019

Я создал модель временного ряда, используя метод, описанный здесь , в результате чего получается следующий код:

var data = items.ToArray();
var trainData = mlContext.Data.LoadFromEnumerable(data);

var estimator = mlContext.Forecasting.ForecastBySsa(
    nameof(FooPrediction.BarPrediction),
    nameof(FooInput.Bar),
    12,
    data.Length,
    data.Length,
    2,
    confidenceLowerBoundColumn: nameof(FooPrediction.ConfidenceLowerBound),
    confidenceUpperBoundColumn: nameof(FooPrediction.ConfidenceUpperBound));

var transformer = estimator.Fit(trainData);
using var engine = transformer.CreateTimeSeriesEngine<FooInput, FooPrediction>(mlContext);
engine.CheckPoint(mlContext, "model.zip");

, где items равно IEnumerable<FooInput>. Вот мои классы моделей:

public class FooPrediction
{
    public float[] BarPrediction { get; set; }

    public float[] ConfidenceLowerBound { get; set; }

    public float[] ConfidenceUpperBound { get; set; }
}

public class FooInput
{
    public float Bar { get; set; }

    public float Baz { get; set; }
}

В моем Startup я добавляю PredictionEnginePool, таким образом:

services.AddPredictionEnginePool<FooInput, FooPrediction>().FromFile(String.Empty, "model.zip", true);

В своем сервисе промежуточного программного обеспечения я внедряю PredictionEnginePool изатем позвоните:

var prediction = items.Select(i => predictionEnginePool.Predict(i));

, где items равно IEnumerable<FooInput>.

В результате ArgumentOutOfRangeException будет добавлено PredictionEngineBase.TransformerChecker:

Должно быть преобразователь строки в строку (параметр 'transformer')

Отладка в коде, я вижу, что есть проверка для IsRowToRowMapper для объекта ITransformer, являющегося истинным. Однако при создании модели создается SsaForecastingTransformer, для которого это свойство имеет значение false.

Я что-то не так делаю или PredictionEnginePool не поддерживает модели временных рядов?

Я также пробовал это с AddPredictionEnginePool<IEnumerable<FooInput>, FooPrediction> и затем вызывал predictionEnginePool.Predict(items), но это также приводит к тому же исключению.

1 Ответ

2 голосов
/ 11 ноября 2019

Этот код был добавлен после моего времени, поэтому у меня нет знаний из первых рук.

Однако, насколько я знаю ML.NET, ответ да: скорее всего, PredictionEnginePool не поддерживает прогнозирование временных рядов.

Причина в том, что временные рядыМеханизм прогнозирования на самом деле является «конечным автоматом». Вам необходимо передать все данные, в правильной последовательности , в один механизм прогнозирования, чтобы он правильно реагировал на этот «временной ряд».

Пул подсистемы прогнозирования решает совершенно другой сценарий: если у вас действительно модели без сохранения состояния, вы можете создать несколько взаимозаменяемых экземпляров (пул) подсистем предсказания, и предсказания будут обрабатываться с любым свободным движком в настоящее время.

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

...