使用 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 来实现机器学习检测异常数据了,这会让我们监控一类的应用更加智能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Tasklist命令

Tasklist命令用来显示运行在本地或远程计算机上的所有进程&#xff0c;带有多个执行参数。使用格式Tasklist [/S system [/U username [/P [password]]]] [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]参数含义/S system 指定连接到的远程系统。/U [domain]user…

PHP防QQ列表右划,react native 实现类似QQ的侧滑列表效果

如果列表行数据需要更多的操作&#xff0c;使用侧滑菜单是移动端比较常见的方式&#xff0c;也符合用户的操作习惯&#xff0c;对app的接受度自然会相对提高点。最近得空就把原来的react-native项目升级了侧滑操作&#xff0c;轻轻松松支持android和ios双平台&#xff0c;效果如…

OpenTelemetry - 云原生下可观测性的新标准

CNCF 简介CNCF&#xff08;Cloud Native Computing Foundation&#xff09;&#xff0c;中文为“云原生计算基金会”&#xff0c;CNCF是Linux基金会旗下的基金会&#xff0c;可以理解为一个非盈利组织。当年谷歌内部一直用于编排容器的Borg项目开源了&#xff0c;为了该项目更好…

毕业设计——第三章 开发方法及系统实现(5)

国内私募机构九鼎控股打造APP&#xff0c;来就送 20元现金领取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html内部邀请码&#xff1a;C8E245J &#xff08;不写邀请码&#xff0c;没有现金送&#xff09;国内私募机构九鼎控股打造&#xff0c;九鼎投资是在全国股份…

说说 RabbiMQ 的应答模式

RabbiMQ 我们都很熟悉了&#xff0c;是很常用的一个开源消息队列。搞懂 RabbiMQ 的应答模式对我们排查错误很有帮助&#xff0c;也能避免一些坑。本文说说 RabbiMQ 的应答模式。生产者发出一条消息给 RabbiMQ &#xff0c;RabbiMQ 将消息推送给消费者&#xff0c;消费者处理完消…

php 输出json utf8,php json_encode utf-8中文问题

以前碰到最多的是json_encode是gbk 编码时出现乱码&#xff0c;今天发现uft8也会出现中文乱码了&#xff0c;下面我们一起看问题如何解决吧。utf-8字符json_encode为变成转成utf16编码&#xff0c;也就是介个样子&#xff1a; 代码如下复制代码$ ./php/bin/php -r echo json_en…

2005-5-29+ 认识httphandler

httphandler是做什么的&#xff1f;用任何一个搜索引擎都可以找到一大堆资料&#xff0c;我就不多说了&#xff0c;把我今天学习的一些认识写在这里&#xff0c;希望可以从另一个侧面让大家认识httphandler。所谓httphandler&#xff0c;其实是.net用来处理页面请求的。大家可以…

php oracle 锁表,ORACLE 用户锁定问题

在开发环境下&#xff0c;由于直接修改了数据库用户的密码&#xff0c;之后一直不能连接&#xff0c;及时执行alter user username account unlock 还是提示用户锁定。刚开始只是怀疑是数据库的问题&#xff0c;就一直在数据库上找问题&#xff0c;其实最终的问题是更改密码后&…

微软2020开源回顾:止不住的挨骂,停不下的贡献

喜欢就关注我们吧&#xff01;2020年&#xff0c;Linus Torvalds 开启“飚骚话”模式&#xff0c;言语不再激烈。看到“大喷子” Linus 都有机会变慈祥&#xff0c;料想微软近年来主动拥抱开源并示好的行为应该能改变他人的看法。然而事实并非如此&#xff0c;虽然微软积极投身…

下午回家啦~

决定回家&#xff0c;今天买火车票也很顺利&#xff0c;晚上七点多就到家了。老爸老妈&#xff0c;还有很多亲人朋友&#xff0c;俺就要见到你们了&#xff0c;激动、开心&#xff01;

