ML.net - CreateTimeSeriesEngine

69 views Asked by At

I am working on a time series analysis project with ML.net. Here I try to forecast euro to usd transaction rate. I load the data from a CSV file and create IDataView with in memory data.

List<RateData> infoList = new List<RateData>();
// populate list
infoList = FileParser(infoList);
IDataView data = mlContext.Data.LoadFromEnumerable<RateData>(infoList);

I managed to run the forecast estimator like this

var forecastEstimator = mlContext.Forecasting.ForecastBySsa(
    outputColumnName: nameof(RatePrediction.CurrentRate),
    inputColumnName: nameof(RateData.HistoricalRate),
    windowSize: 14,
    seriesLength: numRateDataPoints,
    trainSize: numRateDataPoints, 
    horizon: 1, 
    confidenceLevel: 0.95f );

SsaForecastingTransformer forecaster = forecastEstimator.Fit(RateDataSeries);

Then I try to create the forcast engine like this

var forecastEngine = forecaster.CreateTimeSeriesEngine<RateData, RatePrediction>(mlContext);

Here I am having some error. My input and output classes are as follows:

public class RateData
{
    public DateTime TransactionDate { get; set; }
    public float HistoricalRate { get; set; }
}
   
public class RatePrediction
{
  public float CurrentRate;
       
}

I have errors like these

System.InvalidOperationException: Can't bind the IDataView column 'CurrentRate' of type 'Vector<Single, 1>' to field or property 'CurrentRate' of type 'System.Single'.
   at Microsoft.ML.Data.TypedCursorable`1..ctor(IHostEnvironment env, IDataView data, Boolean ignoreMissingColumns, InternalSchemaDefinition schemaDefn)
   at Microsoft.ML.Data.TypedCursorable`1.Create(IHostEnvironment env, IDataView data, Boolean ignoreMissingColumns, SchemaDefinition schemaDefinition)
   at Microsoft.ML.Transforms.TimeSeries.TimeSeriesPredictionEngine`2.PredictionEngineCore(IHostEnvironment env, InputRow`1 inputRow, IRowToRowMapper mapper, Boolean ignoreMissingColumns, SchemaDefinition outputSchemaDefinition, Action& disposer, IRowReadableAs`1& outputRow)
   at Microsoft.ML.PredictionEngineBase`2..ctor(IHostEnvironment env, ITransformer transformer, Boolean ignoreMissingColumns, SchemaDefinition inputSchemaDefinition, SchemaDefinition outputSchemaDefinition, Boolean ownsTransformer)
   at Microsoft.ML.Transforms.TimeSeries.TimeSeriesPredictionEngine`2..ctor(IHostEnvironment env, ITransformer transformer, Boolean ignoreMissingColumns, SchemaDefinition inputSchemaDefinition, SchemaDefinition outputSchemaDefinition)
   at Microsoft.ML.Transforms.TimeSeries.PredictionFunctionExtensions.CreateTimeSeriesEngine[TSrc,TDst](ITransformer transformer, IHostEnvironment env, Boolean ignoreMissingColumns, SchemaDefinition inputSchemaDefinition, SchemaDefinition outputSchemaDefinition)
   at USD_EURO_Conversion_rate.TimeSeriesModelHelper.FitAndSaveModel(MLContext mlContext, IDataView RateDataSeries, String outputModelPath) 
1

There are 1 answers

0
Dean Becker On

The property in the prediction class needs to be of type float[]; a vector/array rather than a single value, e.g.

public class RatePrediction
{
  public float[] CurrentRate;
       
}

Similar to the Microsoft example here.