public void SpikeDetection() { var env = new MLContext(); const int Size = 10; const int PvalHistoryLength = Size / 4; // Generate sample series data with a spike List <Data> data = new List <Data>(Size); var dataView = env.Data.LoadFromEnumerable(data); for (int i = 0; i < Size / 2; i++) { data.Add(new Data(5)); } data.Add(new Data(10)); // This is the spike for (int i = 0; i < Size / 2 - 1; i++) { data.Add(new Data(5)); } // Convert to statically-typed data view. var staticData = dataView.AssertStatic(env, c => new { Value = c.R4.Scalar }); // Build the pipeline var staticLearningPipeline = staticData.MakeNewEstimator() .Append(r => r.Value.IidSpikeDetect(80, PvalHistoryLength)); // Train var detector = staticLearningPipeline.Fit(staticData); // Transform var output = detector.Transform(staticData); // Get predictions var enumerator = env.Data.CreateEnumerable <SpikePrediction>(output.AsDynamic, true).GetEnumerator(); var expectedValues = new List <double[]>() { // Alert Score P-Value new double[] { 0, 5, 0.5 }, new double[] { 0, 5, 0.5 }, new double[] { 0, 5, 0.5 }, new double[] { 0, 5, 0.5 }, new double[] { 0, 5, 0.5 }, new double[] { 1, 10, 0.0 }, // alert is on, predicted spike new double[] { 0, 5, 0.261375 }, new double[] { 0, 5, 0.261375 }, new double[] { 0, 5, 0.50 }, new double[] { 0, 5, 0.50 } }; SpikePrediction row = null; for (var i = 0; enumerator.MoveNext() && i < expectedValues.Count; i++) { row = enumerator.Current; CompareNumbersWithTolerance(expectedValues[i][0], row.Data[0], digitsOfPrecision: 7); CompareNumbersWithTolerance(expectedValues[i][1], row.Data[1], digitsOfPrecision: 7); CompareNumbersWithTolerance(expectedValues[i][2], row.Data[2], digitsOfPrecision: 7); } }
public void SpikeDetection() { var env = new MLContext(1); const int Size = 10; const int PvalHistoryLength = Size / 4; // Generate sample series data with a spike List <Data> data = new List <Data>(Size); var dataView = env.Data.LoadFromEnumerable(data); for (int i = 0; i < Size / 2; i++) { data.Add(new Data(5)); } data.Add(new Data(10)); // This is the spike for (int i = 0; i < Size / 2 - 1; i++) { data.Add(new Data(5)); } // Build the pipeline var learningPipeline = ML.Transforms.DetectIidSpike("Data", "Value", 80, PvalHistoryLength); // Train var detector = learningPipeline.Fit(dataView); // Transform var output = detector.Transform(dataView); // Get predictions var enumerator = env.Data.CreateEnumerable <SpikePrediction>(output, true).GetEnumerator(); var expectedValues = new List <double[]>() { // Alert Score P-Value new double[] { 0, 5, 0.5 }, new double[] { 0, 5, 0.5 }, new double[] { 0, 5, 0.5 }, new double[] { 0, 5, 0.5 }, new double[] { 0, 5, 0.5 }, new double[] { 1, 10, 0.0 }, // alert is on, predicted spike new double[] { 0, 5, 0.261375 }, new double[] { 0, 5, 0.261375 }, new double[] { 0, 5, 0.50 }, new double[] { 0, 5, 0.50 } }; SpikePrediction row = null; for (var i = 0; enumerator.MoveNext() && i < expectedValues.Count; i++) { row = enumerator.Current; CompareNumbersWithTolerance(expectedValues[i][0], row.Data[0], digitsOfPrecision: 7); CompareNumbersWithTolerance(expectedValues[i][1], row.Data[1], digitsOfPrecision: 7); CompareNumbersWithTolerance(expectedValues[i][2], row.Data[2], digitsOfPrecision: 7); } }
public void SsaSpikeDetection() { var env = new MLContext(1); const int size = 16; const int changeHistoryLength = size / 4; const int trainingWindowSize = size / 2; const int seasonalityWindowSize = size / 8; // Generate sample series data with a spike List <Data> data = new List <Data>(size); var dataView = env.Data.LoadFromEnumerable(data); for (int i = 0; i < size / 2; i++) { data.Add(new Data(5)); } data.Add(new Data(10)); // This is the spike for (int i = 0; i < size / 2 - 1; i++) { data.Add(new Data(5)); } // Build the pipeline var learningPipeline = ML.Transforms.DetectSpikeBySsa("Data", "Value", 80.0d, changeHistoryLength, trainingWindowSize, seasonalityWindowSize); // Train var detector = learningPipeline.Fit(dataView); // Transform var output = detector.Transform(dataView); // Get predictions var enumerator = env.Data.CreateEnumerable <SpikePrediction>(output, true).GetEnumerator(); var expectedValues = new List <double[]>() { // Alert Score P-Value new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 1, 5.0, 0.0 }, // alert is on, predicted spike new double[] { 1, -2.5, 0.093146 }, new double[] { 0, -2.5, 0.215437 }, new double[] { 0, 0.0, 0.465745 }, new double[] { 0, 0.0, 0.465745 }, new double[] { 0, 0.0, 0.261375 }, new double[] { 0, 0.0, 0.377615 }, new double[] { 0, 0.0, 0.50 } }; SpikePrediction row = null; for (var i = 0; enumerator.MoveNext() && i < expectedValues.Count; i++) { row = enumerator.Current; CompareNumbersWithTolerance(expectedValues[i][0], row.Data[0], digitsOfPrecision: 6); CompareNumbersWithTolerance(expectedValues[i][1], row.Data[1], digitsOfPrecision: 6); CompareNumbersWithTolerance(expectedValues[i][2], row.Data[2], digitsOfPrecision: 6); } }
public void SsaSpikeDetection() { var env = new MLContext(conc: 1); const int Size = 16; const int ChangeHistoryLength = Size / 4; const int TrainingWindowSize = Size / 2; const int SeasonalityWindowSize = Size / 8; // Generate sample series data with a spike List <Data> data = new List <Data>(Size); var dataView = env.CreateStreamingDataView(data); for (int i = 0; i < Size / 2; i++) { data.Add(new Data(5)); } data.Add(new Data(10)); // This is the spike for (int i = 0; i < Size / 2 - 1; i++) { data.Add(new Data(5)); } // Convert to statically-typed data view. var staticData = dataView.AssertStatic(env, c => new { Value = c.R4.Scalar }); // Build the pipeline var staticLearningPipeline = staticData.MakeNewEstimator() .Append(r => r.Value.SsaSpikeDetect(80, ChangeHistoryLength, TrainingWindowSize, SeasonalityWindowSize)); // Train var detector = staticLearningPipeline.Fit(staticData); // Transform var output = detector.Transform(staticData); // Get predictions var enumerator = output.AsDynamic.AsEnumerable <SpikePrediction>(env, true).GetEnumerator(); var expectedValues = new List <double[]>() { // Alert Score P-Value new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 0, 0.0, 0.5 }, new double[] { 1, 5.0, 0.0 }, // alert is on, predicted spike new double[] { 1, -2.5, 0.093146 }, new double[] { 0, -2.5, 0.215437 }, new double[] { 0, 0.0, 0.465745 }, new double[] { 0, 0.0, 0.465745 }, new double[] { 0, 0.0, 0.261375 }, new double[] { 0, 0.0, 0.377615 }, new double[] { 0, 0.0, 0.50 } }; SpikePrediction row = null; for (var i = 0; enumerator.MoveNext() && i < expectedValues.Count; i++) { row = enumerator.Current; CompareNumbersWithTolerance(expectedValues[i][0], row.Data[0], digitsOfPrecision: 6); CompareNumbersWithTolerance(expectedValues[i][1], row.Data[1], digitsOfPrecision: 6); CompareNumbersWithTolerance(expectedValues[i][2], row.Data[2], digitsOfPrecision: 6); } }