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);
}
}
}
|