Я создал модель временного ряда, используя метод, описанный здесь , в результате чего получается следующий код:
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)
, но это также приводит к тому же исключению.