如何解决使用 TimeSeriesPredictionEngine ML.NET 时间序列 ForecastbySsa 中的 DateTime 预测值
我的机器学习模型使用一个数据集,其中有时一天有 5 行数据,但有时是 4 或 6 行,依此类推。
现在,例如,如果我的最后一个已知数据是“2020-05-19”,而我想要预测“2020-05-20”,我该怎么做? 该日期的 FillLevel 值未知。但我如何确定预测是针对第二天的?
我的代码如下:
模型输入:
public class ModelInput
{
public DateTime DateTime { get; set; }
public float FillLevel { get; set; }
}
模型输出:
public class ModelOutput
{
public float[] ForecastedFillLevel { get; set; }
public float[] LowerBoundFillLevel { get; set; }
public float[] UpperBoundFillLevel { get; set; }
}
var forecastingPipeline = mlContext.Forecasting.ForecastBySsa(
outputColumnName: "ForecastedFillLevel",inputColumnName: "FillLevel",windowSize: 7,seriesLength: 30,trainSize: 500,horizon: 21,confidenceLevel: 0.95f,confidenceLowerBoundColumn: "LowerBoundFillLevel",confidenceUpperBoundColumn: "UpperBoundFillLevel");
SsaForecastingTransformer forecaster = forecastingPipeline.Fit(dataView);
Evaluate(dataView,forecaster,mlContext);
var forecastEngine = forecaster.CreateTimeSeriesEngine<ModelInput,ModelOutput>(mlContext);
forecastEngine.CheckPoint(mlContext,modelPath);
var forecast = forecastEngine.Predict();
var lastData = DateTime.Parse("2020-05-19");
var predictionStartDate = lastData.AddDays(1);
forecast.ForecastedFillLevel.Select(x => (int)x);
for(int index = 0; index < 7; index++)
{
Console.WriteLine(forecast.ForecastedFillLevel[index].ToString());
}
评估方法:
static void Evaluate(IDataView testData,ITransformer model,MLContext mlContext)
{
// Make predictions
IDataView predictions = model.Transform(testData);
// Actual values
IEnumerable<float> actual =
mlContext.Data.CreateEnumerable<ModelInput>(testData,true)
.Select(observed => observed.FillLevel);
// Predicted values
IEnumerable<float> forecast =
mlContext.Data.CreateEnumerable<ModelOutput>(predictions,true)
.Select(prediction => prediction.ForecastedFillLevel[0]);
// Calculate error (actual - forecast)
var metrics = actual.Zip(forecast,(actualValue,forecastValue) => actualValue - forecastValue);
// Get metric averages
var MAE = metrics.Average(error => Math.Abs(error)); // Mean Absolute Error
var RMSE = Math.Sqrt(metrics.Average(error => Math.Pow(error,2))); // Root Mean Squared Error
// Output metrics
Console.WriteLine("Evaluation Metrics");
Console.WriteLine("---------------------");
Console.WriteLine($"Mean Absolute Error: {MAE:F3}");
Console.WriteLine($"Root Mean Squared Error: {RMSE:F3}\n");
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。