TowardsDataScience 博客中文翻译 2021(一百一十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

宣布 Streamlit 应用的主题化!🎨

原文:https://towardsdatascience.com/announcing-theming-for-streamlit-apps-834ff831ac17?source=collection_archive---------31-----------------------

尝试新的黑暗模式和自定义主题功能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们喜欢认为 Streamlit 应用程序开箱后就很漂亮(希望你也是!),但直到今天,改变外观和感觉来反映你的个人风格或公司的视觉品牌还不容易。Streamlit Theming 现在允许您轻松地更改应用程序中的配色方案和字体,而无需接触任何 HTML 或 CSS。

此外,为了便于访问和用户友好,我们还让应用程序查看者能够在亮暗主题之间切换。

如果你想直接进入,看看这个示例应用

引入黑暗模式!

在我们进入自定义主题之前,我们先来谈谈黑暗模式。

根据大众需求,我们现在为应用程序查看者提供定制他们想要如何体验您的应用程序的能力。这对于在黑暗环境中使用应用程序的人,或者具有辅助功能需求、希望覆盖应用程序自定义主题的人非常有用。

要在各种主题之间切换,请进入右上角的菜单并选择设置。你会看到一个重新设计的设置对话框,让应用程序用户在不同的主题选项之间进行选择:

  • 灯光模式:这是你已经知道并喜爱的 Streamlit 主题
  • 黑暗模式:这是 Streamlit 新的黑暗主题。你也会喜欢这个的!
  • 使用系统设置 : Streamlit 会自动拾取你的操作系统主题(亮或暗),并随你的 OS 改变颜色(注意:可能不适用于某些浏览器和 Linux 发行版)。
  • 自定义主题(仅在 app 作者提供时可见):使用 app 作者提供的主题。如果提供,这是默认设置。否则,“使用系统设置”是默认设置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建自定义主题

主题通过 Streamlit 的配置系统设置。你可以直接在那里设置主题,或者你可以使用我们新奇的主题编辑器界面来构建一个主题,然后把它复制到你的配置中。

使用主题编辑器创建主题

应用程序开发人员只需进入菜单→设置→编辑活动主题,即可创建自定义主题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

:主题编辑器菜单仅在local开发中可用。如果您已经使用 Streamlit 共享部署了您的应用,“编辑活动主题”按钮将不再显示在“设置”菜单中。

直接使用config.toml创建主题

自定义主题也可以在配置文件中定义:./.streamlit/config.toml

[theme]部分,可以定义颜色变量来创建自定义主题

[theme]

# Primary accent for interactive elements
primaryColor = '#7792E3'

# Background color for the main content area
backgroundColor = '#273346'

# Background color for sidebar and most interactive widgets
secondaryBackgroundColor = '#B9F1C0'

# Color used for almost all text
textColor = '#FFFFFF'

# Font family for all text in the app, except code blocks
# Accepted values (serif | sans serif | monospace) 
# Default: "sans serif"
font = "sans serif"

(:一次只能设置一个自定义主题)

来自配置文件的实时更新

您知道当您更改其源代码时,您的 Streamlit 应用程序是如何实时更新的吗?我们现在也这样做,当你更新应用的配置文件!这样,直接在配置文件中编辑主题将使你的应用程序立即显示新的主题。

每种颜色设置的作用

Streamlit 的主题系统遵循一种将颜色和字体应用于应用程序的全球方法。颜色样式有语义名称和一种简单的颜色规范方法。

  • 原色:交互元素的强调色,如st.radio,按钮边框等。默认情况下,这是粉红色的。
  • 背景颜色:这是你的应用程序主体的背景颜色。
  • **文字颜色:**漂亮不言自明!这是应用程序的文本颜色。
  • **次要背景色:**用作st.sidebar和几个小工具的背景。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

背景色和第二背景色在某种程度上是“互补的”,因为它们用于放置在基本元素“上面”的元素,以促进一致性和可及的对比度。这意味着st.number_input小部件在主体中定义时将使用Secondary background color作为背景色,但在侧边栏中定义时使用Background color。下图说明了这一点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

主题和自定义组件

如果你是一个组件作者,我们可以让你很容易地阅读你的 JS 和 CSS 代码中的主题颜色。要使用这项新功能,请安装或更新最新版本的streamlit-component-lib

npm install streamlit-component-lib

一旦这个包被更新,一个组件的背景和文本颜色将自动改变以匹配活动主题的颜色。附加的主题属性以两种等效的方式向组件公开:主题对象或主题样式。

作为一个反应道具

通过theme道具传递给组件的对象具有以下形状:

{
    "primaryColor": "someColor1"
    "backgroundColor": "someColor3",
    "secondaryBackgroundColor": "someColor4",
    "textColor": "someColor5",
    "font": "someFont",
}

作为 CSS 变量

--primary-color
--background-color
--secondary-background-color
--text-color
--font

如果你不熟悉 CSS 变量,TLDR 版本是你可以这样使用它们:

.mySelector {
  color: var(--text-color);
}

向组件公开主题属性的两种方法包含相同的信息,因此使用哪一种取决于个人偏好。让定制组件与主题一起工作的例子可以在这里找到。

找到你最喜欢的新主题

这是我们的贴图演示,有一个受“宁静光”启发的主题:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[theme]

primaryColor="#6eb52f"
backgroundColor="#f0f0f5"
secondaryBackgroundColor="#e0e0ef"
textColor="#262730"
font="sans serif"

以下是一个受“日晒”启发的主题示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[theme]

primaryColor="#d33682"
backgroundColor="#002b36"
secondaryBackgroundColor="#586e75"
textColor="#fafafa"
font="sans serif"

尝试主题化,让我们知道你的想法!

要尝试主题化,只需像往常一样升级到 Streamlit 的最新版本:

$ pip install streamlit --upgrade

我们迫不及待地想看到这个社区将要构建的又酷又神奇的主题。如果你创建了一个很酷的自定义主题,我们很乐意看到它,所以当你在 TwitterLinkedIn 或我们的论坛上分享时,请标记@streamlit

资源

宣布 YOLTv4:改进的卫星图像目标探测

原文:https://towardsdatascience.com/announcing-yoltv4-improved-satellite-imagery-object-detection-f5091e913fad?source=collection_archive---------10-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将高级目标探测扩展到任意大的卫星图像

前言:虽然 CosmiQ 作品 (及其相关博客:The DownLinQ)不幸被关闭,但在地理空间分析领域仍有许多工作要做。因此,这篇博客详细描述了 IQT 在业余时间独立完成的https://www.iqt.org工作。

在之前的一些博客[如 123 ]和学术论文[如 456 ]中,我们已经展示了采用 YOLO 探测卫星图像中的物体的惊人功效。回想一下,YOLO 是一个领先的深度学习对象检测框架,旨在检测图像中的对象。YOLO 最大限度地利用了几千像素大小的图像,这对于处理超过 1 亿像素的大规模卫星图像来说太小了。因此,我们构建了 YOLT (并用 SIMRDWN 扩展了 YOLT)来优化这个任意大尺寸卫星图像的目标检测框架。

我们现在很高兴地宣布,一个更快、性能更好的改进版本 YOLTv4 已经发布。代码在 github.com/avanetten/yoltv4 的开源。在下面的小节中,我们将详细介绍这个新的存储库,并提供示例结果。

1。简介

YOLTv4 旨在快速检测航空或卫星图像中任意大图像的对象,这些图像远远超过深度学习对象检测框架通常摄取的约 600×600 像素大小。这个库建立在 AlexeyAB 的 YOLOv4 实现的令人印象深刻的工作之上,与 YOLOv3(在 SIMRDWN 中实现)相比,它提高了速度和检测性能。我们用 YOLOv4 代替 YOLOv5,因为 YOLOv4 得到了 YOLO 原创者的认可,而 YOLOv5 没有;此外,YOLOv4 似乎具有优越的性能。

因此,YOLTv4 将令人印象深刻的 YOLOv4 主干与 SIMRDWN 的预处理和后处理脚本结合起来,创建了一个改进的、轻量级的替代 SIMRDWN。回想一下,SIMRDWN 允许用户从众多主干中进行选择(例如,YOLO、固态硬盘、fast-RCNN 等。).虽然这种灵活性非常有用,但它确实扩大了代码库;此外,多项研究[ 56 ]表明,YOLO 骨干网在卫星图像目标检测方面优于其他方法。因此,在 YOLTv4 中,我们选择构建一个更简单的代码库,并且只关注 YOLOv4 的主干。

下面,我们提供了如何使用开源稀有面数据集的例子。

2。运行 YOLTv4

在本节中,我们将演示如何使用稀疏飞机数据集来训练和测试 YOLTv4,以定位飞机。

2.1。安装

YOLTv4 构建为在支持 GPU 的机器上的 docker 容器中执行。docker 命令使用 CUDA 9.2、python 3.6 和 conda 创建 Ubuntu 16.04 映像。

  1. 克隆这个库(例如克隆到 /yoltv4/ )。
  2. 将模型重量下载到 yoltv4/darknet/weights(如见:https://github . com/AlexeyAB/dark net/releases/download/dark net _ yolo _ v3 _ optimal/yolov 4 . conv . 137)。
  3. 安装 nvidia-docker
  4. 构建 docker 文件。nvidia-docker build -t yoltv4_image /yoltv4/docker
  5. 旋转对接容器(选项见对接文件)。nvidia-docker run -it -v /yoltv4:/yoltv4 -ti — ipc=host — name yoltv4_gpu0 yoltv4_image
  6. 编译 Darknet C 程序。先在/yoltv 4/darknet/Makefile中设置 GPU=1 CUDNN=1,CUDNN_HALF=1,OPENCV=1,然后:
    cd /yoltv4/darknet make

2.2。列车

A .准备数据

  1. 制作 YOLO 图像和标签(详见yoltv 4/notebooks/prep _ data . ipynb*)。*
  2. 创建一个列出训练图像的 txt 文件。
  3. 创建文件 obj.names 文件,每个所需的对象名称各占一行。
  4. 在包含必要文件的目录 yoltv4/darknet/data 中创建文件 obj.data。例如/yoltv 4/darknet/data/rare planes _ train . data:* classes = 30
    train =/local _ data/cosm IQ/wdata/rare planes/train/txt
    valid =/local _ data/cosm IQ/wdata/rare planes/train/txt/valid . txt
    names =/yoltv 4/darknet/data/rare planes . name
    backup = backup*
  5. 准备配置文件。
    参见此处的说明,或者调整
    /yoltv 4/darknet/CFG/yoltv 4 _ rare planes . CFG*。*

B .执行培训

  1. 执行。
    cd /yoltv4/darknet time ./darknet detector train data/rareplanes_train.data cfg/yoltv4_rareplanes.cfg weights/yolov4.conv.137 -dont_show -mjpeg_port 8090 -map
  2. 审查进度(见下图 1):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。YOLTv4 训练进度(保存为/yolt v4/darknet/chart _ yolt v4 _ rare planes . png*)*

2.3。测试

A .准备数据

  1. 制作切片图像(详见yoltv 4/notebooks/prep _ data . ipynb*)。*
  2. 创建一个列出训练图像的 txt 文件。
  3. 在包含必要文件的目录 yoltv4/darknet/data 中创建文件 obj.data。例如/yoltv 4/darknet/data/rare planes _ test . data:*
    classes = 30
    train =
    valid =/local _ data/cosm IQ/wdata/rare planes/test/txt/test . txt
    names =/yoltv 4/darknet/data/rare planes . name
    backup = backup/*

B .执行测试

  1. 执行(在特斯拉 P100 上以每秒 80 帧以上的速度进行):
    cd /yoltv4/darknet
  2. time ./darknet detector valid data/rareplanes_test.data cfg/yoltv4_rareplanes.cfg backup/ yoltv4_rareplanes_best.weights
  3. 后处理检测,将图像拼接在一起,并制作绘图:
*time python /yoltv4/yoltv4/post_process.py \
 — pred_dir=/yoltv4/darknet/results/rareplanes_preds_v0/orig_txt/ \
 — raw_im_dir=/local_data/cosmiq/wdata/rareplanes/test/images/ \
 — sliced_im_dir= /local_data/cosmiq/wdata/rareplanes/test/yoltv4/images_slice/ \
 — out_dir= /yoltv4/darknet/results/rareplanes_preds_v0 \
 — detection_thresh=0.25 \
 — slice_size=416 \
 — n_plots=8*

3。输出

输出将类似于下图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。从开源的稀有飞机数据集中检测到飞机。

4。结论

YOLTv4 是高性能和相当迅速的。在单个特斯拉 P100 GPU 上,即使在最高分辨率的 30 厘米卫星图像上,推理也能以每秒约 2 平方公里的速度进行。以这种速度,一个简单的 4-gpu 集群可以近乎实时地处理整个 WorldView-3 收集。所以,请随意旋转代码来寻找汽车船只基础设施项目飞机建筑,或者任何你感兴趣的东西。

新加坡节约的再生能源——一个数据分析项目

原文:https://towardsdatascience.com/annual-recycled-energy-saved-in-singapore-2d6bad49bfb2?source=collection_archive---------14-----------------------

了解新加坡每年通过回收塑料、纸张、玻璃、黑色金属和有色金属节约了多少能源。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由作者|元素由宏向量Freepik

介绍

由于政府担心不断增加的垃圾处理量,英格波尔成为了一个零垃圾国家的新里程碑。按照目前的速度,到 2035 年,三宝垃圾填埋场将会耗尽空间,这对新加坡人来说是一个令人担忧的情况。更糟糕的是,新加坡用于建设新焚烧厂或垃圾填埋场的土地有限。政府希望通过分享联合回收努力每年节省的总能量来激励公民。

https://www.nea.gov.sg/our-services/waste-management

我们将使用回收统计数据来计算从 2003 年到 2020 年每年节约的能源,基于五种废物类型:塑料、纸张、玻璃、黑色金属和有色金属。

密码

加载数据集

我们将使用 Plotly 进行可视化,使用 Pandas 进行数据分析。我们的数据集分为两个时间线,从 2003 年到 2017 年和 2018 年到 2020 年。2020 年的数据是通过 NEA 网站手动添加的。您可以在 Greentumble 上找到每种材料类型的额外能量数据。

2018 年至 2020 年的废物数据

经过初步探索,我们发现两个数据集中的列名不同,因此我们将对 2018 年至 2020 年的数据集进行重命名,并将千吨值转换为公吨值。

让我们将回收率添加到我们的数据框架中,因为我们将使用它进行进一步的分析。

节能数据集

我们可以看到节能数据集的表格格式不正确。让我们把它转换成可读的格式。

  1. 移项
  2. 删除前两列和第一行
  3. 重置索引
  4. 重命名列

我们可以看到,我们有三栏,材料节能原油节能

2003 年至 2017 年的废物数据

我们将限制我们的列,以匹配 2018 年至 2020 年数据集的列,以便它们可以很容易地连接。

数据分析

我们将堆叠两个数据集,因为它们有相似的列。最终数据集包含 2003 年至 2020 年的样本。

让我们看一下每年产生的废物总量和回收的废物总量。

到 2017 年,垃圾收集量迅速增加,此后,由于政府干预,我们可以看到垃圾收集量的下降。由于新冠肺炎疫情的影响,去年 NEA 的垃圾收集量急剧下降。

通过分析数据集中的分类废物类型,我们可以清楚地看到同一类别有不同的名称。我们来做一些文字处理,尽量做出和cleaned _ energy _ saved . CSV中提到的素材类似的类别。

通过使用简单的字符串替换,我们已经规范化了我们的类别,这样我们就可以在 waste_type 上合并我们的数据。

为了检查我们是否成功地规范化了类别,让我们合并关于 waste_typematerial 的两个数据集。

我们需要通过删除“Kwh”和“kWh”将节省的能源从字符串转换为整数。

正如我们所看到的,节省的能量被成功地转换成一个整数,这样我们就可以用它来计算每年节省的总能量。

我们需要通过将total_waste_recycled_tonneenergy_saved相乘来创建新的特征total_energy_saved

形象化

让我们计算每种废物的平均回收量。黑色金属和有色金属的总体回收率较高,塑料的回收率最低。

我们必须使用箱线图来检查最终数据中的异常值和模式。我们发现在 2018 年有一个异常,为了找出它,我们必须检查我们的数据集。

经过查看 2018 年回收的废物总量,我们发现黑色金属产生的废物总量为 126900 吨,而回收的废物总量为 126000 吨。正如我们所知,黑色金属的平均回收率为 90%以上,但它显示的是 10%,这很奇怪,所以我回到了网站上的原始数据,并发现了错误。我们可以在 PDF 中看到,整个零都不见了。

让我们更新该值并再次检查盒图,正如我们所看到的,它现在看起来很完美。这个故事的寓意是,总是回去检查数据是否有错误。

总节能量的箱线图到处都是,因为一些材料每公吨产生更高的能量千瓦时。

我们更多地与数据互动,并在多级散点图中寻找模式。

正如我们所见,由于政府采取措施控制废物的产生,在过去几年中,从纸张和塑料中节省的总能量已经显著减少。

每年节约的能源

现在是时候计算从 2003 年到 2020 年每年节省的能源了,基于五种废物类型,塑料,纸张,玻璃,黑色金属和有色金属。

  • 每年分组依据
  • 总结和提取节省的总能量
  • 将其转换成熊猫数据帧
  • total_energy_saved从浮点数转换为整数

我们现在将通过使年度节能量可读

  • 将 kWh 转换为 GWh
  • 四舍五入到小数点后两位。
  • 添加 GWh 后缀
  • 显示过去五年的数据

最后的想法

我们已经清理了数据,并确保它可以与其他数据集合并。我们还学习了如何检测数据集中的异常并创建新功能。这个项目很简单,但是它教会了我们很多关于数据清理和数据可视化的东西。由于 Covid 19,垃圾收集量已经停止,因此 2020 年节省的回收能源相对较少。政府的举措也影响了整体垃圾产量,因为人们正在从塑料转向更环保的材料。与其他废物类型相比,纸张和有色金属材料产生的能量最高,我们看到这两种材料的能量都在减少。

这篇文章是初学者友好的,详细解释了数据清理和可视化。我还在下面分享了我的项目代码,这样你就可以克隆并开始与项目文件交互。

代码可从以下网址获得:

深度笔记

https://deepnote.com/project/Singapore-Recycled-Energy-Xh_wbptwTn2l-I1GQ-O1Vw/%2FAnnual-Recycled-Energy-Saved-in-Singapore%2FREADME.md

开源代码库

https://github.com/kingabzpro/Annual-Recycled-Energy-Saved-in-Singapore

卡格尔

https://www.kaggle.com/kingabzpro/singapore-recycling-and-waste-management

学习资源

DataCamp 课程 : 使用 Python 的数据分析师

https://www.goodreads.com/book/show/23594979-data-analytics-made-accessible https://github.com/WillKoehrsen/Data-Analysis/tree/master/medium

异常检测备忘单

原文:https://towardsdatascience.com/anomaly-detection-cheat-sheet-5502fc4f6bea?source=collection_archive---------24-----------------------

在 6 分钟内你应该知道的异常检测

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

异常检测。作者图片

在本文中,您将找到一份完整的异常检测备忘单。在六分钟内,你将能够知道它是什么,并刷新主要算法的记忆。

异常检测(也称为异常值检测)是检测异常实例的任务,这些异常实例与正常情况非常不同。这些实例被称为异常(或异常值),而正常实例被称为内联者

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Scikit Learn 的异常检测算法。图像来源

异常检测在各种各样的应用中是有用的,最重要的是:

  • 数据清理 —在训练另一个模型之前从数据集中移除离群值
  • 直接异常检测 *任务:*欺诈检测,检测制造中的缺陷产品等。

您可能已经注意到,使用异常检测算法也可以解决不平衡分类的一些问题。但是你需要理解其中的区别——这是两种完全不同的方法。

分类的情况下,我们希望了解什么样的异常(正面例子)看起来像,以便在未来检测类似的实例。在异常检测的情况下,未来的异常可能看起来与我们之前见过的任何例子都完全不同。因为我们的数据集是未标记的,我们只能怀疑正常的数据点看起来如何,并将任何其他实例视为异常。

例如,垃圾邮件检测任务可以被认为是分类任务(当我们有足够的垃圾邮件来了解垃圾邮件应该是什么样子时),也可以被认为是异常检测任务(当我们必须了解正常电子邮件看起来是什么样子并将任何其他电子邮件视为垃圾邮件时)。

一个密切相关的任务是**新颖性检测,**但在这种情况下,算法被假定为在干净的数据集上训练(没有离群值)。当需要识别一个新实例是否是离群点时,它被广泛用于在线学习。

另一个相关的任务是密度估计。这是估计数据集生成的过程的概率密度函数的任务。基于密度概念(高斯混合模型DBSCAN )的聚类算法通常可以解决这个问题,并且还可以帮助进行异常检测和数据分析。

统计方法

检测异常值最简单的方法是尝试很久以前开发的统计方法。其中最受欢迎的一种被称为异常值检测的 Tukey 方法(或四分位数间距(IQR) )。

它的本质是计算百分位数和四分位数之间的范围。位于Q1-1.5 * IQR之前和 Q3 + 1.5IQR* 之后的数据点被视为异常值。下面你可以看到使用人身高数据集的例子来说明这种方法。低于 54.95 英寸(139 厘米)和高于 77.75 英寸(197 厘米)的身高被视为异常值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以身高为例的 Tukey 异常值检测方法。作者图片

这种方法和其他统计方法(用于检测异常值的 z-score 方法等)。)通常用于数据清理。

聚类和降维算法

另一种简单、直观且通常有效的异常检测方法是使用一些聚类算法解决密度估计任务,如高斯混合模型DBSCAN 。然后,位于具有较低密度水平的区域中的任何实例都可以被认为是异常,我们只需要设置一些密度阈值。

此外,可以使用任何具有inverse_transform()方法的降维算法。这是因为异常的重建误差总是比正常情况下的大得多。

隔离森林和 SVM

一些监督学习算法也可以用于异常检测,最流行的两个是隔离森林SVM 。这些算法更适合于新奇检测,但通常也适用于异常检测。

隔离森林算法构建了一个随机森林,其中每棵决策树都是随机生长的。每走一步,这片森林就会隔离越来越多的点,直到所有的点都被隔离。由于异常的位置远离通常的数据点,它们通常比正常情况下被隔离的步骤少。该算法对于高维数据表现良好,但是需要比 SVM 更大的数据集。

SVM (在我们的例子中是一级 SVM )也被广泛用于异常检测。感谢内核技巧内核化的 SVM 可以构建一个有效的“极限超平面”,它将正常点与离群点分开。像任何 SVM 修正一样,它可以很好地处理高维或稀疏数据,但只适用于中小型数据集。

局部异常因素

局部异常因子( LOF )算法基于异常位于低密度区域的假设。然而,它不是仅仅设置一个密度阈值(就像我们对 DBSCAN 所做的那样),而是将某个点的密度与其最近邻居的密度进行比较。如果这个点的密度比它的邻居低得多(这意味着它离他们很远),它就被认为是一个异常点。

该算法既可以用于异常检测,也可以用于异常检测。由于它的计算简单且质量好,所以经常被使用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过 Scikit 学习局部异常值因子。图像来源

最小协方差行列式

最小协方差行列式( MCD 或其变形 Fast-MCD )对于异常值检测非常有用,特别是对于数据清理。它假设内点是从单个高斯分布生成的,而离群点不是从这个分布生成的。由于许多数据具有正态分布(或者可以简化为正态分布),因此该算法通常表现良好。它是在EllipticEnvelope sklearn 类中实现的。

如何选择一种异常检测算法?

如果您需要清理数据集,您应该首先尝试经典的统计方法,如用于异常值检测的 Tukey 方法。然后用 Fast-MCD ,如果你知道你的数据分布是高斯的。

如果你做异常检测不是为了数据清洗,首先尝试简单快速的**局部离群因子。**如果效果不好(或者出于某种原因需要分离超平面)——根据你的任务和数据集尝试其他算法:

  • 稀疏高维数据的一类 SVM 或密集高维数据的隔离林
  • 高斯混合模型如果你可以假设数据是由几个高斯分布混合生成的
  • 诸如此类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

异常检测算法选择。作者图片

本文是以下内容的一部分:

您可能还对以下内容感兴趣:

感谢您的阅读!

  • 我希望这些材料对你有用。在 Medium 上关注我可以获得更多类似的文章。
  • 如果您有任何问题或意见,我将很高兴得到任何反馈。在评论中问我,或者通过 LinkedInTwitter 联系我。
  • 为了支持我作为一名作家,并获得数以千计的其他媒体文章,使用我的推荐链接获得媒体会员资格(不收取额外费用)。

异常检测——如何区分性能好坏

原文:https://towardsdatascience.com/anomaly-detection-how-to-tell-good-performance-from-bad-b57116d71a10?source=collection_archive---------4-----------------------

行业笔记

通常很难评估性能和量化工具对业务的潜在影响。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由阮当黄虎Unsplash 上拍摄

摘要

  • 除了准确性之外,假阳性假阴性率是评估绩效的合理、直观的方法
  • **并非所有的异常检测器都是相同的:**异常检测器之间的性能分数可能会有很大的不同,这些异常检测器针对业务指标对相同的真实时间序列数据进行操作
  • 在我们的测试数据中, **Avora 的异常检测器实现了比脸书 Kats 更好的性能,具有明显更低的假阳性&阴性率,**但相当的准确性
  • 通过超参数调整,甚至可以实现更低的假阳性/假阴性率,而不会降低精确度

介绍

世界各地的每家企业都有越来越多的数据可用于分析绩效和做出数据驱动的决策。然而,相当多的公司发现他们自己有太多的数据,不可能被人跟踪和分析。因此,人工智能驱动的商业智能工具,特别是异常检测,在商业成功中发挥着越来越重要的作用。

商业智能并不缺少产品和解决方案,但是通常很难评估性能和量化工具对业务的潜在影响。难以评估的原因包括:

  1. 缺乏与嘈杂的真实业务绩效数据相关的绩效比较数据集
  2. 绩效是用复杂的科学指标来描述的,这些指标不容易转化到商业世界中。

Avora 中,我们使用基于业务数据的真实生活时间序列创建了一个评估管道,以根据著名的脸书·卡茨异常检测器对 Avora 的性能进行基准测试,该检测器与流行的脸书先知包紧密相关。

直观地衡量和解释绩效

除了准确性,评估异常检测解决方案时最常用的指标是 F1精度召回。人们可以按以下方式考虑这些指标:

  • 回忆用于回答以下问题:*真正的异常被识别的比例是多少?*计算如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 精度回答问题:识别出的异常有多大比例是真异常?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • F1 得分使用调和平均值,通过结合召回率和精确度来确定异常检测模型的整体性能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例如:

您正在将销售指标作为 KPI 之一进行跟踪。您会收到一个通知,告知您已经识别出 10 个异常。您检查图表并确认10 个日期中只有 6 个确实是异常。然而,您也注意到还有其他 9 个日期的销售指标表现异常,您会认为它们是异常。因此,现在您有 6 个正确识别的异常(真阳性),4 个错误识别的异常(假阳性)和 9 个遗漏的异常(假阴性)。

在这种情况下,度量值将是:

  • 回忆:6 / (6 + 9) = 0.4
  • 精度:6 / (6 + 4) = 0.6
  • F1 得分:2 * (0.4 * 0.6) / (0.4 + 0.6) = 0.48

假阳性和假阴性率

在决定异常检测系统时,关注指标很重要:误报率和漏报率。

假阳性率帮助您了解平均有多少次,您的检测器会发出“狼来了”的警报,并标记实际上不是真正异常的数据点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上例中,假阳性率为 0.4 或 40% —系统识别出 10 个异常,其中只有 6 个是真异常。这意味着 40%检测到的异常事实上根本不是异常。

选择假阳性率最低的系统。如果假阳性率太高,用户将关闭系统,因为它更令人分心而不是有用。

假阴性率显示平均有多少异常被检测机遗漏。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在示例中的假阴性率是 9/15 = 0.6 或 60% 。该系统确定了 6 个真正的异常,但遗漏了 9 个。这意味着系统遗漏了数据中 60%的异常。

选择假阴性率最低的系统。如果假阴性率太高,你将会错过许多关键的异常,最终你会对系统失去信任。

方法学

为了进行性能比较,我们创建了一个旨在提供客观、公正评估的系统。

  1. 来自真实生活例子的时间序列数据被收集和匿名化。
  2. 在性能评估之前,异常被手动标记——这被存储为基于分析师评估的地面真实数据集,独立于任一算法的结果。
  3. 地面真实数据集被一条管道使用,该管道仅在 Avora 和 KATS 异常检测算法完成标记后执行评估。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

绩效评估设置和阶段

结果和分析

下面你可以看到 Avora 和 Kats 在 19 个匿名数据集上的结果,跨越多个商业领域。这些结果代表了算法在生产环境中的表现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Kats 和 Avora 算法的关键指标结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所用每个数据集的 Kats 和 Avora 性能指标

取所有数据集的平均值,Avora 的异常检测算法在每个指标(准确度、精确度、召回率、F1)上都比脸书·KATS 获得了更高的分数。同样值得一提的是,对于 KATS,精确度和召回率有更大比例的极端得分(0 或 1),这取决于数据集。

虽然令人鼓舞,但这些测量突出了需要改进的地方,特别是在精度方面(Avora 算法的平均值为 0.51)。

通过检查假阳性和假阴性率,我们看到 KATS 没有检测到这些数据集集合中大约 80%的异常(如地面实况中所标记的),这可能会导致用户质疑在现实生活的业务数据上部署当前形式的 Kats 算法的有效性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Kats 和 Avora 的假阳性和假阴性率

时间序列和异常比较

我们将更详细地介绍两个数据集的结果:数据集 ID 85693 和数据集 ID 2258。与 Avora 不同,脸书·KATS 的输出不提供检测包络,仅将特定数据点标记为异常。

在线销售-数据集 ID 2258

下图显示了数据集 ID 2258 的手动标注、阿维拉异常检测标注和脸书 KATS 异常检测标注的输出。在这种情况下,提供地面实况的分析师确定了 2019-20 年的高峰和 2020 年夏季的显著下降。

Avora 的算法已经成功地将峰值和夏季下降识别为异常。除此之外,它在 2019 年深秋出现了较小的下降,以及其他较小的峰值和下降。一些人可能会认为,算法标记的那些额外异常中的一些(例如,2019 年 11 月)可以被视为地面真相中的异常。

脸书·KATS算法只成功地发现了峰值,没有将任何长期的下降识别为异常——这是一个问题,因为销售或收入的突然下降对任何企业来说都是非常重要的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集 ID 2258 的手动标注、Avora 输出和 Kats 输出

API 网关错误-数据集 ID 85693

事实上,分析师将 2021 年 4 月的一次飙升和 2020 年 11 月/12 月的两次短期下跌称为异常。Avora 异常检测公司设法找到了所有的异常区域。

另一方面,Kats 只设法捡起了尖峰本身,并在 2021 年 4 月尖峰之前引入了许多假阳性——我们解释说 KATS 对较小幅度的变化不太敏感,这可能对用户仍然有用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集 ID 85693 的手动标注、Avora 输出和 Kats 输出

进一步研究—降低假阳性/假阴性率

这种比较是使用每种算法的默认参数进行的——不可能找到允许 Kats 改变异常检测灵敏度的参数。

Avora 的异常检测系统允许用户修改输入参数以改善结果,这是用户应该采取的自然步骤。通过搜索参数空间,我们观察到,如果输入参数针对单个数据集进行优化,结果可以得到显著改善。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集 ID2258 的手动标记和优化的 Avora 算法输出

例如,优化数据集 ID 2258(在线销售)的参数显著改善了所有指标的结果— 误报率几乎减半:

  • 精度:默认— 0.464,优化— 0.722 (越高越好)
  • 回忆:默认— 0.812,优化— 0.813 (越高越好)
  • F1 得分:默认— 0.591,优化— 0.764 (越高越好)
  • 精度:默认— 0.979,优化— 0.981 (越高越好)
  • 假阳性率:默认— 0.536,优化— 0.278 (27.8%) (越低越好)
  • 假阴性率:默认— 0.188,优化— 0.187 (18.7%) (越低越好)

Avora 异常检测方法的灵活性允许每个数据集根据每个用户所需的灵敏度进行定制,使用超参数优化,确保较低的假阳性和假阴性率。

摘要

  • 除了准确性之外,假阳性和假阴性率是评估性能的良好、直观的方法。
  • **并非所有的异常检测器都是相同的:**不同的异常检测器之间的得分可能会有很大的不同,这些异常检测器对测量业务绩效的相同的真实时间序列数据进行操作。
  • 在我们的测试数据集合中,Avora 的异常检测提供了比脸书 Kats 更好的性能,同时具有更低的误报率和漏报率。
  • 通过超参数调整,可以显著改善假阳性和假阴性率,而不会降低准确性。

机器学习评分模型中的异常检测

原文:https://towardsdatascience.com/anomaly-detection-in-a-machine-learning-scoring-model-205a942518e3?source=collection_archive---------23-----------------------

时间序列异常检测的统计技术

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

掷骰子将是本文所用方法的一个很好的类比。乔纳森·格林纳韦在 Unsplash 上拍摄的照片

在我最近的默认评分数据科学项目中,我希望有一个自动工具可以警告我,特别是在开发阶段,当我的模型预测不连贯时,无论是因为数据处理中出现了问题,还是因为模型需要重新训练。

主要的困难是分数的急剧上升或下降可能是不一致的,也可能是合理的,这意味着分数的变化是观测数据实际和显著变化的结果。

在不知道模型输出分布的情况下,做出这种区分是复杂的,尽管 SHAP 或 LIME 等可解释性工具有助于区分,但这意味着要逐一检查每个预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个在 XGBoost 模型上计算的 SHAP 值的例子,该模型是根据来自“住房信贷违约风险”Kaggle 竞赛的数据训练的。图片作者。

我们将在这里使用的关键原则是中心极限定理,利用它我们将研究从我们的模型预测中导出的正态或伪正态分布。由于这一点,我们将能够用一种完全自动化的方法来推断一个预测序列是一致的还是异常的。

掷骰子的类比

让我们把我们的模型看作一个骰子滚动。我们不知道骰子是否被装载,这意味着我们不知道它的概率分布。

然而,如果我们掷骰子 1000 次并平均结果,我们将得到一个稳定的值,如果我们重复这个过程,它不会改变太多。
例如,下面是我们通过对空载骰子进行 1000 次投掷的 3000 次迭代得到的图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

这里,即使我们不知道骰子是空载的,我们也知道掷骰子的平均值具有正态分布,其中 68%、95%和 99.7%的值位于平均值的一个、两个和三个标准差内。

如果骰子突然变化并被加载,它将立即可见:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

这里,掷骰子的结果是 6:掷出 6 的概率是 30%,其他值是 14%。如果骰子没有变,那么出现这种结果的概率极低,因此我们可以有把握地假设骰子被改变了。

回到模型

我对我的模型所做的是一样的。我取了之前每个月预测的平均分数,看看最新的预测是否与它们一致。

即使一些观察值合理地显著增加或减少了它们的分数,所有分数的平均值应该总体上遵循正态分布。这就是我们可以看到的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

如果一系列预测的平均值在平均值的两个标准差之外,我们可以将其视为异常并仔细分析。

该方法也可应用于月度预测的标准差。

计数异常

如果我们的骰子是 3 的话会怎么样?它会自然地将 1000 个滚动系列的平均值移向 3,但该值不会离平均值太远而被视为异常:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

骰子的位置有利于 3。图片作者。

这里,根据掷骰子的平均值看不出异常,但是如果我们在 1000 次掷骰子中数出 3 的次数,就可以看出异常:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

同样,三的数量遵循正态分布,装载骰子的结果明显异常。

在模型中,我们可以通过计算观察值的数量来应用这一点,这些观察值的得分有显著的增加或减少。
如果一半的观察值增加了 0.3,而另一半减少了 0.3,那么就预测值的平均值而言,结果是不可见的,但通过这种方法可以看到。

应用于我的模型,我得到了以下图表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

在这里,我保留了一份我的模型,几个月来根本没有训练它。我们可以从直方图和折线图中看到,该模型在 2021 年 6 月之后出现了退化的迹象。以前的数据分析表明,模型只需每年重新训练一次,但这种异常分析表明,这应该在 4 个月后发生。

处理异常情况

在多种原因中,异常可能发生,因为:
-数据处理管道
中存在异常-模型不稳定或必须重新训练
-存在外部因素。例如,如果出现经济危机,大多数观察值的默认分数将会急剧上升,因为它们的健康状况已经下降。反常不一定意味着不连贯。

在我的情况下,数据处理管道还没有最终确定,即使模型的重新训练频率已经被推断出来,我也想在当前数据上监控它。
因此,基于 CLT 的异常检测主要针对前两种情况。

支持物联网的智能电池管理系统中的异常检测

原文:https://towardsdatascience.com/anomaly-detection-in-iot-enabled-smart-battery-management-systems-4ae2419c6074?source=collection_archive---------12-----------------------

了解电子移动世界中数据工程和机器学习的使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

库姆潘电气un plash上拍摄的照片

我们生活在一个电动移动的世界里。从全球范围来看,电动汽车和两轮驱动汽车的使用正在急剧上升。电动移动设备依靠昂贵的可充电锂离子电池供电。这些电池是对抗化石燃料不良影响(如污染和成本上升)的不可或缺的组成部分。但是锂离子技术也有一些缺点,比如:

  • 温度升高和短路引起的火灾和爆炸
  • 充电过度/不足导致的使用寿命缩短
  • 由于老化,性能随着时间的推移而下降

全球锂离子电池市场规模预计在几年内将翻一番以上——从 2020 年的 440 亿美元到 2025 年的 940 亿美元

目前,与物理电池的采购及其维护相关的成本是采用该技术的一个主要障碍。几家锂离子电池制造公司现在正在开发智能电池管理系统,以帮助监控和跟踪锂离子电池的健康状况。电池管理系统有几个目标:

  1. 预防性分析监控层 —持续监控与火灾、爆炸相关的威胁
  2. 预测分析分析层 —预测故障,防止电池损坏,从而延长电池寿命

最近,我有机会为一家生产电动代步车电池的公司创建了这样一个智能电池管理系统。以下是该解决方案的高级架构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片 Azure Cloud 上智能电池管理系统的高级架构

  • 每个电池组都配有一个测量电池电压、电流和温度的电子物联网传感器
  • 使用 Wi-Fi 或蓝牙将传感器数据发送到 Azure 云(Azure 事件中枢或 Azure 物联网中枢)
  • 来自 Azure 事件中枢/Azure 物联网中枢的流数据使用 Azure 流分析进行计算
  • Azure Stream Analytics 作业执行异常检测。如果检测到异常,将生成警报并使用 Azure 通知中枢发送给用户

在接下来的部分中,我将向您展示我们如何使用 Azure 提供的基于机器学习的操作符—anomaly detection _ spike andipanomaly detection _ change point来执行异常检测。

AnomalyDetection _ SpikeAndDip 能够检测时间序列事件中的临时异常。

AnomalyDetection_ChangePoint 能够检测时间序列事件流中的持续异常

在这次演示中,我使用了 48V 25Ah 的锂离子电池。以下是电池的技术规格。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片 bu 作者—电池规格

对于这种电池,以下是推荐的水印。

上限电压— 54.6 V— 任何更高的电压都可能导致爆炸或火灾
下限电压— 39 V — 任何更低的电压都会影响电池的健康

电池管理系统的一个关键功能是监控这些关键值是否在推荐范围内。出于演示的目的,我将集中在高点电压。毕竟谁想要爆炸或火灾。

现在让我们开始实现。假设你已经有一个 Azure 帐户,请按照下面的步骤继续操作:

Azure> git clone [https://github.com/mkukreja1/blogs](https://github.com/mkukreja1/blogs)
Cloning into ‘blogs’…
remote: Enumerating objects: 149, done.
remote: Counting objects: 100% (149/149), done.
remote: Compressing objects: 100% (90/90), done.
remote: Total 149 (delta 54), reused 135 (delta 40), pack-reused 0
Receiving objects: 100% (149/149), 1.67 MiB | 41.71 MiB/s, done.
Resolving deltas: 100% (54/54), done.
  • 现在让我们创建一个 Azure 事件中心。您可以根据自己的喜好编辑资源组名称位置的名称。
RESOURCEGROUPNAME="training_rg"
LOCATION="eastus"
TOPIC="iotbattery"
EVENTHUB_NAMESPACE="iotbatteryspace"
EVENTHUB_NAME="iotbatteryhub"
EVENT_SUBSCRIPTION="iotbatteryevent"az provider register --namespace Microsoft.EventGrid
az provider show --namespace Microsoft.EventGrid --query "registrationState"
az eventgrid topic create --name $TOPIC -l $LOCATION -g $RESOURCEGROUPNAMEaz eventhubs namespace create --name $EVENTHUB_NAMESPACE --resource-group $RESOURCEGROUPNAME
az eventhubs eventhub create --name $EVENTHUB_NAME --namespace-name $EVENTHUB_NAMESPACE --resource-group $RESOURCEGROUPNAME
  • 要验证新创建的 Azure Event Hub,请导航到主页 > 所有资源 > iotbatteryspace。在左侧菜单中点击活动中心。现在点击新创建的事件中心 iotbatteryhub。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片—新创建的 Azure 事件中心

  • 点击过程数据,然后点击浏览。你现在应该在一个查询编辑器窗口中。我们需要创建一个共享访问策略来预览 Azure 事件中心中的数据。点击创建

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-查询编辑器窗口

  • 此时,我们已经准备好向新创建的 Azure event hub 发送一些事件。由于您没有实际的物联网传感器,我们可以使用下面的命令来模拟发送到 Azure 事件中心的五节电池的 100 个事件。在云外壳中调用下面的命令。
RESOURCEGROUPNAME="training_rg"
TOPIC="iotbattery"
EVENTHUB_NAMESPACE="iotbatteryspace"
EVENTHUB_NAME="iotbatteryhub"
EVENTHUB_CONN_STR=$(az eventhubs namespace authorization-rule keys list --resource-group $RESOURCEGROUPNAME --namespace-name $EVENTHUB_NAMESPACE --name RootManageSharedAccessKey --query "primaryConnectionString" --output tsv)
for VARIABLE in {1..100}
do
 echo "Sending event $VARIABLE"
 python ~/blogs/eventhubs/iot/send_battery_events_normal_reading.py --EVENTHUB_NAME $EVENTHUB_NAME --EVENTHUB_CONN_STR $EVENTHUB_CONN_STR
done
  • 我们现在可以验证事件数据是否出现在 Azure 事件中心。回到 Azure 门户查询编辑器。在输入预览页签中,按刷新。现在,您应该在查询窗口中看到新发送的事件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-事件数据

  • 检查从物联网事件收到的读数。在查询编辑器中调用下面的 SQL。
SELECT data.Timestamp, data."Battery Pack", data."Terminal Voltage", data."Charging Current", data."Discharging Current",data."SoC", data."Charge Capacity", data."Charging Power", data."Discharging Power", data."Cycle Count"
FROM [iotbatteryhub]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片-活动阅读

  • 我们现在准备实施异常检测。记住,我们要监控电池电压的尖峰电压,因为它们可能是危险的。调用下面的 SQL 来检查收到了多少个峰值。
WITH batteryAnomalyDetection AS
(
    SELECT
        data.Timestamp AS time,
        CAST(data."Terminal Voltage" AS float) AS Voltage,
        AnomalyDetection_SpikeAndDip(CAST(data."Terminal Voltage" AS   float), 70, 90, 'spikes')
        OVER(LIMIT DURATION(second, 120)) AS Spikes
    FROM 
    [iotbatteryhub]
)
SELECT
    time,
    Voltage,
    CAST(GetRecordPropertyValue(Spikes, 'Score') AS float) AS
    SpikeAndDipScore,
    CAST(GetRecordPropertyValue(Spikes, 'IsAnomaly') AS bigint) AS
    IsSpikeAnomaly
INTO battery
FROM batteryAnomalyDetection
WHERE CAST(GetRecordPropertyValue(Spikes, 'IsAnomaly') AS bigint)=1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片—70%置信度下模型测试的电压峰值

在上面的 SQL 中,我们使用 70%的置信度检查了异常。anomaly detection _ spikeandip(CAST(data。“端电压”为浮动), 70 ,90,“尖峰”)

上图向我们展示了机器学习操作员将 17 个事件标记为尖峰。

  • 让我们重新测试这个模型,但是这次要有 90%的置信度。
WITH batteryAnomalyDetection AS
(
    SELECT
        data.Timestamp AS time,
        CAST(data."Terminal Voltage" AS float) AS Voltage,
        AnomalyDetection_SpikeAndDip(CAST(data."Terminal Voltage" AS   float), 90, 95, 'spikes')
        OVER(LIMIT DURATION(second, 120)) AS Spikes
    FROM 
    [iotbatteryhub]
)
SELECT
    time,
    Voltage,
    CAST(GetRecordPropertyValue(Spikes, 'Score') AS float) AS
    SpikeAndDipScore,
    CAST(GetRecordPropertyValue(Spikes, 'IsAnomaly') AS bigint) AS
    IsSpikeAnomaly
INTO battery
FROM batteryAnomalyDetection
WHERE CAST(GetRecordPropertyValue(Spikes, 'IsAnomaly') AS bigint)=1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片—90%置信度下模型测试的电压峰值

上图向我们展示了机器学习操作员将 15 个事件标记为尖峰。

对于预防性分析,我们可以实现为每个接收到的尖峰发送警报的代码。使用 Azure 函数可以轻松做到这一点。

  • 现在让我们做一些更有趣的事情。我们现在将此转换为**流分析工作。**将该查询转换为作业的好处是可以无人值守地收集数据。收集的数据将有助于我们进行进一步的分析,这些分析可用于仪表板和决策制定。
WITH batteryAnomalyDetection AS
(
    SELECT
        data.Timestamp AS time,
        CAST(data."Terminal Voltage" AS float) AS Voltage,
        AnomalyDetection_SpikeAndDip(CAST(data."Terminal Voltage" AS   float), 90, 95, 'spikes')
        OVER(LIMIT DURATION(second, 120)) AS Spikes
    FROM 
    [iotbatteryhub]
)
SELECT
    time,
    Voltage,
    CAST(GetRecordPropertyValue(Spikes, 'Score') AS float) AS
    SpikeAndDipScore,
    CAST(GetRecordPropertyValue(Spikes, 'IsAnomaly') AS bigint) AS
    IsSpikeAnomaly
INTO battery
FROM batteryAnomalyDetection

点击创建流分析作业。填写如下详细信息,并点击创建

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-新的流分析作业参数

  • 你现在会在一个类似这样的窗口中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-新的流分析作业

我们需要一个用于数据收集的输出。点击 +添加,选择 Azure Blob 存储/ADLS Gen2。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-流分析作业输出

  • 既然已经创建了作业的输出,我们就可以开始作业了。点击启动

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像-启动流分析作业

  • 收到“流式作业成功启动”消息后,向事件中心发送更多事件。在云外壳中调用下面的命令。
RESOURCEGROUPNAME="training_rg"
TOPIC="iotbattery"
EVENTHUB_NAMESPACE="iotbatteryspace"
EVENTHUB_NAME="iotbatteryhub"
EVENTHUB_CONN_STR=$(az eventhubs namespace authorization-rule keys list --resource-group $RESOURCEGROUPNAME --namespace-name $EVENTHUB_NAMESPACE --name RootManageSharedAccessKey --query "primaryConnectionString" --output tsv)
for VARIABLE in {1..100}
do
 echo "Sending event $VARIABLE"
 python ~/blogs/eventhubs/iot/send_battery_events_normal_reading.py --EVENTHUB_NAME $EVENTHUB_NAME --EVENTHUB_CONN_STR $EVENTHUB_CONN_STR
done
  • 如果一切正常,流分析作业将以 JSON 格式将事件输出到下面的存储中。导航到主页 > 所有资源 > 培训工作室 > 电池

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像—存储上的事件数据

  • 但是我们如何对事件数据进行分析呢?为此,我们可以使用 Azure Synapse。在 cloud shell 中调用下面的命令来创建一个新的 Synape 工作区。
STORAGEACCOUNTNAME="traininglakehouse"
BATTERYDATALAYER="battery"
SYSNAPSEWORKSPACENAME="batterytracking"
RESOURCEGROUPNAME="training_rg"
LOCATION="eastus"
SQLUSER="sqladminuser"
SQLPASSWORD="*********"az synapse workspace create \
  --name $SYSNAPSEWORKSPACENAME \
  --resource-group $RESOURCEGROUPNAME \
  --storage-account $STORAGEACCOUNTNAME \
  --file-system $BATTERYDATALAYER \
  --sql-admin-login-user $SQLUSER \
  --sql-admin-login-password $SQLPASSWORD \
  --location $LOCATIONaz synapse workspace firewall-rule create --name allowAll --workspace-name $SYSNAPSEWORKSPACENAME --resource-group $RESOURCEGROUPNAME --start-ip-address 0.0.0.0 --end-ip-address 255.255.255.255
  • 现在导航到主页 > 所有资源 > 电池追踪,点击打开 Synapse 工作室部分的打开

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片—打开 Synapse studio

  • 在 Synapse workspace 窗口中,使用左侧窗格中的菜单点击数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者分类的图像—创建新的 SQL 数据库

输入如下详细信息,点击创建

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者排序的图像—在无服务器池中创建新的 SQL 数据库

  • 创建数据库后,打开一个新的 SQL 脚本窗口。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按作者排序的图像—打开一个新的 SQL 脚本窗口

  • 将下面的 SQL 粘贴到新打开的 SQL 窗口中。该 SQL 将创建电池事件数据的视图。
CREATE view battery
AS
SELECT JSON_VALUE(doc, '$.time') AS time, JSON_VALUE(doc, '$.BatteryPack') AS BatteryPack, JSON_VALUE(doc, '$.Voltage') AS Voltage, JSON_VALUE(doc, '$.SpikeAndDipScore') AS SpikeAndDipScore, JSON_VALUE(doc, '$.IsSpikeAnomaly') AS IsSpikeAnomaly
FROM openrowset(
   BULK 'https://traininglakehouse.blob.core.windows.net/battery/',
   FORMAT= 'csv',
   FIELDTERMINATOR='0x0b',
   FIELDQUOTE= '0x0b'
) WITH(doc nvarchar(max)) as row
GO
SELECT CONVERT(TIME,DATEADD(s,cast(time as int),'19700101 0:00:00')) as time, BatteryPack, Voltage, IsSpikeAnomaly FROM battery
GO
  • 如您所见,我们现在可以在事件数据流入存储时对其进行虚拟化。下面的图表向我们展示了一段时间内事件的峰值。该信息对于预测分析至关重要。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者提供的图片—虚拟化电池事件

我希望这篇文章是有帮助的。这个主题在由 Datafence Cloud Academy 提供的 Azure 数据分析课程中有更详细的介绍。课程是周末自己在网上教的。

制造业中的异常检测,第 1 部分:简介

原文:https://towardsdatascience.com/anomaly-detection-in-manufacturing-part-1-an-introduction-8c29f70fc68b?source=collection_archive---------3-----------------------

行业笔记用 PYTHON 制造数据科学

在制造业工作?用数据科学和机器学习推动您的业务

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安特·罗泽茨基在 Unsplash 上的照片

一个关键电机出现故障。数百万美元的收入损失。最糟糕的是,这件事发生在我的眼皮底下。

事实上,失败并不归咎于任何一个人——这是一个系统故障。但是在这个过程中还是有遗漏的“信号”,就像几周前有“峰值”的温度探测器。不幸的是,我没有配备识别这些问题的工具。大量的数据不断地被收集,但要找出一个偏差就像大海捞针一样。

您可能也有过类似的经历,设备故障给企业带来了巨大的损失,无论是在金钱方面还是在人力方面。状态监控是测量机器参数的过程,如温度、振动、压力等。—以便检测和预防故障。然而,过去实施的状态监控无法管理当今世界的海量数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可用于状态监控的几个参数。(图片由作者提供)

为了找到这些“大海捞针”,并提高生产率,传统的状态监控必须与数据科学和机器学习相结合。

幸运的是,数据的可用性以及从理论到应用的清晰界限,为在工业环境中使用数据科学和机器学习技术提供了一个令人信服的案例。[1]麦肯锡的一项研究估计,流程制造商适当使用数据驱动技术“通常可以减少 30%到 50%的机器停机时间,延长 20%到 40%的机器寿命”。

最终,正是在这里,在传统工业、数据科学和机器学习的交汇处,我们释放出难以置信的价值。

这个由三部分组成的系列将探索数据科学和机器学习在制造业中的应用。特别是,我们将学习在金属加工过程中,使用变分自动编码器(VAE)检测异常。尽管这种应用是特定于制造的,但是只要异常检测有用,就可以使用这些原理。

在第 1 部分(本文),我们将回顾什么是异常检测。我们还将学习加州大学伯克利分校的铣削数据集,并做一些探索性的数据分析——这是重要的第一步。

在第 2 部分中,我们将介绍变分自动编码器的理论。然后,我们将使用 TensorFlow 构建和训练 VAEs 所有代码都已提供,因此您可以轻松地跟随。

最后,在第 3 部分中,我们将使用经过训练的 VAEs 进行异常检测。你会明白潜在空间是如何用于异常检测的。此外,我们将制作一些独特的数据可视化,以便更好地理解结果。

在本系列结束时,我希望您对异常检测以及如何在生产环境中使用它有一个新的认识。也许您会受到启发,在这个迷人的领域中锻炼您的数据科学技能?

让我们从理解什么是异常检测开始,看看自动编码器如何用于异常检测。

异常检测和自动编码器

道格拉斯·霍金斯给出了异常现象的经典定义:“一个[异常现象]是一个与其他观测结果相差如此之大的观测结果,以至于让人怀疑它是由不同的机制产生的。”[2]有时,异常被清楚地识别出来,数据科学家可以使用直接的方法将它们挑选出来。然而在现实中,数据中的噪声使得异常检测变得困难。区分噪声和异常成为主要挑战,如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正常数据、噪声和异常之间的连续体。挑战在于区分数据中的噪声和异常。(图片由作者提供,灵感来自异常值分析中的 Charu C. Aggarwal)

有许多方法可以执行异常检测。我强烈推荐 Aggarwal 的《离群值分析》,这本书有很好的概述。

异常检测的一种方法是使用自动编码器。如下图所示,自动编码器学习重建它们的输入。然而,重建永远不会是完美的。将数据输入与自动编码器所接受的训练非常不同的自动编码器会产生较大的重建误差。馈送相似的数据将产生较低的重建误差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自动编码器学习重构其输入。这里,一个简单的自动编码器有一个输入层、一个输出层和一个隐藏层。隐藏单元通常被称为编码,或潜在变量。隐藏单元在潜在空间。(图片由作者提供)

重建误差的大小可以作为数据异常程度的代表。然后可以设置阈值,由此产生高于阈值的重建误差的数据被认为是异常。这被称为输入空间异常检测。

本质上,自动编码器的能力在于它能够以自我监督的方式学习。Yann Lecun 在他的图灵奖演讲中描述了自我监督学习的力量:自我监督学习允许模型“在不为特定任务训练的情况下了解世界。”这使得大量数据可以用于模型的训练,这些数据在监督学习技术中是不可用的。

自我监督学习的能力使其在制造和工业环境中的使用具有吸引力,在这些环境中,许多数据没有被正确标记,和/或标记成本太高。使用自动编码器进行异常检测是自我监督学习的一个实例。

金属加工数据集简介

我们将进一步探索自我监督学习、异常检测和自动编码器的概念,因为我们构建了一个变化的自动编码器来检测金属加工过程中工具的异常。

我们将使用的金属加工数据集或铣削数据集来自加州大学伯克利分校。这些数据存放在美国宇航局预测卓越中心的网页上,可以免费获取。在接下来的章节中,我们将回顾什么是铣削,然后探究数据。

什么是铣削?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

运行中的铣削工具。(照片由丹尼尔·史密斯Unsplash 上拍摄)

在铣削中,旋转刀具,如上图所示,在沿着工件移动时去除材料。大多数情况下,铣削是在金属上进行的——这是金属加工。

下图演示了端面铣削程序。刀具在旋转的同时向前推进。当刀具旋转时,刀具将“咬入”金属并将其移除。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

铣削刀具上有几个刀具刀片。当刀具旋转并被向前推动时,刀片切入金属。(图片由作者修改,公共领域)

随着时间的推移,刀具刀片会磨损。具体来说,刀具的侧面磨损,如下所示。在 UC Berkeley 铣削数据集中,侧面磨损( VB )是从一次切削到另一次切削测量的。该 VB 值将用于标记目的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

刀具刀片的侧面磨损(透视图和正视图)。 VB 是侧面磨损的量度。(图片由作者提供)

数据探索

注意:我不会涵盖数据探索的所有代码——跟随 Colab 笔记本查看全部内容。

处理任何新的数据科学问题时,数据探索都是重要的一步。因此,在开始任何类型的模型构建之前,我们需要熟悉加州大学伯克利分校的铣削数据集。

从哪里开始?第一步是理解数据的结构。数据是如何存储的?在数据库里?在一个数组里?元数据(如标签和时间戳)在哪里?

数据结构

加州大学伯克利分校铣削数据集包含在一个结构化的 MATLAB 数组中。我们可以使用 scipy.io 模块loadmat 函数加载.mat文件。

# load the data from the matlab file
m = sio.loadmat(folder_raw_data / 'mill.mat',struct_as_record=True)

数据存储在字典中。只有'mill'键包含有用的信息。

# store the 'mill' data in a separate np array
data = m['mill']

我们可以看到data阵列是由什么组成的。

# store the field names in the data np array in a tuple, l
l = data.dtype.names
print('List of the field names:\n', l)>>> List of the field names:
>>> ('case', 'run', 'VB', 'time', 'DOC', 'feed', 'material', 'smcAC', 'smcDC', 'vib_table', 'vib_spindle', 'AE_table', 'AE_spindle')

元数据和标签

加州大学伯克利分校铣削数据集包含的文档强调了重要的元数据。该数据集由 16 个铣削刀具切削金属的案例组成。创建数据时使用了六个切割参数:

  • 金属类型(铸铁或钢,在数据集中分别标记为 1 或 2)
  • 切割深度(0.75 毫米或 1.5 毫米)
  • 进给速度(0.25 毫米/转或 0.5 毫米/转)

16 种情况中的每一种都是切削参数的组合(例如,情况一的切削深度为 1.5 毫米,进给速度为 0.5 毫米/转,并且是在铸铁上进行的)。

案例由从新工具到退化或磨损工具的单个切割组成。在所有 16 个案例中有 167 个切口(在文档中称为“运行”)。许多切口都伴随着一定程度的侧面磨损 (VB )。我们稍后将使用它来标记切口是健康的、退化的还是磨损的。

最后,在每次切割期间收集六个信号:

信号以 250 Hz 采集,每个切割有 9000 个采样点,总信号长度为 36 秒。

我们将从 numpy 数组中提取元数据和标签,并将其存储为 pandas 数据帧——我们将此数据帧称为df_labels,因为它包含我们感兴趣的标签信息。我们是这样创建数据帧的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上表中,从df_labels.head()可以看出,并非所有切口都标有侧面磨损( VB )值。稍后,我们将设置工具健康状况的类别—健康、降级或磨损(故障)。对于没有侧面磨损( VB )值的切削,我们可以基于具有磨损值的附近切削合理地估计刀具健康类别。

数据可视化

可视化一个新的数据集是一种很好的方式来掌握正在发生的事情,并检测任何问题。我也喜欢数据可视化,所以我们将使用 seabornMatplotlib 创建一个漂亮的图形。

在这个数据集中只有 167 次切割,这不是一个很大的数量。我们可以目视检查每个切口以发现异常。幸运的是,我已经为你做到了…下面是一个亮点。

首先,我们来看一个相当“正常”的剪切——167 号剪切。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是,如果您查看所有切割,您会发现切割 18 和 95(索引 17 和 94)很奇怪,在我们开始构建异常检测模型之前,需要丢弃它们。

这是第 18 个镜头:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是第 95 次切割:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后,我们将创建一个图表,清晰地显示所有六个信号(声发射、振动和电流)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

切 146 号。(图片由作者提供)

结论

数据科学和机器学习非常适合制造业环境。为此,我们回顾了使用自动编码器进行异常检测的概念。这种自我监督的学习方法在制造环境中有助于检测和预防机器故障。

在这篇文章中,我们还解释了什么是金属加工——在铣削的背景下——并探索了加州大学伯克利分校铣削数据集。在第 2 部分中,我们将构建一个变化的自动编码器,并根据铣削数据对其进行训练。

参考

[1]经济学家。(2020).企业发现人工智能很难被采用。《经济学家》,ISSN 0013–0613。

[2]霍金斯博士(1980 年)。 离群值识别 (第 11 卷)。伦敦:查普曼与霍尔。

本文原载于tvhahn.com。此外,这项工作是对发表在 IJHM 研究的补充。官方的 GitHub 回购是 这里的

除非另有说明,本帖及其内容由作者以CC BY-SA 4.0授权。

制造业中的异常检测,第 2 部分:构建可变自动编码器

原文:https://towardsdatascience.com/anomaly-detection-in-manufacturing-part-2-building-a-variational-autoencoder-248abce07349?source=collection_archive---------10-----------------------

用 PYTHON 制造数据科学

机器故障?使用可变自动编码器来检测和防止它们

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由丹尼尔·史密斯Unsplash 上拍摄

之前的文章(本系列的第 1 部分)中,我们讨论了如何使用自动编码器进行异常检测。我们还探索了加州大学伯克利分校铣削数据集。接下来,我们将使用自动编码器的变体——变分自动编码器(VAE)——对铣削数据集进行异常检测。

在这篇文章中,我们将看到 VAE 与传统自动编码器的相似和不同之处。然后,我们将实现一个 VAE,并在铣削数据上训练它。在下一篇第 3 部分的中,我们将检查 VAE 的异常检测性能。

变分自动编码器

variable auto encoder 于 2013 年推出,目前广泛用于机器学习应用。[1]VAE 不同于传统的自动编码器,因为 VAE 既是概率性的又是生成性的。那是什么意思?VAE 生成的输出部分是随机的(即使在训练之后),也可以生成与被训练数据相似的新数据。

VAE 在线有很好的解释——我会带你去 Alfredo Canziani 的深度学习课程(下面的视频来自 YouTube)。不管怎样,我试图解释一下。

在高层次上,VAE 具有与传统自动编码器相似的结构。然而,编码器学习不同的编码;即,VAE 学习均值编码、和标准差编码、。然后,VAE 从高斯分布中随机采样,具有由编码器产生的相同的平均值和标准偏差,以生成潜在变量 z 。这些潜在变量被“解码”以重建输入。

下图展示了如何使用 VAE 重建信号。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一种变化的自动编码器架构(上图),以及一个通过 VAE 的数据样本示例(下图)。数据在编码器中被压缩以产生平均值和标准偏差编码。然后,通过添加高斯噪声,从均值和标准差编码中创建编码。解码器使用编码(或潜在变量)来重建输入。(图片由作者提供,灵感来自奥雷连·杰龙)

在训练期间,VAE 努力最小化其重建损失(在我们的情况下,我们使用二进制交叉熵),同时,使用潜在损失强制高斯结构。这种结构是通过 Kullback-Leibler (KL)散度实现的,在最初的 VAE 论文中对损失进行了详细的推导。[1]潜在损失如下:*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 K 是潜在变量的数量,而 β 是由 Higgens 等人[2]引入的可调超参数

VAE 学习嵌入在编码中的因子,这些因子可用于生成新数据。作为这些因素的一个例子,VAE 可以被训练来识别图像中的形状。一个因素可能编码了形状有多尖的信息,而另一个因素可能看它有多圆。然而,在 VAE 中,这些因素经常在编码中纠缠在一起(潜在变量)。

将超参数β(β)调整为大于 1 的值,可以使因子“解开”,使得每个编码一次仅代表一个因子。因此,可以获得模型的更大的可解释性。具有可调β的 VAE 有时被称为解纠缠-变分-自动编码器,或者简称为 β -VAE。为了简单起见,我们仍然称 β -VAE 为 VAE。

数据准备

在继续之前,我们需要准备数据。最终,我们将使用 VAE 来检测“异常”工具状况,这对应于工具磨损或失效的时间。但是首先我们需要标记数据。

如上一篇文章所示,每次切削都有一个相关的侧面磨损量, VB ,在切削结束时测量。我们将根据刀具的磨损程度将每个切削标记为健康、退化或失败——这些是刀具健康类别。以下是模式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我创建了一个数据准备类,它获取原始的 Matlab 文件,一个带标签的 CSV(每个切口都标有相关的侧面磨损),并输出训练/验证/和测试数据。然而,我想在课上强调一个重要的功能。也就是create_tensor函数。

注意:为了简洁,我不会覆盖所有的代码——按照 Colab 笔记本中的步骤,训练一些模型。

create_tensor函数获取一个单独的片段,将其分解成块,并放入一个数组中。它使用一个固定大小的窗口(window_size变量)将切割信号分割成块,然后沿着信号“滑动”窗口。窗口“滑动”预定的量,由stride变量设置。

我们将采用 165 个切割中的每一个(记住,原始 167 个切割中的两个被破坏),并应用 64 的窗口大小和 64 的步幅(窗口之间没有重叠)。

我目视检查了每个切割,并选择了“稳定”切割区域出现的时间,通常是信号开始收集后的五秒钟左右,信号收集结束前的几秒钟。该信息存储在“labels _ with _ tool _ class . CSV”文件中。

使用data_prep.py (参见 github repo )和一些 Python 魔术,我们可以创建训练/验证/测试数据集。脚本看起来是这样的:

数据的最终分布如下所示。注意数据有多不平衡(即相对较少的“失败”样本)?这是制造/工业数据中的常见问题,也是使用自监督方法的另一个原因。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于异常检测,通常只对“正常”数据训练自动编码器。我们将做同样的事情,在健康数据(0 类)上训练我们的 VAE。但是,检查异常检测的性能将使用所有数据来完成。换句话说,我们将在“瘦”数据集上训练我们的 VAE,但在“完整”数据集上测试。

构建模型

我们现在明白了什么是变分自动编码器,以及数据是如何准备的。是时候建造了!

我们的 VAEs 将由卷积层、批量标准化层和最大池层组成。下图显示了我们的一个 VAE 模型可能的样子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

VAE 使用的示例模型架构。编码器的输入是铣削数据样本,对于(64,6)的输入形状,窗口大小为 64。有 3 个卷积层,滤波器大小为 17,编码大小为 18。(图片由作者提供)

我不会讨论这个模型的所有细节。但是,这里有一些要点:

  • 我使用时间卷积网络作为卷积层的基础。实现来自 Philippe Remy——感谢 Philippe!你可以在这里找到他的 github 回购
  • Aurélien Geron 的书“用 Scikit-Learn、Keras 和 TensorFlow 实践机器学习”很棒。特别是,他关于 VAEs 的部分非常有用,我在这里使用了他的一些方法。有一本 Jupyter 的笔记本,摘自他的书中关于他的 github 的章节,非常有用。谢谢奥雷连恩![3]
  • 正如 Geron 所建议的,我使用了四舍五入的精确度来衡量模型在训练过程中的表现。

模型函数大概是这样的:

训练模型

是时候开始训练一些模特了。为了选择超参数,我们将使用随机搜索。

为什么要随机搜索?嗯,它实现起来相当简单,而且与网格搜索相比,已经显示出产生良好的结果。[4] Scikit-learn 有一些实现随机搜索的好方法——我们将使用[ParameterSampler](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.ParameterSampler.html)方法。

我们将训练一堆不同的阀门,都有不同的参数。在每个 VAE 都经过训练(训练以最小化重建损失)并保存模型后,我们将浏览 VAE 模型,并查看它在异常检测中的表现(我们将在第 3 部分中讨论)。下面是随机搜索训练过程的示意图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机搜索训练过程有三个步骤。首先,随机选择超参数。其次,用这些参数训练 VAE。第三,检查经过训练的 VAE 的异常检测性能。(图片由作者提供)

在实践中,当我运行这个实验时,我在 Google Colab 上训练了大约 1000 个 VAE 模型(免费 GPU 耶!).在训练完所有 1000 个模型后,我将它们转移到我的本地计算机上,使用一个功能不太强大的 GPU,然后检查这些模型的异常检测性能。Colab GPUs 的持续使用是有限的,因此以这种方式最大限度地利用它们上的 GPU 是有意义的。

您可以在 Colab 笔记本中查看完整的训练循环。试着训练一些模特!

结论

在这篇文章中,我们了解了 VAE 与传统自动编码器的相似和不同之处。然后,我们准备铣削数据,为超参数选择创建随机搜索,并开始训练模型。

的下一篇文章,第 3 部分中,我们将评估经过训练的 vae,看看它们是如何用于异常检测的。我们将使用精度-召回曲线来询问模型性能。最后,我们将创建一些漂亮的图形来可视化结果(我的最爱!).

参考

[1]金马博士和韦林博士(2013 年)。自动编码变分贝叶斯。 arXiv 预印本 arXiv:1312.6114

[2]希金斯、伊琳娜等人(2016)。" beta-vae:用约束变分框架学习基本视觉概念。

[3]盖伦,奥雷连恩。(2019).使用 Scikit-Learn、Keras 和 TensorFlow 进行机器实践学习:构建智能系统的概念、工具和技术。奥莱利传媒。

[4]j .伯格斯特拉和 y .本吉奥(2012 年)。超参数优化的随机搜索。 机器学习研究杂志13 (2)。

本文原载于 tvhahn.comhttps://www.tvhahn.com/posts/building-vae/。此外,这项工作是对发表在 IJHM* 研究的补充。官方的 GitHub 回购是 这里的 ***

除非另有说明,本帖及其内容由作者授权于CC BY-SA 4.0**

**** 更正:在最初的文章中,我在潜在损失函数中有一个错误(尽管代码很好)。我已经对它进行了修改,以匹配 Geron 中的内容。此外,记谱法与阿尔弗雷多·坎齐亚尼不同。请参考他的视频——非常好!***

制造业中的异常检测,第 3 部分:可视化结果

原文:https://towardsdatascience.com/anomaly-detection-in-manufacturing-part-3-visualize-the-results-a2afb5f61d2f?source=collection_archive---------12-----------------------

用 PYTHON 制造数据科学

创建漂亮的数据可视化,并查看异常检测模型的执行情况

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由丹尼尔·史密斯Unsplash 上拍摄

在现代制造环境中,数据的可用性是巨大的,但是常常缺乏利用数据的能力。幸运的是,数据科学和机器学习的工具可以提供帮助,反过来,可以释放出难以置信的价值。在本系列中,我们一直在探索这些工具在金属加工过程中检测故障的应用。

之前的文章中,我们构建并训练了可变自动编码器来重构铣床信号。下图中的步骤 1 和 2 显示了这一点。在本帖中,我们将通过检查一个经过训练的 VAE 模型的异常检测性能来演示随机搜索循环的最后一步(步骤 3)——我们将看看我们的异常检测模型是否能够真正检测到磨损的工具。

使用重建误差(输入空间异常检测)和测量样本之间的 KL-散度差(潜在空间异常检测)来执行异常检测。我们将看到这是如何做到的,并通过一些漂亮的数据可视化来深入研究结果。最后,我将建议一些潜在的领域进行进一步的探索。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机搜索训练过程有三个步骤。首先,随机选择超参数。其次,用这些参数训练 VAE。第三,检查经过训练的 VAE 的异常检测性能。在这篇文章中,我们将着眼于第三步。(图片由作者提供)

背景

输入空间异常检测

我们的变型自动编码器已经过“健康”刀具磨损数据的培训。因此,如果我们向训练过的 VAEs 提供不健康的数据,或者仅仅是不正常的数据,我们将产生很大的重建误差。可以对该重建误差设置阈值,由此产生高于阈值的重建误差的数据被认为是异常。这是输入空间异常检测。

注意:为了简洁,我不会在这篇文章中涵盖所有代码——打开 Colab 笔记本进行交互体验,并查看所有代码。

我们将使用均方误差(MSE)来测量重建误差。因为重构是对所有六个信号的重构,所以我们可以计算每个单独信号(mse函数)以及所有六个组合信号(mse_total函数)的 MSE。这两个函数如下所示:

重建值(recon)是通过将窗口切割信号(也称为子切割)输入到训练过的 VAE 中产生的,如下:recon = model.predict(X, batch_size=64).

重构概率是输入空间异常检测的另一种方法。).安和赵在他们 2015 年的论文中介绍了这种方法。[1]

我对重建概率方法不太熟悉,但是詹姆斯·麦卡弗里在他的博客上有一个很好的解释(并且用 PyTorch 实现)。他说:“重建概率异常检测的想法是计算第二个概率分布,然后用它来计算输入项来自该分布的可能性。具有低重建概率的数据项不可能来自该分布,因此在某种程度上是异常的。”

我们不会使用重建概率来进行异常检测,但实现起来会很有趣。也许你可以试一试?

潜在空间异常检测

异常检测也可以使用潜在空间中的均值和标准差编码来执行,这就是我们将要做的。下面是一般的方法:

  • 使用 KL-divergence,测量数据样本之间熵的相对差异。可以在这个相对差异上设置阈值,指示数据样本何时异常。

Adam Lineberry 在他的博客上有一个用 PyTorch 实现的 KL-divergence 异常检测的很好的例子。下面是我们将使用的 KL-divergence 函数(通过 Keras 和 TensorFlow 实现):

其中mu是平均值(),而log_var是方差的对数(log σ)。方差的对数用于训练 VAE,因为它比方差更稳定。

为了生成 KL-散度分数,我们使用以下函数:

评估指标

在我们计算了重建误差或 KL-divergence 分数之后,我们准备设置一个决策阈值。任何高于阈值的值都将是异常的(可能是磨损的工具),而任何低于阈值的值都将是正常的(健康的工具)。

为了全面评估一个模型的性能,我们必须考虑一系列潜在的决策阈值。两种常见的方法是接收器工作特性 (ROC)和精确召回曲线。ROC 曲线描绘了真阳性率对假阳性率。精确度-召回曲线,顾名思义,描绘了精确度与召回率的关系。测量曲线下的面积提供了一个比较不同模型的好方法。

我们将使用精确召回曲线下面积(PR-AUC)来评估模型性能。与 ROC-AUC 相比,PR-AUC 在不平衡数据上表现良好。[2,3]下图解释了什么是精确度和召回率,以及精确度-召回率曲线是如何构建的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过改变异常检测模型中的决策阈值来创建精确召回曲线。(图片由作者提供)

最终,模型性能的评估及其决策阈值的设置是特定于应用的。例如,制造商可能将预防工具故障置于频繁更换工具之上。因此,他们可以设置低阈值来检测更多的工具故障(更高的召回率),但代价是有更多的假阳性(更低的精度)。

分析最佳模型

现在,一些“背景”信息已经涵盖,我们可以开始分析训练好的 VAE 模型。您必须计算每个模型的性能指标(PR-AUC 分数),看看哪一个是最好的。但是为了这个帖子,我已经训练了一堆模型,选出了最上面的一个(基于 PR-AUC 评分)。

以下是顶配车型的参数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算 PR-AUC 分数

让我们看看顶级模型在训练/验证/测试集上的 PR-AUC 分数。但是首先,我们需要加载数据和包。

get_results函数接受一个模型,并给出该模型在训练、验证和测试集上的性能。它还返回给定迭代次数的精度、召回、真阳性和假阳性(称为grid_iterations)。因为 VAE 的输出是部分随机的(random ),所以您也可以运行一些搜索(search_iterations),然后取所有搜索的平均值。

最后,下面是我们得出的结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看上表:潜在空间异常检测优于输入空间异常检测。这并不奇怪。包含在潜在空间中的信息更具表现力,因此更有可能识别切割之间的差异。

精确回忆曲线

我们希望将模型的性能可视化。让我们为潜在空间中的异常检测模型绘制精确召回曲线和 ROC 曲线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图中的虚线表示“无技能模型”在进行异常检测时将获得的结果,也就是说,如果模型为数据集中的每个子部分随机分配一个类别(正常或异常)。该随机模型由 ROC 图中的斜线和 PR-AUC 图中的水平线表示,设定精度为 0.073(测试集中失败子切割的百分比)。

比较精确-召回曲线和 ROC 曲线:ROC 曲线给出了对模型性能更乐观的看法;这是 0.883 的曲线下面积。然而,精确召回曲线下面积没有那么高,值为 0.450。

为什么曲线下面积值不同?这是因为我们的数据严重失衡。这就是为什么您想要使用 PR-AUC 而不是 ROC-AUC 指标的确切原因。PR-AUC 将在处理不平衡数据时提供模型性能的更真实视图。

潜在空间的小提琴情节

小提琴图是一种可视化决策边界和查看样本错误分类的有效方法。你说,什么是小提琴的情节?我们来造一个吧!

这是 will 将用来创建情节的violin_plot函数。它需要经过训练的编码器、子切割(X)、标签(y)和一个示例阈值。

我们需要加载编码器。

…还有剧情!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不错吧。您可以在 violin 图中看到不同的阈值会如何错误分类不同数量的数据点。想象红色虚线,代表决策阈值,在图上向左或向右移动。这是异常检测的固有问题——从异常中分离噪声。

比较不同切割参数的结果

铣削数据集中有六个切削参数:

  • 金属类型(铸铁或钢)
  • 切割深度(0.75 毫米或 1.5 毫米)
  • 进给速度(0.25 毫米/转或 0.5 毫米/转)

我们可以看到我们选择的异常检测模型是否在一组参数上比另一组参数更好地检测失败的工具。我们将通过一次向模型中输入一种类型的参数并观察结果来做到这一点。例如,我们将进给用铸铁制成的切口。那我们就转向钢铁。等等。等等。

我已经跳过了一个好的代码块(见 Jupyter 笔记本),因为它是重复的。但是,一旦我们为每个独特的切削参数创建了结果数据帧,我们就可以将它们组合成一个简洁的条形图。

下面是组合每组结果的代码:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在我们可以制作漂亮的条形图了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然,这个“最佳”模型发现一些切削参数比其他参数更有用。某些切削参数可以产生携带更多信息和/或具有更高信噪比的信号。

在训练过程中,该模型还可以对某些参数产生优于其他参数的偏好。偏好可以是模型构建方式(例如,β参数或编码大小)以及模型训练方式的函数。

我怀疑可能存在具有不同参数偏好的模型配置,例如铸铁而不是钢。一组模型可能会产生更好的结果。这将是进一步研究的一个有趣的领域!

趋势 KL-Divergence 分数

KL-divergence 分数可以按顺序进行趋势分析,以了解我们的异常检测模型是如何工作的。这是我最喜欢的图表——它很漂亮,给人很好的洞察力。

注意:您也可以对输入空间重构误差进行趋势分析,但我们不会在这里这样做。

让我们快速探索一下,看看这些趋势会是什么样子。我们需要一个函数来对子切割进行顺序排序:

现在做一个趋势图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在有了创建 KL-divergence 分数随时间变化趋势图所需的所有信息。

我们将趋势案例 13,这是在钢上进行,速度很慢,是一个浅切口。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看起来不错!这个模型产生了一个清晰的趋势。然而,正如我们在上一节中所看到的,我们的异常检测模型在某些切削条件下识别刀具异常(失效/不健康/磨损)时确实有些困难。

让我们看看另一个例子——案例 11。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过“降级”区域,您可以看到趋势是如何增加的,但是当它到达红色的“失败”区域时,趋势会迅速下降。为什么?呃,我也不知道具体是什么。趋势末端的样本可能更类似于健康样本…我很想听听你的想法。

还有更多的分析可以做…我会留给你。如果你发现什么有趣的东西,请告诉我!

进一步的想法

在这个由三部分组成的系列中,我们所做的是使用 VAE 在工业数据集上构建一种异常检测方法。我毫不怀疑这些方法可以大大改进,其他有趣的领域也可以探索。

我希望一些勤奋的研究人员或学生可以利用这项工作作为跳板,或灵感,做一些真正有趣的事情!以下是我有兴趣进一步做的一些事情:

  • 正如我上面提到的,模型集合可能会产生更好的结果。
  • VAE 中的β使它成为一个不纠缠的变分自动编码器。看看编码如何随不同的切削参数而变化,以及编码是否代表独特的特征,这将是很有趣的。
  • 我在 VAE 中使用了 TCN,但我认为一个常规的卷积神经网络,加上膨胀,也会工作得很好(这是我的直觉)。这将使模型训练更简单。
  • 如果我要重新开始,我会整合更多的模型测试。这些模型测试(如单元测试)将对照不同的切割参数检查模型的性能。这将更容易发现哪些模型在切削参数上具有良好的通用性。

结论

在这篇文章中,我们通过几个可视化来探索我们训练过的 VAE 模型的性能。我们发现使用 KL 散度的潜在空间比输入空间的异常检测更有效。

在制造领域使用数据科学和机器学习工具有很强的商业案例。此外,这里演示的原则可以跨许多使用异常检测的领域使用。

我希望你喜欢这个系列,也许,学到了一些新的东西!

参考

[1]安,j .,&赵树声(2015)。使用重构概率的基于变分自动编码器的异常检测工业工程专题讲座2 (1),1–18。

[2]j .戴维斯和 m .戈德里奇(2006 年 6 月)。精确召回与 ROC 曲线的关系。在第 23 届机器学习国际会议论文集(第 233–240 页)。

[3]t .斋藤和 m .雷姆斯迈尔(2015 年)。在不平衡数据集上评估二元分类器时,精确召回图比 ROC 图提供的信息更多PloS one10 (3),e0118432。

本文原载于【tvhahn.com】。此外,这项工作是对发表在 IJHM 研究的补充。官方的 GitHub 回购是 这里的

除非另有说明,本帖及其内容由作者授权于CC BY-SA 4.0

Python 中的异常检测——第二部分:多元无监督方法和代码

原文:https://towardsdatascience.com/anomaly-detection-in-python-part-2-multivariate-unsupervised-methods-and-code-b311a63f298b?source=collection_archive---------6-----------------------

关于如何为业务分析执行异常检测的指南或关于多元数据的机器学习管道以及相关 Python 代码。

在我之前的文章(https://medium . com/analytics-vid hya/Anomaly-detection-in-python-part-1-basics-code-and-standard-algorithms-37d 022 CDB CFF)中,我们讨论了异常检测的基础知识、问题的类型以及使用的方法的类型。我们讨论了执行异常检测的 EDA、单变量和多变量方法,以及每种方法的一个示例。我们讨论了为什么多元异常值检测是一个困难的问题,需要专门的技术。我们还讨论了使用 fastcd 的马氏距离方法来检测多元异常值。

在本文中,我们将讨论另外两种广泛使用的方法来执行多元无监督异常检测。我们将讨论:

  1. 隔离林
  2. OC-SVM(一级 SVM)

异常检测的一般思路

异常检测是一种识别数据中异常或有趣事件的工具。**但是,在移除异常之前,从领域/业务角度分析检测到的异常非常重要。**每种方法都有自己的异常定义。多种方法可能经常无法确定哪些点是异常的。从领域/业务角度验证结果是我们的责任。

有时,检测到的异常代表数据中的“欠采样”状态。在这种情况下,我们不应该删除它们,而是应该在该体系中收集更多的数据。

多元异常的简要概述

**当各种特征的值合在一起看起来异常时,即使单个特征没有异常值,也会出现多元异常。**例如,假设我们有 2 个特征:
1。这是汽车里程表的读数,单位是英里/小时。它通常在 0-50 之间。②
。每分钟转数:这是汽车车轮的每分钟转数。它通常在 0-650 之间。

现在,想象一下奥多的时速是 0 英里。我们知道这是可能的——而且汽车没有移动。比方说,另一个场合,转速读数 600。我们知道汽车在移动。分开来看,我们知道上述读数并不异常——因为它们代表了汽车完全正常的运行模式。然而,让我们想象一下在同一时间里程表读数为 0 英里/小时,而转速读数为 600 英里/小时。这是不可能的——他们有冲突。rpm 表示汽车在移动,odo 表示汽车是静止的。这是一个多元异常值的例子。

检测多元异常值包括同时检查所有特征的值,并验证这些特征的值组合是否异常。 正如我们所理解的,当我们拥有大量的特征(比如数百个)时,手动操作变得非常困难。或者,我们可以使用专门的算法来识别它们。让我们来看看它们。

用于异常检测的数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们希望用多元方法来检测 2 个主要的异常值——按作者分类的图像

隔离森林

众所周知,隔离林适用于高维数据。隔离林是“隔离树”的集合。在下面的论文中详细讨论:https://cs . nju . edu . cn/Zhou zh/Zhou zh . files/publication/ICD m08 b . pdf?q =隔离-森林
*隔离树是一种二叉树,通过将数据划分成盒(称为节点)来存储数据。*要理解为什么隔离林是异常检测器,重要的是要理解隔离树是如何构建的。以下是计算隔离树的步骤:

  1. 从数据中随机选择一个特征。让我们称随机特征为 f
  2. 从特征 f 中选择一个随机值。我们将使用这个随机值作为阈值。让我们称之为 t.
  3. f < t 所在的数据点存放在节点 1, f ≥ t 所在的数据点存放在节点 2。
  4. 对节点 1 和节点 2 重复步骤 1-3。
  5. 当树完全长大或满足终止标准时终止。

为了简单起见,让我们从隔离树如何处理单变量数据开始。我们稍后将探讨多元示例。下图显示了一维数据的机制:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为没有异常值的数据构建的隔离树。选择一个随机阈值将数据分成子节点。然后对每个子节点重复这个过程。—作者图片

重要的是要记住,要分割的特征和阈值是随机选择的,如上图所示。由于以上示例为单因素,因此我们仅随机选择阈值。

现在,假设上面的单变量数据有异常。在这种情况下,异常点将远离其他数据点。隔离林能够在分裂过程中很早就隔离出异常,因为 用于分裂的随机阈值很有可能位于离群值和数据之间的空白区域,如果空白区域足够大的话。因此,异常具有较短的路径长度。毕竟,分割点(阈值)是随机选择的。因此,空白区域越大,随机选择的分裂点就越有可能位于该空白区域

让我们看看存在异常时隔离树的外观。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

隔离树“隔离”出第一个拆分中的异常。由于异常与其他数据之间的空间较大,因此很可能在该区域出现随机分裂。—作者图像

正如我们所看到的,由于异常和其他数据之间的空间很大,很可能在这个空白区域会出现随机分裂。

现在,让我们看看如果有多元数据,情况会是怎样。正如我们将看到的,隔离树的工作方式与我们上面看到的非常相似——它们在隔离其他点之前先隔离异常。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

异常在裂口 2 处被隔离。—作者图像

请注意:树木也可以生长:

  1. 直到每个叶节点中只有一个数据点。或
  2. 直到达到关于叶节点中数据点的最小数量的终止标准。

我在这里只展示了前几个部分来说明。正如我们所看到的,隔离树将数据划分为“框”。其特点是比包含正常数据点的方框更早地隔离包含异常的区域。

我们可以将隔离树的概念扩展到一个隔离林,它是多个隔离树的集合。以下是隔离林的工作原理:

  1. 从整个要素集或随机选择的要素集子集构建隔离树。
  2. 构建 n 这样的隔离树。
  3. 计算每个数据点的异常分数。**异常得分为所有隔离树平均路径长度的非线性函数。**路径长度相当于隔离树为隔离一个点而进行的拆分次数。平均路径长度越短,该点成为异常的可能性就越大(正如我们在图中前面看到的)。

即使对于具有数百个维度的数据,隔离林也能很好地工作。

skearn 的隔离林有 4 个重要输入:

***n _ estimators:***被训练的隔离树数。 ***max _ samples:***用于训练每棵树的数据点数。 沾染: 异常数据点的分数。例如,如果我们怀疑 5%的数据是异常的,我们将污染度设置为 0.05 ***max _ features:***用于训练每棵树的特征数量(这与随机森林相反,在随机森林中,我们为每次分割决定随机的特征子集)。

它有两个重要的方法:

decision_function(X): 返回一个分数——这样负分数越多的例子就越反常。
预测(X): 对于异常点返回-1,对于正常点返回+1。输出为异常的点的数量取决于拟合模型时设置的污染值。

让我们根据上述数据训练一个隔离林(我们将污染设置为 0.01):

# Create Artificial Data with Multivariate Outliers
d1 = np.random.multivariate_normal(mean = np.array([-.5, 0]),
                               cov = np.array([[1, 0], [0, 1]]), size = 100)d2 = np.random.multivariate_normal(mean = np.array([15, 10]),
                               cov = np.array([[1, 0.3], [.3, 1]]), size = 100)outliers = np.array([[0, 10],[0, 9.5]])
d = pd.DataFrame(np.concatenate([d1, d2, outliers], axis = 0), columns = ['Var 1', 'Var 2'])################### Train Isolation Forest #################
model  =  ensemble.IsolationForest(n_estimators=50, max_samples=500, contamination=.01, max_features=2, 
                         bootstrap=False, n_jobs=1, random_state=1, verbose=0, warm_start=False).fit(d)# Get Anomaly Scores and Predictions
anomaly_score = model.decision_function(d)
predictions = model.predict(d)######### Visualize Anomaly scores and Anomaly Status ########plt.figure(figsize = (10, 6), dpi = 150)
s = plt.scatter(d['Var 1'], d['Var 2'], c = anomaly_score, cmap = 'coolwarm')
plt.colorbar(s, label = 'More Negative = More Anomalous')
plt.xlabel('Var 1', fontsize = 16)
plt.ylabel('Var 2', fontsize = 16)
plt.grid()# To Plot Predictions
plt.figure(figsize = (10, 6), dpi = 150)
s = plt.scatter(d['Var 1'], d['Var 2'], c = predictions, cmap = 'coolwarm')
plt.colorbar(s, label = 'More Negative = More Anomalous')
plt.xlabel('Var 1', fontsize = 16)
plt.ylabel('Var 2', fontsize = 16)
plt.grid()
plt.title('Contamination = 0.01', weight = 'bold')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左图:决策函数的输出-负值越大,意味着异常越强。右图:异常的最高“污染”分数。—作者图片

如我们所见,这两个点被检测为强异常值。

因此,可以使用两种方法来确定一个点是否异常:

  1. 使用预测函数:如果模型预测为-1,则将该点标记为异常点。对于这种方法,小心设置污染很重要。
  2. 分析决策函数输出分布,并基于视觉检查设置阈值,异常点将落在该阈值以下。我们还可以对决策函数输出应用单变量异常检测算法;这是一种非常常见的方法,我们将多变量问题转化为单变量问题,通过计算异常分数,然后对分数使用单变量算法。该方法不依赖于我们对污染因子的选择。

但是,让我们看看如果我们设置不同的污染值并使用方法 1 会发生什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择方法 1 预测时污染对隔离林产量的影响。—作者图片

随着污染值的增加,模型将更多的数据标记为异常。

如果我们不知道正确的污染怎么办?

在这种情况下,我们分析 decision_function()的输出。有两种方法可以做到这一点:

  1. 对隔离林决策函数输出应用单变量异常检测算法(类似于 tukey 的方法——我们在上一篇文章中讨论过)。这是一种标准方法——我们使用多元算法计算“异常分数”(这里是决策函数输出);然后,为了选择这些异常分数中的哪些对应于异常值,我们对分数应用单变量异常检测算法。
  2. 绘制直方图,手动选择阈值。

让我们看看将 Tukey 的方法应用于我们的隔离林给出的决策函数输出的结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

应用于隔离林决策函数输出的 Tukey 方法选择了 6 个异常值。我们可以看到两个极端的异常值——这确实是我们试图检测的异常。—作者图片

我们看到两个明显的异常值,它们是左边的两个极端点。这些实际上也是我们想要检测的两个主要异常值。然而,我们看到另外 4 个点被标记为异常值。为了选择适当的异常,需要进行领域/业务分析。

让我们讨论一下隔离林的一些优点:

  1. 可扩展性— 隔离林可以在训练和预测期间使用并行处理—因为所有隔离树都是并行训练的—彼此独立。
  2. 可解释性— 隔离森林中的单棵树可以被可视化,以给出使数据点成为异常值的确切规则。这些规则可能具有很大的业务/领域重要性。但是,对于大数据来说,这可能会变得很困难。
  3. 灵活性— 它们可以捕捉非常复杂的异常值,并且不要求数据属于特定的分布。如果我们还记得,前一篇文章中讨论的使用 FastMCD 的 Mahalanobis 距离方法假设干净数据属于多元正态分布。隔离森林不做这样的假设。

根据经验,我注意到严重异常值和轻微异常值的决策函数值通常很接近。正如我们在这里看到的,我们有 2 个明显的异常值。然而,他们的决策函数输出接近于其他一些点的决策函数输出。这与 Mahalanobis 距离方法形成对比,在 Mahalanobis 距离方法中,对于相同的问题,区别非常明显。总体而言,隔离林检测到的异常值是合理的,对决策函数使用单变量方法的方法也产生了合理的结果。

一类——支持向量机(OC-SVM)

OC-SVM 是一种多元方法,属于一类分类方法家族。在下面的论文中详细讨论:https://www . Microsoft . com/en-us/research/WP-content/uploads/2016/02/tr-99-87 . pdf

我们决定一小部分数据,比如说ν(读作 Nu ),我们怀疑它是数据中出现的异常数量的上限。**然后,OC-SVM 试图找到一个包含高数据密度区域的边界,最多排除一小部分ν个数据点。**可以看出,问题变量空间中的线性边界对于大多数问题来说过于简单。由于 SVM 本质上是线性分类器,我们需要借助核方法来建立具有非线性边界的灵活模型。

OC-SVM 试图寻找一个超平面将数据从原点分开,而不是寻找一个决策边界来分隔两个类。想法是将数据映射到内核特征空间,并使用内核特征空间中的线性分类器以最大余量将其从原点分离。这相当于在我们的原始问题空间中使用非线性边界。

**让我们简单讨论一下 OC-SVM 中内核的使用。**SVM 是一个线性模型。这使得它可以制定非常简单的决策规则。提高 SVM 容量的一种方法是根据数据创建多项式要素,然后在变换后的要素空间中使用线性 SVM。SVM 仍然在多项式特征空间中找到线性边界,但是当映射回我们的原始问题变量空间时,判定边界(在多项式特征空间中是线性的)看起来是非线性的。但是我们必须显式计算多项式特征——如果我们一开始就有大量特征,这会占用大量内存。**内核允许我们在非常高维的特征空间中拟合简单模型(如线性 SVM ),而无需显式计算高维特征。**最广泛使用的内核之一是 **RBF 内核。**要记住的重要一点是,SVM 总是在核心特征空间中拟合线性模型——即使决策边界在原始问题变量空间中看起来是非线性的。

以下是关于 OC-SVM 的一些一般要点:

  1. 一般来说,使用 OC-SVM 时,建议使用非线性内核。RBF 核被广泛使用。
  2. 用 RBF 核来调整 OC-SVM 的超参数是:γ,ν
  3. 可以使用 predict()和 decision_function()方法进行预测。我们将在后面详细讨论它们。

Gamma 是特定于 RBF 核的参数,它控制相邻点对决策边界的影响。较大的 Gamma 值允许相邻点对决策边界有较大的影响,较小的 Gamma 值允许相邻点和远处点对决策边界都有影响。

让我们讨论使用不同的γ值的效果。较大的 Gamma 值会导致模型具有较大的方差-这会以概化为代价。让我们改变伽玛,看看对模型的影响。

def plot_anomaly2(data, predicted, ax):
    data2 = data.copy()
    data2['Predicted'] = predicted

    normal = data2.loc[data2['Predicted'] == 1, :]
    anomalies = data2.loc[data2['Predicted'] == -1, :]

    # Make Scatterplot
    column1 = data.columns[0]
    column2 = data.columns[1]

    anomalies.plot.scatter(column1, column2, color = 'tomato', fontsize = 14,  sharex = False, ax=ax)
    normal.plot.scatter(column1, column2, color = 'grey', fontsize = 14,  sharex = False, ax = ax)#plt.grid(linestyle = '--')

    plt.xlabel(column1, fontsize = 14, weight = 'bold')
    plt.ylabel(column2, fontsize = 14, weight = 'bold')
    return ax# Create Fake data to classify 
x_fake  =  pd.DataFrame(np.random.uniform(-5, 19, (35000, 2)), columns = ['Var 1', 'Var 2'])# Visualize effect of changing Gamma
gammas = [.00005, .005, .01, .025, .05, .1,.3, .6, .9, 2, 5, 10]
fig, axes = plt.subplots(2, 6, figsize = (25, 6), tight_layout = True)
for i, ax in zip(range(len(gammas)), axes.flatten()):
    gamma = gammas[i]
    model = svm.OneClassSVM(kernel='rbf', degree=5, gamma=gamma, coef0=0.0, tol=0.001, nu=0.01, 
                        shrinking=True, cache_size=200, verbose=False, max_iter=- 1).fit(all_data)model_predictions = model.predict(x_fake)
    #x_fake['Predictions'] = model_predictionsax = plot_anomaly2(x_fake, model_predictions,ax)
    ax.scatter(all_data.iloc[:, 0], all_data.iloc[:, 1], color = 'k', s = 10)
    ax.set_title('Gamma: {}'.format(np.around(gamma,6)), weight = 'bold', fontsize = 14) 

下图中的蓝色区域是指 SVM 奥组委预测为“正常”的区域。红点被检测为异常。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据点的异常状态与作者提供的伽马图像的关系

我们观察到以下情况:

  1. 当伽马射线极低或极高时,我们看到 OC-SVM 至少会漏掉一个主要的异常现象。
  2. 对于 0.005 到 0.1 范围内的中伽马值,OC-SVM 识别出两种主要异常。

选择 Gamma 的一种方法是让 sklearn 选择 Gamma。我们通过选择 gamma = 'scale '来实现。下面是当我们设置 gamma = 'scale '时发生的情况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gamma = 'scale '检测 2 个异常值。nu 设定为 0.05。—作者图片

如前所述,在 OC-SVMs 中,使用线性决策边界将数据从核空间中的原点分离出来。允许一小部分(高达ν)数据落在线性决策边界的错误一侧。基本上,我们希望所有的内点在决策边界的一边,所有的外点在决策边界的另一边。OC-SVM 的 decision_function 方法输出一个点到决策边界的符号距离。对于异常值,该距离取负值,对于正常点(内部点),该距离取正值。

让我们像前面一样对 decision_function 输出应用 tukey 的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Tukey 方法中,k = 1.5 的 2 个点被确定为异常。这里,tukey 的方法被应用于 OCSVM 决策函数输出。—作者图片

幸运的是,tukey 的方法发现了数据中的两个主要异常。然而,在一般情况下,它可以识别额外的或较小的异常。Tukey 方法识别的异常依赖于我们的“k”值(在前一篇文章中讨论过),这个值是可以调整的。有时将 k 视为 ML 管道中的超参数是有用的,这可以通过领域分析或优化来最终确定。

结论

到目前为止,我们已经讨论了执行异常检测的无监督方法。我们讨论了用于执行多元异常检测的隔离森林和 OC-SVM 方法。这种方法的优点之一是它们不要求数据属于特定的分布。

OC-SVM 是一种可用于无监督和半监督异常检测的方法。在接下来的文章中,我们将讨论执行异常检测的半监督和监督方法。它们包括使用 PCA、自动编码器、OC-SVM 和不平衡分类方法来执行异常检测。

如果您有任何反馈,请随时告诉我,并查看我以前关于异常检测的介绍性文章,其中我们讨论了不同类型的异常检测问题和方法(https://medium . com/analytics-vid hya/Anomaly-detection-in-python-part-1-basics-code-and-standard-algorithms-37d 022 cdbcff)。

伺服驱动器的异常检测

原文:https://towardsdatascience.com/anomaly-detection-on-servo-drives-f711f3e6022f?source=collection_archive---------16-----------------------

行业笔记

可靠地预测伺服故障以减少停机时间

介绍

给定伺服反馈信息,如扭矩、速度、加速度和功率,可以预测伺服系统出现问题的可能性。通过了解伺服系统可能出现故障的时间,可以减少停机时间,并防止故障伺服系统对系统造成潜在损害。通过将简单的高斯概率密度函数应用于一组训练的特征,可以用很少的计算成本来确定异常伺服的分类。

背景

单个特征 x 的各种平均值和方差值的高斯分布如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

各种高斯分布,图片由维基百科提供

该图说明了方差如何影响沿特征轴的概率密度函数大小和覆盖范围。较高的方差值表示数据更加分散,较低的方差值表示数据的值接近,方差为零表示所有数据都相同。

理论

模拟上述曲线的高斯概率密度函数如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 1:高斯概率密度函数,图片来自维基百科

该函数表示给定特征值 x. 处的幅度。在这种情况下,均值(μ)和方差(σ)值均在评估该函数之前确定。使用以下通用形式确定平均值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征均值方程,作者图片

使用以下公式确定差异:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征方差方程,作者图片

计算将用于训练和评估模型的每个特征的平均值和方差。使用所使用的编程环境尽可能地对计算进行矢量化是很重要的。

该函数将输出高斯概率密度,对于包含各种要素的不同数据集,高斯概率密度会有显著变化。输出值需要被映射到表示伺服状态分类(异常或非异常)的二进制值。这将通过为概率密度函数指定阈值来完成。

当确定异常的阈值时,可以使用迭代方法来决定一个值,并观察模型对于各种特征值的行为。所选阈值取决于模型标记异常数据集的灵敏度。如果存在交叉验证或测试数据集,则可以评估精确度、召回率、F1 分数和综合 F-1 分数,以确定模型何时表现最佳。

一个好的起始值是平均值的 2-3 倍标准差。最大概率密度可以通过将等式 1 上的指数值驱动为 0 并用矢量化的学习方差值来评估该等式来确定。类似地,2 个标准偏差下的密度可以通过在μ+2σ下评估等式 1 来确定。

特征选择

通过组合两个伺服反馈值来确定特征,这两个伺服反馈值在理论上应该彼此成比例。几个特征对的例子可以包括:

  • 输入功率和输出扭矩
  • 输入功率和输出速度
  • 输入功率和加速度
  • 输入扭矩和输出速度

通过将一个除以另一个,可以将两个反馈变量组合成一个单一特征:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

功能 1 由功率和扭矩决定,图片由作者提供

这允许模型对异常值进行分类,如果使用标准反馈值作为两个独立的特征,则异常值可以被分类为非异常。

对于以下所示的示例,使用了由扭矩和速度组成的单一特征:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用的特征,例如,作者的图像

使用数据采样功能,在伺服轴上运行各种 g 代码命令时,可以保存扭矩和速度值。使用各种伺服参数尽可能多地采样数据非常重要。在这种情况下,伺服系统的最大速度和加速度分别在 0.1-200.0 和 10.0-500.0 用户单位之间变化。大约有 50,000 个训练样本,分布如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特征 1 的直方图,按作者分类的图像

请注意,数据类似于高斯分布,如果不是这种情况,则必须应用转换来使其高斯化。在某些情况下,这可以通过对数据集取对数来实现。

训练数据的平均值、方差和标准差如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分布的均值、方差和标准差,按作者分类的图像

这些值是模型学习并用于应用于伺服反馈变量的未来值的内容。

使用等式 1,为每个训练数据点计算概率密度,并且产生以下曲线:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

训练数据的高斯概率密度,图片由作者提供

程序

为了查看运行中的模型,伺服机构将被配置为执行简单恒速移动的 3D 机架的 X 轴。

PLC 将在每个周期(8 毫秒)采样扭矩和速度值,并评估伺服系统是否异常。从模型输出的高斯概率密度和二元分类将与每次扫描采样的数据一起保存。

虽然每 1000 次的异常输出可能会出现一次假阳性,但预计模型在恒速运行时输出“非异常”。因此,需要实现额外的逻辑来确定何时以及如何对模型的输出采取行动。例如,在后面的 1,000 个样本中异常出现的次数可以用来触发一个事件,以通知管理员检查伺服系统。

为了模拟异常,3D 机架上的 X 轴将受到未知来源的外部阻力(不要在家里尝试)。这种模拟异常可能与向伺服机构提供机械阻力的受损轴承相关,并且这反映在所提供扭矩的输出速度恶化上。当伺服系统受到这些外力时,预计模型输出“异常”。

测试

对于上述测试程序,高斯概率密度作为时间的函数绘制如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单次加载的概率密度,图片由作者提供

请注意,在 6 秒标记附近,震级迅速下降;这是伺服机构经受外部阻力的准确时间,并且持续到外部阻力被移除时的 14 秒标记。

由阈值 0.001 指定的二元分类输出绘制如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单次加载的二进制分类,按作者分类的图像

二元分类反映了上面的高斯概率密度函数图中显示的内容。由于严格的阈值,6–14s 范围内的一些值不被归类为异常。

生成了第二组图来证明外部阻力/异常的重复加载和卸载。请注意,第二个测试使用的是用不同数据训练的模型,因此具有不同的权重。概率密度绘制如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重复加载和卸载的概率密度,图片由作者提供

最初,密度值以总体水平趋势分散。这是因为扭矩值会稍微改变,以保持伺服系统的恒定速度,这是预期的行为。一旦在大约 4.0、8.0 和 12.0 秒的标记处施加载荷,概率密度下降到零。通过观察剧情,很明显伺服发生了一些问题。

下面绘制的是上面绘制的概率密度的二元分类,阈值为 0.0026,这是平均值的 3 个标准偏差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重复加载和卸载的二进制分类,图片由作者提供

该图将证实在上述概率密度图上看到的情况,因为它是概率密度的函数。

结论

实现这种用于异常检测的轻量级高斯概率密度模型可以很好地指示伺服何时需要维护。通过在 PLC 上运行该模型作为后台进程,可以防止不必要的停机时间和对系统的潜在损害。

对这个实现感兴趣吗?联系我。

参考

[1] Ng,a .异常检测[讲座]。机器学习。 Coursera。【https://www.coursera.org/learn/machine-learning

[2]维基百科贡献者。(2021 年 10 月 12 日)。正态分布。在维基百科,免费百科。2021 年 10 月 20 日 03:24 从https://en.wikipedia.org/w/index.php?检索 title =正态分布& oldid=1049556144

[3]列别德津斯基,P. (2021 年 6 月 24 日)。用于评估对象检测模型的单个数字度量。中等。2021 年 11 月 10 日检索,来自https://towardsdatascience . com/a-single-number-metric-for-evaluating-object-detection-models-c97f 4a 98616d。

使用自动编码器的异常检测

原文:https://towardsdatascience.com/anomaly-detection-using-autoencoders-5b032178a1ea?source=collection_archive---------1-----------------------

使用 TensorFlow 中的自动编码器执行欺诈检测

了解什么是自动编码器,它们如何工作,它们的用法,最后实现用于异常检测的自动编码器。

AutoEncoder 是一种生成式无监督深度学习算法,用于使用神经网络重建高维输入数据,该神经网络在中间具有狭窄的瓶颈层,该瓶颈层包含输入数据的潜在表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://lilian Weng . github . io/lil-log/2018/08/12/from-auto encoder-to-beta-vae . html

Autoencoder 由编码器和解码器组成。

  • 编码器网络:接受高维输入数据,并将其转化为潜在的低维数据。编码器网络的输入大小大于其输出大小。
  • 解码器网络:解码器网络从编码器的输出接收输入。解码器的目标是重建输入数据。解码器网络的输出大小大于其输入大小。

自动编码器接受高维输入数据,将其压缩到瓶颈隐藏层的潜在空间表示;解码器将数据的潜在表示作为输入,以重构原始输入数据。

自动编码器的使用

  • **降维。**编码器将输入编码到隐藏层,降低线性和非线性数据的维数;因此,它比 PCA 更强大。
  • 推荐引擎
  • 异常检测:作为训练的一部分,自动编码器试图最小化重建误差。通过检查重建损失的大小来检测异常。
  • 图像去噪:被破坏的图像可以恢复到原来的版本。
  • 图像识别:堆叠式自动编码器通过学习图像的不同特征来进行图像识别。
  • 图像生成:变分自动编码器(VAE),一种自动编码器,用于生成图像。

在这里阅读关于不同类型的自动编码器https://medium.com/datadriveninvestor/deep-learning-different-types-of-autoencoders-41d4fa5f7570

使用自动编码器的异常检测

按照以下步骤检测高维数据集中的异常。您也可以将此应用于不平衡的数据集。

  • 在训练期间,只向编码器输入正常的交易。瓶颈层将学习正常输入数据的潜在表示。
  • 解码器将使用瓶颈层输出来重建原始输入数据的正常事务。
  • 欺诈交易不同于正常交易。自动编码器将难以重建欺诈性交易,因此重建误差将会很高。
  • 您可以根据重建错误的指定阈值,将新交易标记为欺诈交易。

使用自动编码器实现异常检测

这里使用的数据集是来自 Kaggle 的信用卡欺诈检测。

导入所需库

**import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split****from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix, recall_score, accuracy_score, precision_score****RANDOM_SEED = 2021 
TEST_PCT = 0.3
LABELS = ["Normal","Fraud"]**

读取数据集

我已经从 Kaggle 下载了数据,并存储在本地目录中。

**dataset = pd.read_csv("creditcard.csv")**

探索性数据分析

#check for any  nullvalues 
**print("Any nulls in the dataset ",dataset.isnull().values.any() )
print('-------')**
**print("No. of unique labels ", len(dataset['Class'].unique()))
print("Label values ",dataset.Class.unique())**#0 is for normal credit card transaction
#1 is for fraudulent credit card transaction
**print('-------')
print("Break down of the Normal and Fraud Transactions")
print(pd.value_counts(dataset['Class'], sort = True) )**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可视化数据集

绘制数据集中正常交易和欺诈交易的数量。

#Visualizing the imbalanced dataset
**count_classes = pd.value_counts(dataset['Class'], sort = True)
count_classes.plot(kind = 'bar', rot=0)
plt.xticks(range(len(dataset['Class'].unique())), dataset.Class.unique())
plt.title("Frequency by observation number")
plt.xlabel("Class")
plt.ylabel("Number of Observations");**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可视化正常交易和欺诈交易的金额。

# Save the normal and fradulent transactions in separate dataframe
**normal_dataset = dataset[dataset.Class == 0] 
fraud_dataset = dataset[dataset.Class == 1]**#Visualize transactionamounts for normal and fraudulent transactions
**bins = np.linspace(200, 2500, 100)
plt.hist(normal_dataset.Amount, bins=bins, alpha=1, density=True, label='Normal')
plt.hist(fraud_dataset.Amount, bins=bins, alpha=0.5, density=True, label='Fraud')
plt.legend(loc='upper right')**
**plt.title("Transaction amount vs Percentage of transactions")
plt.xlabel("Transaction amount (USD)")
plt.ylabel("Percentage of transactions");
plt.show()**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

创建训练和测试数据集

检查数据集

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

时间和金额是不缩放的列,因此仅对金额和时间列应用 StandardScaler。对 0 和 1 之间的值进行归一化对于数据集来说效果不太好。

**sc=StandardScaler()
dataset['Time'] = sc.fit_transform(dataset['Time'].values.reshape(-1, 1))
dataset['Amount'] = sc.fit_transform(dataset['Amount'].values.reshape(-1, 1))**

数据集中的最后一列是我们的目标变量。

**raw_data = dataset.values**
# The last element contains if the transaction is normal which is represented by a 0 and if fraud then 1
**labels = raw_data[:, -1]**# The other data points are the electrocadriogram data
**data = raw_data[:, 0:-1]****train_data, test_data, train_labels, test_labels = train_test_split(
    data, labels, test_size=0.2, random_state=2021
)**

标准化数据,使其值介于 0 和 1 之间

**min_val = tf.reduce_min(train_data)
max_val = tf.reduce_max(train_data)****train_data = (train_data - min_val) / (max_val - min_val)
test_data = (test_data - min_val) / (max_val - min_val)****train_data = tf.cast(train_data, tf.float32)
test_data = tf.cast(test_data, tf.float32)**

仅使用普通交易来训练自动编码器。

正常数据在目标变量中的值为 0。使用目标变量创建正常和欺诈数据集。

**train_labels = train_labels.astype(bool)
test_labels = test_labels.astype(bool)**#creating normal and fraud datasets **normal_train_data = train_data[~train_labels]
normal_test_data = test_data[~test_labels]****fraud_train_data = train_data[train_labels]
fraud_test_data = test_data[test_labels]
print(" No. of records in Fraud Train Data=",len(fraud_train_data))
print(" No. of records in Normal Train data=",len(normal_train_data))
print(" No. of records in Fraud Test Data=",len(fraud_test_data))
print(" No. of records in Normal Test data=",len(normal_test_data))**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置训练参数值

nb_epoch = 50
batch_size = 64
input_dim = normal_train_data.shape[1] #num of columns, 30
encoding_dim = 14
hidden_dim_1 = int(encoding_dim / 2) #
hidden_dim_2=4  
learning_rate = 1e-7 

创建自动编码器

自动编码器的架构如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

#input Layer
**input_layer = tf.keras.layers.Input(shape=(input_dim, ))**#Encoder**encoder = tf.keras.layers.Dense(encoding_dim, activation="tanh",                                activity_regularizer=tf.keras.regularizers.l2(learning_rate))(input_layer)
encoder=tf.keras.layers.Dropout(0.2)(encoder)
encoder = tf.keras.layers.Dense(hidden_dim_1, activation='relu')(encoder)
encoder = tf.keras.layers.Dense(hidden_dim_2, activation=tf.nn.leaky_relu)(encoder)**# Decoder
**decoder = tf.keras.layers.Dense(hidden_dim_1, activation='relu')(encoder)
decoder=tf.keras.layers.Dropout(0.2)(decoder)
decoder = tf.keras.layers.Dense(encoding_dim, activation='relu')(decoder)
decoder = tf.keras.layers.Dense(input_dim, activation='tanh')(decoder)**#Autoencoder
**autoencoder = tf.keras.Model(inputs=input_layer, outputs=decoder)
autoencoder.summary()**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

定义检查点和提前停止的回调

**cp = tf.keras.callbacks.ModelCheckpoint(filepath="autoencoder_fraud.h5",
                               mode='min', monitor='val_loss', verbose=2, save_best_only=True)
# define our early stopping
early_stop = tf.keras.callbacks.EarlyStopping(
    monitor='val_loss',
    min_delta=0.0001,
    patience=10,
    verbose=1, 
    mode='min',
    restore_best_weights=True**

编译自动编码器

**autoencoder.compile(metrics=['accuracy'],
                    loss='mean_squared_error',
                    optimizer='adam')**

训练自动编码器

**history = autoencoder.fit(normal_train_data, normal_train_data,
                    epochs=nb_epoch,
                    batch_size=batch_size,
                    shuffle=True,
                    validation_data=(test_data, test_data),
                    verbose=1,
                    callbacks=[cp, early_stop]
                    ).history**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

剧情训练和测试损失

**plt.plot(history['loss'], linewidth=2, label='Train')
plt.plot(history['val_loss'], linewidth=2, label='Test')
plt.legend(loc='upper right')
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
#plt.ylim(ymin=0.70,ymax=1)
plt.show()**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

检测测试数据的异常

异常是重建损失较高的数据点

计算测试数据的重建损失,预测测试数据,并计算测试数据和重建的测试数据之间的均方误差。

**test_x_predictions = autoencoder.predict(test_data)
mse = np.mean(np.power(test_data - test_x_predictions, 2), axis=1)
error_df = pd.DataFrame({'Reconstruction_error': mse,
                        'True_class': test_labels})**

绘制测试数据点和它们各自的重建误差设置了阈值,以便可视化是否需要调整阈值。

**threshold_fixed = 50
groups = error_df.groupby('True_class')
fig, ax = plt.subplots()****for name, group in groups:
    ax.plot(group.index, group.Reconstruction_error, marker='o', ms=3.5, linestyle='',
            label= "Fraud" if name == 1 else "Normal")
ax.hlines(threshold_fixed, ax.get_xlim()[0], ax.get_xlim()[1], colors="r", zorder=100, label='Threshold')
ax.legend()
plt.title("Reconstruction error for normal and fraud data")
plt.ylabel("Reconstruction error")
plt.xlabel("Data point index")
plt.show();**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将异常检测为重建损失大于固定阈值的点。这里我们看到阈值为 52 是好的。

评估异常检测的性能

**threshold_fixed =52
pred_y = [1 if e > threshold_fixed else 0 for e in error_df.Reconstruction_error.values]
error_df['pred'] =pred_y
conf_matrix = confusion_matrix(error_df.True_class, pred_y)****plt.figure(figsize=(4, 4))
sns.heatmap(conf_matrix, xticklabels=LABELS, yticklabels=LABELS, annot=True, fmt="d");
plt.title("Confusion matrix")
plt.ylabel('True class')
plt.xlabel('Predicted class')
plt.show()**# print Accuracy, precision and recall
**print(" Accuracy: ",accuracy_score(error_df['True_class'], error_df['pred']))
print(" Recall: ",recall_score(error_df['True_class'], error_df['pred']))
print(" Precision: ",precision_score(error_df['True_class'], error_df['pred']))**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于我们的数据集是高度不平衡的,我们看到了高准确度,但低召回率和精确度。

要进一步提高精确度和召回率,需要添加更多相关的功能、不同的 autoencoder 架构、不同的超参数或不同的算法。

结论:

当我们有一个不平衡的数据集时,Autoencoder 可以用作异常检测算法,我们有很多好的例子,但只有少数异常。自动编码器被训练以最小化重建误差。当我们在正常数据或良好数据上训练自动编码器时,我们可以假设异常将比良好或正常数据具有更高的重建误差。

参考文献:

**https://blog.keras.io/building-autoencoders-in-keras.html

【https://www.deeplearningbook.org/contents/autoencoders.html

https://www . tensor flow . org/tutorials/generative/auto encoder # third _ example _ anomaly _ detection**

异常检测:为什么您的数据团队对此不感兴趣

原文:https://towardsdatascience.com/anomaly-detection-why-your-data-team-is-just-not-that-into-it-580663498d0a?source=collection_archive---------14-----------------------

引入更主动的数据质量方法:数据可靠性生命周期。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Georg Arthur PfluegerUnsplash 上提供。

交付可靠的数据产品不必如此痛苦。

以下是一些最优秀的数据团队在实现主动、迭代的数据信任模型时,转向开发运维及站点可靠性工程寻求灵感的原因和方式。 数据可靠性生命周期 介绍。

想象一下,你是一名汽车修理工。

一辆轿车开进你的车库,发动机发出劈啪声。

“怎么了?”你问,从你的桌子上抬起你的眼睛。

司机摇下车窗。“我的车出了点问题,”他们回答。

很有描述性,你想,擦擦额头的汗。你的讽刺让你窃笑。

"我的车出了点问题。"他们重复,这次没有收缩。

几个小时后,你发现这辆车的火花塞松了。当然,他们缺乏信息并不是世界末日,但是想象一下,如果他们积极主动地说:

"我的引擎无法启动,我的车无法加速,我的电池也一直没电。"记住,你是个机械师。😃

你会问,这和数据有什么关系?嗯,表面上看,不多。但是在构建更可靠的数据系统时,我们可以从我们友好的机械师那里学到一两件事。

数据质量:反应式方法

如今,大多数数据团队采用某种 异常检测 措施来解决数据质量问题。异常检测非常适合希望确定数据健康的关键支柱(即,容量、新鲜度、模式和分布)何时未能满足组织的生产预期的组织。此外,当端到端实现时(例如跨您的数据仓库、lake、ETL 和 BI 工具),异常检测对企业来说非常有价值,而不是只存在于您的数据平台的一两层中。

太好了,你知道你的数据坏了。现在怎么办?

正如大多数数据团队所了解的那样,当涉及到建立洞察力驱动的组织所需的信任、责任和透明度时,仅靠异常检测是不够的。

最近,我和一家财富 500 强软件公司的分析副总裁一起喝(虚拟)咖啡,他几乎完美地总结了这个问题。

“我想要与影响相关的东西,这样我就可以对它们采取行动,”他说。“异常检测作为起点是必要的,但我们需要做更多的工作来了解根本原因并评估影响。知道有问题是很好的,但是真的很难理解如何处理它。相反,我们需要确切地了解是什么出了问题,谁受到了它的影响,它出问题的原因和位置,以及根本原因可能是什么。我对异常检测一点也不感兴趣

显然,我们需要一种更好的方法来了解并主动改善数据的健康状况。幸运的是,现代数据团队只需要看看我们的 DevOps 和现场可靠性工程同行,就可以在 DevOps 生命周期中获得灵感。

DevOps 的生命周期是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 萨万阿吉特 Shutterstock由作者购买用于 标准商业许可

开发人员运营(DevOps) 团队已经成为大多数工程组织不可或缺的组成部分,打破了软件和基础设施团队之间的孤岛。为了促进代码及其底层架构的快速开发,DevOps 团队应用了一个反馈循环,称为 DevOps 生命周期,它帮助团队可靠地交付与大规模业务目标一致的功能。

DevOps 生命周期包含 8 个不同的连续阶段,包括:

  • 规划:与产品和业务团队合作,理解软件的目标和 SLA。
  • 开发:写软件。
  • 集成:将软件与您现有的应用程序集成。
  • 测试:测试你的软件。
  • 发布:将你的软件发布到测试环境中。
  • 部署:将您的软件部署到生产环境中。
  • 操作:运行软件,根据需要进行调整。
  • 监控:监控软件中的问题并发出警报。

如此循环往复。虽然我们的许多数据技术和框架(即数据测试、数据 SLA、分布式架构等。)已经适应了由我们的软件工程同行设定的标准和最佳实践,我们被动处理数据质量的倾向阻止了我们以有意义和可伸缩的方式推动业务的变化。

数据可靠性生命周期简介

就像 DevOps 应用一个连续的反馈循环来改进软件一样,我认为现在是我们利用同样的数据勤奋的时候了。

数据可靠性生命周期是一种持续、主动改善数据健康的全组织方法,它通过将 DevOps 的最佳实践应用于数据管道来消除数据停机。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由巴尔·摩西提供。

该框架允许数据团队:

  1. 率先了解生产中的数据质量问题。
  2. 充分理解问题的影响。
  3. 完全了解数据是从哪里泄露的。
  4. 采取措施解决问题。
  5. 收集经验,这样随着时间的推移,你可以防止问题再次发生。

方法如下:

发现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由巴尔·摩西提供。

在您测试了您的数据并将其应用到生产中之后,最重要的是监控和警告您的管道中的异常,换句话说,如果和当数据问题发生时,检测。异常检测是该策略的一个重要部分,尽管主要是被动的。

针对新鲜度、数量和基于分发的问题的自动监控和警报将有助于跟踪您的数据可靠性SLA 和 SLIs ,当您不符合这些要求时,请确保您是第一个知道的人。随着数据管道变得越来越复杂,数据必然会在某一点或另一点中断,能够缩短检测的时间 (TTD)对于数据驱动的企业来说至关重要。

解决

数据可靠性生命周期的第二个阶段是解决,需要您评估损坏的数据对更大的数据生态系统和相应的数据产品的影响,并将问题向下游传达给需要知道的人。理想情况下,整个影响分析过程应该是集中的,并对相应的警报进行适当的分组和标记。

你的团队不仅需要了解事件发生的时间和方式,还需要了解事件的严重性。破坏 CEO 仪表盘的表格不值得像跟踪内部事件页面浏览量的表格一样被关注。对他们一视同仁的成本对你的团队的生产力和整个企业都是有害的。

在循环的这一部分,可以使用端到端的沿袭和统计分析来理解手头问题的根本原因。随着团队越来越擅长理解、分类和响应事件,他们可以减少解决常见或预期数据事件的https://www.montecarlodata.com/data-quality-you-are-measuring-it-wrong/#:~:text=Time-to-resolution (TTR)(TTR)时间。

预防

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置数据治理仪表板(如 Looker 中的这个)可以帮助数据团队更好地了解数据问题和随时间的变化,以便他们可以采取主动措施来防止未来的事件。图片由作者提供。

数据可靠性生命周期的预防阶段处理您先前的知识和有关数据管道的历史信息,并将其转化为可操作的预防性步骤。例如,并不是你的工程师公司对现有数据集进行的每个模式更改都意味着你的管道着火了;事实上,模式更新通常意味着发展和进步。然而,如果没有适当的上下文,数据可靠性生命周期的检测阶段(换句话说,异常检测)将无法挑选这些队列。

你对病因了解得越具体越好。让我们回顾一下我们的汽车修理工——听起来很傻,对吗?但是就像说“我的车坏了,你能修好它吗?”给你可怜的机械师一点工作燃料(双关语),告诉一个数据工程师“我的财务报告中有空值,你能修复它吗?”几乎没有帮助。如果没有与损坏报告的根本原因相关的所有详细信息,可能需要几个小时甚至几天的时间来了解问题的原因,并相应地防止未来的事件。

通过应用数据可靠性生命周期,团队应该能够显示日志、元数据和关于数据的查询,以衡量甚至预测数据健康状况。更高级的生命周期还应该能够自动调整和更新测试和监视器,以匹配不断发展的业务逻辑,进而减少 数据停机

数据质量的未来是前瞻性的

机械师和软件工程师并不是唯一受益于对他们的工艺采取积极的、迭代的方法的人。

通过应用 DevOps 的类似原则,数据团队可以更好地协作来识别、解决甚至从一开始就防止数据质量问题的发生。在接下来的几个月里,我很高兴看到这种方法如何发展,以及数据系统如何成熟,变得更具弹性和可靠性。

下次你见到你的机械师时:谢谢她。你不知道她经历了什么!

有兴趣了解更多关于数据可靠性生命周期的信息吗?伸出手去 巴尔摩西 或者剩下的 蒙特卡洛团队

基于极值分析的异常检测

原文:https://towardsdatascience.com/anomaly-detection-with-extreme-value-analysis-b11ad19b601f?source=collection_archive---------15-----------------------

使用极值理论解释异常检测结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

伊恩·西蒙兹在 Unsplash 上拍摄的照片

极值分析(EVA)是一种统计方法,主要用于估计与之前观察到的事件相比最为罕见的事件的概率。应用领域一般是工程、气象、水文、金融和海洋学。事实上,这是一种存在于不同年代的方法,用于处理参考分布的极端偏差。

我们能做的是更进一步。我们在异常检测的应用中评估我们的深度学习模型期间使用 EVA。我们并不试图重新发明任何东西,我们只是使用极值理论来为我们的监督方法的结果提供额外的解释。我们的方法与算法无关,可以很容易地推广或修改,以适应每个建模管道。

在这篇文章中,我们开发了一个基于深度学习结构的时间序列预测应用程序。在正确验证之后,我们通过 EVA 来检验预测的可靠性。我们检查在选定的控制周期内产生的残差,以确定它们有多“极端”,以及它们在未来会有多“频繁”。生成关于这些方面的统计数据和置信度允许我们指出异常情况,即不由我们的深度学习框架建模的情况,在未来会如何揭示。

数据

我们使用来自温哥华开放数据目录的数据集。在 Kaggle 上可以很容易地访问它,它报告了从 2003 年到 2017 年在加拿大城市登记的超过 5 亿份犯罪记录。我们只关注日常犯罪的汇总系列。如下图所示,这个系列看起来噪音很大。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每日汇总犯罪的原始系列(图片由作者提供)

然而,在每周和每月的水平上可以检测到某种形式的季节性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

犯罪系列的季节性水平(图片由作者提供)

模型

我们使用这些信息建立一个预测模型,根据过去的观察结果预测未来几天的犯罪。针对这种任务,我们开发了 Seq2Seq LSTM 自动编码器。它的结构非常适合对我们处理的数据进行建模,因为我们可以将原始时间信号与时间嵌入的创建相结合。编码器被输入数字输入序列(目标历史序列)加上历史工作日和月份的数字嵌入。解码器接收解码器输出加上未来工作日和月份的数字嵌入,以产生 7 天预测。

通过 keras-hypetune一种仅基于 NumPy 的 keras 超参数调整的简单框架,利用网格搜索方法优化验证集上的参数,从而计算训练过程。

下面描述了我们的验证集生成的预测,以及为每个未来时滞计算的相应性能。我们的参考基线由最后一次有效观察的虚拟重复构成。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同时间范围的现实与预测(图片由作者提供)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在不同时间范围内计算的 MSE(图片由作者提供)

极值分析

在这一点上,我们的模型的一个优化版本已经被训练好并可以使用了。我们现在要做的是运用 EVA 的一些典型技术来解释这些性能。在我们的实验中,术语“验证集”用于以更一般的方式定义“控制组”,即用于操作调整和 EVA 应用的时间间隔。

我们感兴趣的第一个要素是我们的模型在验证集上生成的残差。我们认为残差的绝对值是极值。这种选择是合理的,因为它们代表了我们的预测模型表现不佳的未知情况。换句话说,我们的模型倾向于错误的情况还没有被研究,因此被标记为异常事件。异常的程度是通过与现实和预测的距离来衡量的。EVA 的标准方法包括将高于固定阈值的所有观察值(峰值超过阈值)识别为异常/极端,或者构建将原始序列分成块的最大值序列(块最大值方法)。方法的选择与领域相关,可以产生不同的结果。当然,从模型残差中导出极值可以给我们信心来处理平稳序列,这是 EVA 的先决条件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左起:应用于残差序列的块极大值法;在每个区块中检测到的一系列最大值点(图片由作者提供)

第二步是建立极值模型。我们希望分配这些值来自的参考分布。根据之前对如何选择异常/极值所做的选择,我们有不同的候选分布可供选择。对于我们的工作,我们选择块最大值方法,块的长度为 30 天。通过这种方法,我们有信心认为极端事件来自广义极值(GEV)或 Gumble 分布。该选择可以通过执行最大似然估计进行数学计算,从中我们选择具有最佳参数的最佳分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

异常/极端情况的经验分布和估计分布(图片由作者提供)

有了这些零件,我们就可以开始下一步了。我们只需要选择一些时间步长,技术上称为返回周期,在此基础上计算相对返回值。对于每个返回周期,我们可以预期至少会看到一个实例超过估计的返回值。给定 t 作为一个重现期,一个预期的返回值( E) 意味着在接下来的 t *30 天内,我们可以预期看到一些值以等于 1/t 的概率超过 E 。在我们的具体研究案例中,返回值是我们在未来可能会超过的残差,即我们可以归类为异常的意外事件。

在下面的图中,我们可以显示未来的模型化返回值,以及我们的验证集的观察到的最大值。附表更正式地总结了我们的发现。例如,第一行表示,在接下来的 30 天内,我们有望(以相对较高的概率)获得超过我们模型预测值 21 个绝对点的观测值。同样,最后一行表示,我们可以预期(以相对较低的概率)在接下来的 3000 天内,我们的模型预测会有超过 53 个绝对点的观测值。使用自举统计来计算置信区间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

t+1 时残差的返回值图。红色表示每个区块中检测到的一系列最大值点。蓝色表示预期返回值和相对引导区间(图片由作者提供)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

t+1 时残差的返回值表(图片由作者提供)

所解释的程序适用于一步预测的残差,但同样可以计算其他预测范围。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

t+7 时残差的返回值图。红色表示每个区块中检测到的一系列最大值点。蓝色表示预期返回值和相对引导区间(图片由作者提供)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

t+7 时残差的返回值表(图片由作者提供)

摘要

在这篇文章中,我们提出了一个时间序列预测任务。首先,我们为多步预测建立了一个 Seq2Seq 模型。其次,我们试图结合极值理论中的一些技巧对我们的模型作进一步的解释。我们利用这种组合来解释正常数据流中可能出现的异常,这是我们的模型无法识别的。

查看我的 GITHUB 回购

保持联系: Linkedin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值