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;
}
}
主要用到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;
}
}
留言
張貼留言