aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/FSE/Modules/Tango.FSE.Insights/ML/AnomaliesDetector.cs
blob: 4a81e9eb5ef54abb2ab968d514c6713a5932973d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using Microsoft.ML;
using Microsoft.ML.Transforms.TimeSeries;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tango.FSE.Insights.ML
{
    public class AnomaliesDetector
    {
        private IDataView _view;
        private MLContext _mlContext;
        private List<MonitorValue> _values;

        private AnomaliesDetector()
        {
            _mlContext = new MLContext();
        }

        public static Task<AnomaliesDetector> FromMonitor(List<MonitorValue> monitorValues)
        {
            return Task.Factory.StartNew<AnomaliesDetector>(() =>
            {
                AnomaliesDetector engine = new AnomaliesDetector();
                engine._values = monitorValues;
                engine._view = engine._mlContext.Data.LoadFromEnumerable<MonitorValue>(monitorValues);
                return engine;
            });
        }

        public void DetectSpikes()
        {
            var iidSpikeEstimator = _mlContext.Transforms.DetectIidSpike(outputColumnName: nameof(MonitorSeriesPrediction.Prediction), inputColumnName: nameof(MonitorValue.Value), confidence: 95, pvalueHistoryLength: _values.Count / 4, side: AnomalySide.TwoSided);

            ITransformer iidSpikeTransform = iidSpikeEstimator.Fit(CreateEmptyDataView());

            IDataView transformedData = iidSpikeTransform.Transform(_view);

            var predictions = _mlContext.Data.CreateEnumerable<MonitorSeriesPrediction>(transformedData, reuseRowObject: false);

            foreach (var p in predictions)
            {
                var results = $"{p.Prediction[0]}\t{p.Prediction[1]:f2}\t{p.Prediction[2]:F2}";

                if (p.Prediction[0] == 1)
                {
                    results += " <-- Spike detected";
                }

                Debug.WriteLine(results);
            }
        }

        private IDataView CreateEmptyDataView()
        {
            IEnumerable<MonitorValue> enumerableData = new List<MonitorValue>();
            return _mlContext.Data.LoadFromEnumerable(enumerableData);
        }
    }
}