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)
The property in the prediction class needs to be of type
float[]; a vector/array rather than a single value, e.g.Similar to the Microsoft example here.