我使用here描述的方法创建了一个时间序列模型,得到了以下代码:
var data = items.ToArray();
var trainData = mlContext.Data.LoadFromEnumerable(data);
var estimator = mlContext.Forecasting.ForecastBySsa(
nameof(FooPrediction.BarPrediction),nameof(FooInput.Bar),12,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)
,但这也会导致相同的异常。