ML.NET-使用ML.NET進行異常偵測

安裝完ML.NET跟讀好資料庫資料,現在就來跑個異常偵測測試一下。

主要用到IidSpikeEstimator Class這個類別

根據微軟敘述
可偵測到的時間序列異常有兩種:尖峰表示系統中異常行為的暫時高載。變更點表示系統開頭的持續性隨著時間變更。

首先把DB讀到的data轉成ml看得懂的形式,iidSpikeEstimator 類似python的model,給他input跟output(需寫成類別可參考ML.NET從資料庫讀取資料),p-value信心水準95%,pvalueHistoryLength:計算p-value的滑動窗口大小,這兩個參數可調整,找出來的異常值會有差異。

下一步把資料餵到model裡面並把資料轉成列舉,從列舉中取出預測值,最後就是把結果印出來而已,因為我是用asp.net專案,所以簡單用label顯示。

var mlData = mlContext.Data.LoadFromEnumerable(data);
DetectSpike(mlContext, mlData);

     static IDataView CreateEmptyDataView(MLContext mlContext)
    {
        // Create empty DataView. We just need the schema to call Fit() for the time series transforms
        IEnumerable<geodaily_model> enumerableData = new List<geodaily_model>();
        return mlContext.Data.LoadFromEnumerable(enumerableData);
    }

    public void DetectSpike(MLContext mlContext, IDataView productSales)
    {
        var iidSpikeEstimator = mlContext.Transforms.DetectIidSpike(outputColumnName: nameof(geodaily_modelPrediction.Prediction), inputColumnName: nameof(geodaily_model.net_p), confidence: 95, pvalueHistoryLength: 5);
        ITransformer iidSpikeTransform = iidSpikeEstimator.Fit(CreateEmptyDataView(mlContext));
        IDataView transformedData = iidSpikeTransform.Transform(productSales);
        var predictions = mlContext.Data.CreateEnumerable<geodaily_modelPrediction>(transformedData, reuseRowObject: false);
        lbl_result.Text += "Alert\ Score\ P-Value";
        foreach (var p in predictions)
        {
            var results = $"{p.Prediction[0]}\t {p.Prediction[1]:f2}\t  {p.Prediction[2]:F2}";
            lbl_result.Text += "<br>";
            if (p.Prediction[0] == 1)
            {
                lbl_result.Text += results + " <-- Spike detected";
                continue;
            }
            lbl_result.Text += results;
        }
    }

留言

這個網誌中的熱門文章

Python-相關係數矩陣實作(python-correlation matrix )

ASP.NET-後端將值傳給javascript

ASP.NET-FileUpload上傳後自動觸發button click(FileUpload upload auto trigger button click)