日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

使用 ML.NET 实现峰值检测来排查异常

發布時間:2023/12/4 asp.net 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 ML.NET 实现峰值检测来排查异常 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

機器學習中一類問題稱為峰值檢測,它旨在識別與大部分時序中明顯不同但臨時突發的數據值。及時檢測到這些可疑的個體、事件或觀察值很重要,這樣才能盡量減少其產生。異常情況檢測是檢測時序數據離群值的過程,在給定的輸入時序上指向“怪異”或不是預期行為的峰值。

通常有兩種類型的時序異常檢測:

  • 峰值,指示系統中臨時突發的異常行為。

  • 更改點,指示系統中一段時間內持續更改的開始。

在 ML.NET 中,IID 峰值檢測或 IID 更改點檢測算法適用于獨立且均勻分布的數據集。峰值檢測不需要任何訓練,這一點不像其他的機器學習場景,代碼也非常簡單。

我們來看一個真實的例子,假設有這樣一組日志數據:

如圖所示有紅色背景色的條形表明了發生異常。在 2019 年 10 月 19 日之前的錯誤計數,每天只發生了幾例,而當天會突然達到峰值。當修復系統后系統正常運行了兩天,不過由于引入了一個新的 Bug 在 2019 年 10 月 22 日又出現一個新的峰值。這個瞬間的峰值反映了系統肯定出現大規模異常。接下來我們就通過 ML.NET 來實現對峰值的識別。

首先安裝以下 NuGet 包:

Install-Package Microsoft.ML Install-Package Microsoft.ML.TimeSeries

Microsoft.MLMicrosoft.ML.TimeSeries?包含時間序列數據的相關對象。

var mlContext = new MLContext();

為了快速示例,我將模擬包含峰值的輸入數據如下:

var counts = new[] { 0, 1, 1, 0, 2, 1, 0, 0, 1, 1, 50, 0, 1, 0, 2, 1, 0, 1 };

50這個值很突出的代表了峰值。接下來我們定義一個強類型對象作為輸入模型:

class Input {public float Count { get; set; } }

與輸入一樣,定義一個強類型輸出模型:

class Output {[VectorType(3)]public double[] Prediction { get; set; } }

用 VectorType 標注了預測數據為 3 個元素的雙精度類型的數組。

接下來,我們定義評估器對象,可用于分析模型的效果:

var estimator = mlContext.Transforms.DetectIidSpike(nameof(Output.Prediction),nameof(Input.Count),confidence:99,pvalueHistoryLength:counts.Length / 4);

DetectIidSpike 方法有 4 個參數,輸入屬性的名稱、輸出屬性的名稱,置信度、峰值出現范圍,一般會將范圍設置為輸入長度的四分之一。

最后,生成轉換對象,創建預訓練模型,只是這個模型不需要訓練,所以傳入空數組:

ITransformer transformer = estimator.Fit(mlContext.Data.LoadFromEnumerable(new List<Input>()));

有了模型,我們處理用于預測的輸入數據:

var input = counts.Select(x => new Input { Count = x }); IDataView transformedData = transformer.Transform(mlContext.Data.LoadFromEnumerable(input));

最后一步獲取預測結果:

var predictions = mlContext.Data.CreateEnumerable<Output>(transformedData, false);

在此步驟中,我們用循環輸出每一個預測數據的結果:

foreach (var p in predictions) {Console.WriteLine($"{p.Prediction[0]}\t{p.Prediction[1]}\t{p.Prediction[2]}"); }

在這里,你會看到輸出預測中每行都是一個包含3個浮點數的數組:

第一列是一個bool值,指示該行是否為峰值。0 表示不是峰值,第二列是原始輸入,第三列是逗號分隔的置信值。

以下是到目前為止的完整代碼:

var counts = new[] { 0, 1, 1, 0, 2, 1, 0, 0, 1, 1, 50, 0, 1, 0, 2, 1, 0, 1 };var mlContext = new MLContext(); var estimator = mlContext.Transforms.DetectIidSpike(nameof(Output.Prediction), nameof(Input.Count), confidence:99, pvalueHistoryLength:counts.Length / 4); ITransformer transformer = estimator.Fit(mlContext.Data.LoadFromEnumerable(new List<Input>())); var input = counts.Select(x => new Input { Count = x }); IDataView transformedData = transformer.Transform(mlContext.Data.LoadFromEnumerable(input)); var predictions = mlContext.Data.CreateEnumerable<Output>(transformedData, false);foreach (var p in predictions) {Console.WriteLine($"{p.Prediction[0]}\t{p.Prediction[1]}\t{p.Prediction[2]}"); }

乍一看,代碼可能看起來有點啰嗦。主要是 ML.NET 無論訓練模型與否,管道幾乎相同的。

我們再試試改一下 confidence 設置。看看會發生什么:

var estimator = mlContext.Transforms.DetectIidSpike(nameof(Output.Prediction),nameof(Input.Count),confidence:95,pvalueHistoryLength:counts.Length / 4);

對于相同的輸入,預測現在如下所示:

注意到區別了嗎?第五行現在也標記為峰值。

我們將輸入值更改為以下內容:

var counts = new[] { 1, 3, 0, 4, 5, 5, 4, 3, 3, 0, 13, 8, 1, 61, 21, 40, 7, 7, 5, 6, 8, 33, 11, 5,2, 10, 11, 18, 14, 23, 8, 17, 15, 13, 24, 29, 15, 20, 29, 19, 18, 17, 23, 47, 7, 14, 26, 28,5, 22, 47, 22, 20, 9, 40, 6, 8, 4, 10, 10, 1, 4, 27, 3, 3, 7, 6, 12, 8, 3, 1, 2, 0, 0, 2, 0,2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 2 };

此時在沒有 ML.NET 時就感覺到想要發現異常要困難得多了吧。運行程序后,下面是結果的一部分:

最后一行標記為峰值。但看看第14行絕對看起來像一個異常,ML.NET 似乎有點問題,置信值低于0.05。我們可以稍微處理一下:

if (p.Prediction[2] < (1 - 0.95)) {p.Prediction[0] = 1; }

這雖然有點玩套路,但基本上真的峰值被預測出來,不過弄出了更多不正確的預測。實際上應該在置信度的基礎上用額外的二次過濾機制來保證結果傾向于正確:

到目前為止,我們可以使用 ML.NET 來實現機器學習檢測異常數據了,這會讓我們監控一類的應用更加智能!

總結

以上是生活随笔為你收集整理的使用 ML.NET 实现峰值检测来排查异常的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。