// This example creates a time series (list of Data with the i-th element corresponding to the i-th time slot). // SsaChangePointDetector is applied then to identify points where data distribution changed. // SsaChangePointDetector differs from IidChangePointDetector in that it can account for temporal seasonality // in the data. public static void SsaChangePointDetectorTransform() { // Create a new ML context, for ML.NET operations. It can be used for exception tracking and logging, // as well as the source of randomness. var ml = new MLContext(); // Generate sample series data with a recurring pattern and then a change in trend const int SeasonalitySize = 5; const int TrainingSeasons = 3; const int TrainingSize = SeasonalitySize * TrainingSeasons; var data = new List <SsaChangePointData>(); for (int i = 0; i < TrainingSeasons; i++) { for (int j = 0; j < SeasonalitySize; j++) { data.Add(new SsaChangePointData(j)); } } // This is a change point for (int i = 0; i < SeasonalitySize; i++) { data.Add(new SsaChangePointData(i * 100)); } // Convert data to IDataView. var dataView = ml.CreateStreamingDataView(data); // Setup SsaChangePointDetector arguments var inputColumnName = nameof(SsaChangePointData.Value); var outputColumnName = nameof(ChangePointPrediction.Prediction); var args = new SsaChangePointDetector.Arguments() { Source = inputColumnName, Name = outputColumnName, Confidence = 95, // The confidence for spike detection in the range [0, 100] ChangeHistoryLength = 8, // The length of the window for detecting a change in trend; shorter windows are more sensitive to spikes. TrainingWindowSize = TrainingSize, // The number of points from the beginning of the sequence used for training. SeasonalWindowSize = SeasonalitySize + 1 // An upper bound on the largest relevant seasonality in the input time series." }; // The transformed data. var transformedData = new SsaChangePointEstimator(ml, args).Fit(dataView).Transform(dataView); // Getting the data of the newly created column as an IEnumerable of ChangePointPrediction. var predictionColumn = transformedData.AsEnumerable <ChangePointPrediction>(ml, reuseRowObject: false); Console.WriteLine($"{outputColumnName} column obtained post-transformation."); Console.WriteLine("Data\tAlert\tScore\tP-Value\tMartingale value"); int k = 0; foreach (var prediction in predictionColumn) { Console.WriteLine("{0}\t{1}\t{2:0.00}\t{3:0.00}\t{4:0.00}", data[k++].Value, prediction.Prediction[0], prediction.Prediction[1], prediction.Prediction[2], prediction.Prediction[3]); } Console.WriteLine(""); // Prediction column obtained post-transformation. // Data Alert Score P-Value Martingale value // 0 0 - 2.53 0.50 0.00 // 1 0 - 0.01 0.01 0.00 // 2 0 0.76 0.14 0.00 // 3 0 0.69 0.28 0.00 // 4 0 1.44 0.18 0.00 // 0 0 - 1.84 0.17 0.00 // 1 0 0.22 0.44 0.00 // 2 0 0.20 0.45 0.00 // 3 0 0.16 0.47 0.00 // 4 0 1.33 0.18 0.00 // 0 0 - 1.79 0.07 0.00 // 1 0 0.16 0.50 0.00 // 2 0 0.09 0.50 0.00 // 3 0 0.08 0.45 0.00 // 4 0 1.31 0.12 0.00 // 0 0 - 1.79 0.07 0.00 // 100 1 99.16 0.00 4031.94 <-- alert is on, predicted changepoint // 200 0 185.23 0.00 731260.87 // 300 0 270.40 0.01 3578470.47 // 400 0 357.11 0.03 45298370.86 }
// This example creates a time series (list of Data with the i-th element corresponding to the i-th time slot). // SsaChangePointDetector is applied then to identify points where data distribution changed. public static void SsaChangePointDetectorTransform() { // Create a new ML context, for ML.NET operations. It can be used for exception tracking and logging, // as well as the source of randomness. var ml = new MLContext(); // Generate sample series data with a change const int size = 16; var data = new List <Data>(size); for (int i = 0; i < size / 2; i++) { data.Add(new Data(5)); } // This is a change point for (int i = 0; i < size / 2; i++) { data.Add(new Data(7)); } // Convert data to IDataView. var dataView = ml.CreateStreamingDataView(data); // Setup IidSpikeDetector arguments string outputColumnName = "Prediction"; string inputColumnName = "Value"; var args = new SsaChangePointDetector.Arguments() { Source = inputColumnName, Name = outputColumnName, Confidence = 95, // The confidence for spike detection in the range [0, 100] ChangeHistoryLength = size / 4, // The length of the sliding window on p-values for computing the martingale score. TrainingWindowSize = size / 2, // The number of points from the beginning of the sequence used for training. SeasonalWindowSize = size / 8, // An upper bound on the largest relevant seasonality in the input time - series." }; // The transformed data. var transformedData = new SsaChangePointEstimator(ml, args).Fit(dataView).Transform(dataView); // Getting the data of the newly created column as an IEnumerable of ChangePointPrediction. var predictionColumn = transformedData.AsEnumerable <ChangePointPrediction>(ml, reuseRowObject: false); Console.WriteLine($"{outputColumnName} column obtained post-transformation."); Console.WriteLine("Data\tAlert\tScore\tP-Value\tMartingale value"); int k = 0; foreach (var prediction in predictionColumn) { Console.WriteLine("{0}\t{1}\t{2:0.00}\t{3:0.00}\t{4:0.00}", data[k++].Value, prediction.Prediction[0], prediction.Prediction[1], prediction.Prediction[2], prediction.Prediction[3]); } Console.WriteLine(""); // Prediction column obtained post-transformation. // Data Alert Score P-Value Martingale value // 5 0 0.00 0.50 0.00 // 5 0 0.00 0.50 0.00 // 5 0 0.00 0.50 0.00 // 5 0 0.00 0.50 0.00 // 5 0 0.00 0.50 0.00 // 5 0 0.00 0.50 0.00 // 5 0 0.00 0.50 0.00 // 5 0 0.00 0.50 0.00 // 7 1 2.00 0.00 10298.67 <-- alert is on, predicted changepoint // 7 0 1.00 0.31 15741.58 // 7 0 0.00 0.28 26487.48 // 7 0 0.00 0.28 44569.02 // 7 0 0.00 0.28 0.01 // 7 0 0.00 0.38 0.01 // 7 0 0.00 0.50 0.00 // 7 0 0.00 0.50 0.00 }