使用 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,一经查实,立即删除!

相关文章

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;消费者处理完消…

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

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

每日一题——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…

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

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

晋升新一线的合肥,跨平台的.NET氛围究竟如何?

大伙可能不知道&#xff0c;2020年合肥已经成功晋升为新一线城市了。本文通过对目前合肥.NET招聘信息以及公众号的相关数据的分析来看下目前合肥.NET的大环境。就着2020中国.NET开发者峰会顺利举行的东风&#xff0c;同时为进一步提升合肥地区的.NET技术氛围&#xff0c;一些合…

开源项目barcodelib-C#条形码图像生成库

介绍该库旨在为开发人员提供一个简单的类&#xff0c;以便他们在需要根据数据字符串生成条形码图像时使用。用法该库包含一个名为BarcodeLib的类&#xff0c;其中包含三个构造函数&#xff1a;Barcode(); Barcode(string); Barcode(string, BarcodeLib.TYPE);如果决定使用参数创…

ctf php 读取flag,BugkuCTF flag.php(反序列化)

进去后是个登录页面&#xff0c;但是login根本不会跳转&#xff0c;看源码也没提示&#xff0c;但是这道题给了一个提示&#xff1a;hint&#xff0c;那么盲猜应该是一个get参数&#xff0c;因为post不能跳转&#xff0c;那么get总有内容吧&#xff0c;跟上hint参数&#xff0c…

2021技术人新展望

一、前言各位小伙伴们还有几天新的一年即将来临&#xff0c;这篇文章作为今年的结束吧。不知道大家对自己每一年的技术发展规划是什么&#xff0c;我在这里分享一下我2021年的新的规划&#xff0c;这里非常感谢各位小伙伴对我的关注。二、内容概要2021的布局客户端技术分享服务…

在 ASP.NET 中实现会话状态的基础

简介 在 Web 应用程序这样的无状态环境中&#xff0c;了解会话状态的概念并没有实际的意义。尽管如此&#xff0c;有效的状态管理对于大多数 Web 应用程序来说都是一个必备的功能。Microsoft ASP.NET 以及许多其他服务器端编程环境都提供了一个抽象层&#xff0c;允许应用程序基…

【One by One系列】IdentityServer4(三)使用用户名和密码

继续介绍IdentityServer4,我们上篇介绍了IdentityServer4实现OAuth2.0的授权方式之一的客户端凭证&#xff0c;接下来我们继续介绍OAuth2.0的另外一种授权方式密码式&#xff0c;Resource Owner Password Credentials。post请求token?grant_typepassword&usernameUSERNAME…

【One by One系列】IdentityServer4(二)使用Client Credentials保护API资源

书接上回&#xff0c;我们将会正式开始介绍IdentityServer4。IdentityServer4是实现了OAuth2.0OpenId Connect两种协议的优秀第三方库,属于.net生态中的优秀成员。可以很容易集成至ASP.NET Core&#xff0c;颁发token。使用Id4基本步骤如下&#xff1a;**1.**在Startup.Configu…

使用 Avalonia 开发 UOS 原生应用

最近很火的是国产的操作系统 UOS 系统&#xff0c;这个系统现在存在的问题就是生态没搭建起来。作为 dotnet 开发者&#xff0c;可以通过很多不同方向的技术为 UOS 系统生态贡献应用&#xff0c;如 Xamarin 和 GTK# 或 wine 和 win32 应用&#xff0c;或 mono 和 WinForms 应用…

云原生那些顶级开源项目,你都用过哪些?

CNCF&#xff0c;英文全称为Cloud Native Computing Foundation&#xff0c;中文译为“云原生计算基金会”, 构建可持续生态系统&#xff0c;并围绕一系列高质量开源项目促进社区的发展&#xff0c;本文大概介绍下几个主要的项目。???? Kubernetes⭐ Star: 73.5k https://g…

2021年首届.NET线下沙龙上海站 - 2021 .NET Meetup in Shanghai

.NET Conf 2020 刚刚在苏州落下帷幕&#xff0c; .NET 开发者们的热情不减&#xff0c;来自五湖四海的朋友一起参加疫情之下的 .NET 盛会。2021年上海第一场线下活动就要来了&#xff0c;快来加入我们一起学习.NET 吧&#xff01;活动时间&#xff1a;2021年1月23日 13:00-18:0…

跟我一起学Redis之加个哨兵让主从复制更加高可用

前言主从复制的实现在上一篇已经分享过&#xff0c;虽然主从复制本身的确让读写分离更加高效&#xff0c;但是对于整体高可用存在很大的劣势&#xff1a;当主节点宕机了之后还需要人为重新进行主从关系配置&#xff1b;这不是开玩笑嘛&#xff0c;这样人为干预&#xff0c;故障…

智能实验室-全能优化(Guardio) 4.0.0.670 beta 8

怎样获取最新版本&#xff1f;□全新下载&#xff1a;全能优化(Guardio)&#xff1a;http://files.cnblogs.com/unruledboy/Guardio.Release.zip智能实验室&#xff0d; 全能优化(Guardio) 4.0.0.670 beta 8 更新记录&#xff1a; 1.添加&#xff1a;系统加速 之 系统速度&…