用matlab实现机械臂的仿真,基于MATLAB的SCARA机械臂仿真与性能评估

工业机器人以其代替人类单调繁重的体力劳动,便于实现自动化提高生产效率等优点,而被广泛应用于工程机械、汽车零部件、轨道交通、轻工造纸等行业,具有可观的经济效益。到2015年,中国机器人市场将成世界最大规模的市场。与此同时,它又是融合了多个学科的复杂机电一体化产品。近年…

每日一题——LeetCode859

方法一 个人方法&#xff1a; 首先s和goal要是长度不一样或者就只有一个字符这两种情况可以直接排除剩下的情况s和goal的长度都是一样的&#xff0c;s的长度为2也是特殊情况&#xff0c;只有s的第一位等于goal的第二位&#xff0c;s的第二位等于goal的第一位才能满足剩下的我们…

4倍速!ML.NET Model Builder GPU 与 CPU 对比测试

当我们使用 Visual Studio 进行机器学习开发时&#xff0c;一般都会推荐安装 ML.NET Model Builder &#xff0c;这让我们的开发更加可视化&#xff0c;并且按照步骤载入相关的训练集&#xff0c;选择好模型就够了&#xff0c;一切就是如此朴实无华。说到 ML.NET Model Builder…

疯狂的爬网

今天下午13:00~16:00&#xff0c;来自61.152.236.158的访客对博客园进行了疯狂的爬网。访问次数 &#xff1a;45506 频率&#xff1a;13次/秒访问目标地址&#xff1a;主要是个人Blog各个分类的RSS。看来需要对各个分类的RSS进行进一步的性能优化。

php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...

浅谈PHP链表数据结构(单链表)链表&#xff1a;是一个有序的列表&#xff0c;但是它在内存中是分散存储的&#xff0c;使用链表可以解决类似约瑟夫问题&#xff0c;排序问题&#xff0c;搜索问题&#xff0c;广义表单向链表&#xff0c;双向链表&#xff0c;环形链表PHP的底层是…

Xamarin.Forms 5.0 来了

Xamarin.Forms 5.0 已经正式发布&#xff0c;并带来其新功能&#xff0c;具体看官方博客https://devblogs.microsoft.com/xamarin/xamarin-forms-5-0-is-here/。在很大程度上&#xff0c;它是关于稳定版本功能的正式发布的&#xff0c;这些功能已在实验版本中获得使用&#xff…

中国的怪现象

在中国&#xff0c;因为各种各样的原因&#xff0c;会冒出一些怪现象。以前我经常与人谈的一个就是“盈利机构在亏损&#xff0c;非盈利机构在赚钱”。我不知道这个算不算是共识&#xff0c;但是&#xff0c;我的确看到一些这样的情况。因为我们经常看到某些应该盈利的国有企业…

PHP秒杀截流原理,节流阀和去抖动的基本实现方法介绍

本篇文章给大家带来的内容是关于节流阀和去抖动的基本实现方法介绍&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。节流阀throttle触发的事件以周期的形式去执行&#xff0c;而非实时。如滴水的水龙头。function throttle (f…

ML.NET 推荐引擎中一类矩阵因子分解的缺陷

ML.NET 作为 .NET 跨平台的机器学习套件&#xff0c;在回归、预测、分类甚至是图像识别、异常检测都展现出简洁快速的优势&#xff0c;以往的文章已介绍过不再赘述。其实机器学习场景中还有一类非常常见的&#xff0c;就是推荐&#xff0c;特别是在线购物、文娱产品为了提升用户…

建立用户、密码类型

每次做用户密码等类型的验证都很麻烦&#xff0c;最近想了个办法来简化判断的逻辑。.Net中提供了隐式转换&#xff0c;虽然降低了代码可读性&#xff0c;但是使用确实很方便。而且我认为&#xff0c;定义自己的类型使用它并不会降低可读性。可以定义用户类型UserName1 usingSys…