ML .NET 异常情况检测

场景

商品的价格会随时间发生变化,可以通过ML .NET异常情况检测功能获得价格的拐点峰值,为决策做参考

数据集

数据来自Every Cryptocurrency Daily Market Price
原始数据包含币种symbol、时间date、开盘价open、最高价high、最低价low、收盘价close等多种数据
这里只取Bitcoin在2013年4月28日至2018年11月29日的开盘价格,如图所示

训练

自动化ML尚不支持异常情况检测,所以这里需要正常的写代码
根据教程:使用 ML.NET 检测产品销售中的异常的步骤,可以很简单的进行coding

峰值检测

关键代码如下

var iidSpikeEstimator = mlContext.Transforms.DetectIidSpike(
                outputColumnName: nameof(CommodityPricePrediction.Prediction),
                inputColumnName: nameof(CommodityPriceModel.open),
                confidence: 95,
                pvalueHistoryLength: _docsize/31);

检测峰值的关键方法是DetectIidSpike
有一个输出列outputColumnName,一个输入列inputColumnName
confidencepvalueHistoryLength参数影响峰值的最终结果
confidence越低,算法检测到“较小”峰值的可能性就大
pvalueHistoryLength越低,模型忘记之前的较大峰值的速度就越快,这里因为数据是按天递进的,_docsize为总数据量2042条,pvalueHistoryLength取每个月,所以以_docsize除以31
详细资料见IidSpikeEstimator 类

更改点检测

关键代码如下

var iidChangePointEstimator = mlContext.Transforms.DetectIidChangePoint(
            outputColumnName: nameof(CommodityPricePrediction.Prediction),
            inputColumnName: nameof(CommodityPriceModel.open),
            confidence: 95,
            changeHistoryLength: _docsize/31);

检测峰值的关键方法是DetectIidChangePoint
参数与DetectIidSpike类似
详细资料见IidChangePointEstimator 类

根据当前训练数据和设置的参数,可以得到以下结果

峰值检测
Alert   Score   P-Value
0       135.30  0.50
0       134.44  0.19
0       144.00  0.00
0       139.00  0.41
......
1       270.91  0.02 <-- Spike detected 检测到尖峰
0       261.86  0.07
0       263.57  0.06
1       269.31  0.03 <-- Spike detected 检测到尖峰
1       266.50  0.05 <-- Spike detected 检测到尖峰
1       273.65  0.03 <-- Spike detected 检测到尖峰
1       276.50  0.03 <-- Spike detected 检测到尖峰
1       281.45  0.02 <-- Spike detected 检测到尖峰
1       283.63  0.03 <-- Spike detected 检测到尖峰
1       285.18  0.03 <-- Spike detected 检测到尖峰
1       293.70  0.02 <-- Spike detected 检测到尖峰
1       304.32  0.01 <-- Spike detected 检测到尖峰
1       313.94  0.01 <-- Spike detected 检测到尖峰
1       328.51  0.01 <-- Spike detected 检测到尖峰
1       315.01  0.03 <-- Spike detected 检测到尖峰
1       325.94  0.02 <-- Spike detected 检测到尖峰
1       361.87  0.00 <-- Spike detected 检测到尖峰
1       403.66  0.00 <-- Spike detected 检测到尖峰
1       408.08  0.01 <-- Spike detected 检测到尖峰
1       388.05  0.03 <-- Spike detected 检测到尖峰
1       374.27  0.05 <-- Spike detected 检测到尖峰
1       384.28  0.05 <-- Spike detected 检测到尖峰
......

更改点检测
Alert   Score   P-Value Martingale value
0       135.30  0.50    0.00
0       134.44  0.19    0.00
0       144.00  0.00    0.00
0       139.00  0.41    0.00
0       116.38  0.00    0.00
0       106.25  0.03    0.00
0       98.10   0.06    0.00
......
0       419.41  0.02    93.13
0       417.28  0.03    289.14
0       440.96  0.03    1230.73
0       496.58  0.02    7860.61
0       712.76  0.00    3417895.47
0       577.98  0.02    20823140.67
0       594.32  0.03    104358445.48
0       724.07  0.01    1135503399.54
0       771.70  0.01    11511784560.11
0       795.63  0.02    101146411707.08
1       773.02  0.03    661588163070.51 <-- alert is on, predicted changepoint  警报开启,预测变化点
0       805.73  0.04    4050159523330.93
0       923.85  0.02    38568890913474.40
0       1003.38 0.02    499206959027848.12
0       1042.01 0.02    5059346677869355.00
0       1129.37 0.02    55327355244724032.00
0       1128.92 0.03    407440713595917504.00
0       951.42  0.08    916461290575384448.00
......

示例代码

CommodityPrice

参考资料

教程:使用 ML.NET 检测产品销售中的异常
IidSpikeEstimator 类
IidChangePointEstimator 类

posted @ 2022-03-23 19:07  Lulus  阅读(686)  评论(0编辑  收藏  举报