场景

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

数据集


原始数据包含币种symbol、时间date、开盘价open、最高价high、最低价low、收盘价close等多种数据

这里只取Bitcoin在2013年4月28日至2018年11月29日的开盘价格,如图所示

ML .NET 异常情况检测_数据

训练

自动化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​

​confidence​​和​​pvalueHistoryLength​​参数影响峰值的最终结果

​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​