Machine Learning Chinese NLP :::: Anomaly Detection Algorithm - Chad Salinas ::: Data Scientist
Life and times of Chad Salinas
Chad Salinas, golf caddy, data scientist, chad rPubs, recovering chess addict, daddy caddy
1313
post-template-default,single,single-post,postid-1313,single-format-standard,qode-listing-1.0.1,qode-social-login-1.0,qode-news-1.0,qode-quick-links-1.0,qode-restaurant-1.0,ajax_fade,page_not_loaded,,qode-title-hidden,qode_grid_1300,qode-theme-ver-12.0.1,qode-theme-bridge,bridge,wpb-js-composer js-comp-ver-5.4.2,vc_responsive

Machine Learning Chinese NLP :::: Anomaly Detection Algorithm

Developing and Evaluating Anomaly Detection Systems

我们推导了异常检测算法 
在这段视频中 
我想介绍一下 
如何开发一个 
关于异常检测的应用 
来解决一个实际问题 
具体来说 
我们将重点关注如何评价一个异常检测算法 
在前面的视频中 我们已经提到了 
使用实数评价法的重要性 
这样做的想法是 
当你在用某个学习算法 
来开发一个具体的 
机器学习应用时 
你常常需要做出很多决定 
比如说 选择用什么样的特征 等等 
而如果你找到某种 
评价算法的方式 
直接返回一个数字 
来告诉你算法的好坏 
那么你做这些决定就显得更容易了

所以比如你要决定

现在有一个额外的特征 
我要不要把这个特征考虑进来? 
如果你带上这个特征 
运行你的算法 
再去掉这个特征运行你的算法 
然后得到某个返回的数字 
这个数字就直接告诉你 
这个特征到底是让算法表现变好了还是变差了 
这样 你就有了一种更好 
更简单的方法 
来确定是不是应该加上这个特征

为了更快地 
开发出一个 
异常检测系统 
那么最好能找到某种 
评价异常检测系统的方法

为了做到这一点 
为了能评价一个 
异常检测系统 
我们先假定已有了一些带标签的数据 
所以 我们要考虑的 
异常检测问题 
是一个非监督问题 
使用的是无标签数据 
但如果你有一些 
带标签的数据 
能够指明哪些是异常样本 
哪些是非异常样本 
那么这就是我们要找的 
能够评价异常检测算法的标准方法 
还是以 
飞机发动机的为例 
现在假如你有了一些 
带标签数据 
也就是有异常的飞机引擎的样本 
这批制造的飞机发动机是有问题的 
可能有瑕疵 或者别的什么问题 
同时我们还有 
一些无异常的样本 
也就是一些 
完全没问题的样本 
我用 y=0 来表示那些 
完全正常 
没有问题的样本 
用 y=1 来代表那些异常样本

那么异常检测算法的推导和评价方法 
如下所示

我们先考虑 
训练样本 
交叉验证和测试集等下考虑 
对于训练集 
我们还是看成无标签的

训练集 
所以这些就是 
所有正常的 
或者说无异常样本的集合

通常来讲 
我们把这些都看成无异常的 
但可能有一些异常的 
也被分到你的训练集里 
这也没关系 
接下来我们要 
定义交叉验证集 
和测试集 
通过这两个集合我们将得到异常检测算法 
具体来说 
对交叉验证集和测试集 
我们将假设 
我们的交叉验证集 
和测试集中 
有一些样本 
这些样本都是异常的 
所以比如测试集 
里面的样本就是 
带标签y=1的 
这表示有异常的飞机引擎

这是一个具体的例子

假如说 
这是我们总的数据 
我们有10000制造的引擎 
作为样本 
就我们所知 这些样本 
都是正常没有问题的飞机引擎 
同样地 如果有一小部分 
有问题的引擎 
也被混入了这10000个样本 
别担心 没有关系 
我们假设 
这10000个样本中 
大多数都是好的 没有问题的引擎 
而且实际上 从过去的经验来看 
无论是制造了多少年 
引擎的工厂 
我们都会得到这些数据 
都会得到大概20个 
有问题的引擎 
对于异常检测的典型应用来说 
异常样本的个数

也就是y=1的样本 
基本上很多都是20到50个 
通常这个范围 
对y=1的样本数量 
还是很常见的 
并且通常我们的 
正常样本的数量要大得多

有了这组数据

把数据分为训练集 
交叉验证集和测试集 
一种典型的分法如下

我们把这10000个正常的引擎 
放6000个到 
无标签的训练集中 
我叫它“无标签训练集” 
但其实所有这些样本 
实际上都对应 
y=0的情况 至少据我们所知是这样 
所以 我们要用它们 
来拟合p(x) 
也就是是我们用这6000个引擎 
来拟合p(x) 
也就是p 括号 
x1 参数是μ1 
σ1的平方 
一直到p(xn; μn, σn^2) 
参数是μn σn的平方

因此我们就是要用这 
6000个样本 
来估计参数 
μ1, σ1 
一直到 
μn, σn 
这就是训练集中的好的样本 
或者说大多数好的样本

然后 我们取一些 
好的飞机引擎样本 
放一些到交叉验证集 
再放一些到 
测试集中 
正好6000加2000加2000 
这10000个好的样本 
就这样进行分割了 
同时 我们还有20个 
异常的发动机样本 
同样也把它们进行一个分割 
放10个到验证集中 
剩下10个 
放入测试集中 
在下一张幻灯片中 
我们将看到如何用 
这些分好的数据 
来推导异常检测的算法

好的 
刚才我介绍的这些内容 
可能是一种 
比较推荐的方法来划分带标签和无标签的数据 
来划分好的和坏的飞机引擎样本 
我们使用了 
6:2:2的比例 
来分配好的引擎样本 
而坏的引擎样本 
我们只把它们放到 
交叉验证集和测试集中 
在下一页中我们将讲解这样分的理由

顺便说一下 
如果你看到别人应用 
异常检测的算法时 
有时候也可能会有不同的分配方法 
另一种分配数据的方法是这样的 
其实我真的不推荐这么分 
但就有人喜欢这么分 
也就是把10000个好的引擎分出6000个 
放到训练集中 
然后把剩下的4000个样本 
既用作交叉验证集

也用作测试集 
通常来说我们要交叉验证集 
和测试集当作是 
完全互不相同的 
两个数据组

但就像我说的 在异常检测中 
有时候你会发现有些人 
会使用相同的 
一部分好的引擎样本 
用作交叉验证集 
也用作测试集 
并且有时候你还会发现 
他们会把同样的一些异常样本

放入交叉验证集合测试集 
总之 所有这样考虑的 
都不是一个好的尝试 非常不推荐

把交叉验证集 
和测试集数据 
混在一起共用 
确实不是一个比较好的机器学习惯例 
但这种情况还不少见

话说回来 给出之前分好的 
训练集、交叉验证集和测试集 
异常检测算法的 
推导和评估方法如下

首先 我们使用训练样本 
来拟合模型p(x) 
也就是说 
我们用所有这些高斯函数 
来拟合m个无标签的飞机引擎样本 
虽然这里我称它们为 
无标签的样本 
但实际上是我们假设的 
都是正常的飞机引擎

然后假定你的 
异常检测算法作出了预测 
所以 给出交叉验证集 
或者测试集 
给出某个测试样本x 
假设这个算法对 p(x)<ε 
的情况作出的 
预测为 y=1 
而p(x)≥ε时 
算法作出的预测为 
y=0

也就是说 给出x的值 
预测出y的值 y=1对应 
有异常的样本 
y=0对应正常样本 
所以给定训练集、交叉验证集和测试集 
你应该如何推导算法呢? 
或者更具体来说 
怎样评估一个异常检测算法呢? 
为了推导算法 
我们的第一步是 
取出所有的无标签的训练样本 
拟合出模型p(x) 
虽然我说的是 
无标签的训练集 
但实际上这些样本 
我们已经假设它们 
大多数都是正常的飞机引擎 
是没有异常的 
然后要用这些训练集 
拟合出模型p(x) 
也就是用所有这些 
高斯模型拟合出参数

接下来 对交叉验证集 
和测试集 
我们要让异常检测算法 
来对y的值 
作出一个预测 
所以 假如对我的每一个 
测试样本 
我们有

(x(i)test, y(i)test) 
其中y=1或0 
对应于这个样本是否是异常的

因此 给定测试集中的输入x 
我的异常检测算法 
将作出预测 
当p(x)小于ε时 预测y=1 
所以 在概率值很小的时候 预测样本是异常的 
如果p(x)的值大于或等于ε时 
算法将预测y=0 
也就是说如果概率p(x)比较大的时候 
预测该样本为正常样本

所以现在 
我们可以把 
异常检测算法想成是 
对交叉验证集 
和测试集中的y 
进行一个预测 
这样多多少少让人感到 
和监督学习有点类似 不是吗? 
我们有带标签的测试集 
而我们的算法就是 
对这些标签作出预测 
所以我们可以通过 
对标签预测正确的次数来进行评价

当然 这些标签会比较偏斜 
因为y=0 
也就是正常的样本 
肯定是比出现 
y=1 也就是异常样本 
的情况更多

这跟我们在监督学习中 
用到的评价度量 
方法非常接近

那么用什么评价度量好呢? 
因为数据是非常偏斜的 
因为y=0是 
更加常见的 
因此分类准确度不是一个好的度量法 
我们之前的视频中也讲过

如果你有一个 
比较偏斜的数据集 
那么总是预测y=0 
它的分类准确度自然会很高

取而代之的 
我们应该算出 
真阳性、假阳性、 
假阴性和真阴性的比率 
来作为评价度量值 
我们也可以算出查准率和召回率 
或者算出 
F1-积分 
通过一个很简单的数字 
来总结出查准和召回的大小 
通过这些方法 
你就可以评价你的异常检测算法 
在交叉验证和测试集样本中的表现

最后一点 之前在 
异常检测算法中 
我们有一个参数ε对吧? 
这个ε是我们用来决定 
什么时候把一个样本当作是 
异常样本的一个阈值

所以 如果你有 
一组交叉验证集样本 
一种选择参数ε的方法 
就是你可以试一试 
多个不同的 
ε的取值 
然后选出一个 
使得F1-积分的值最大的那个ε 
也就是在交叉验证集中表现最好的

更一般来说 
我们使用训练集、测试集 
和交叉验证集的方法是

当我们需要作出决定时 
比如要包括哪些特征 
或者说要确定参数ε取多大合适 
我们就可以 
不断地用交叉验证集 
来评价这个算法 
然后决定我们应该 
用哪些特征 
怎样选择ε 
所以 就是在交叉验证集中 
评价算法 
然后我们选出一组特征 
或者当我们找到了 
能符合我们要求的ε的值后 
我们就能用最终的模型 
来评价这个算法 
或者说 用测试集 来最终评价算法的表现

在这段视频中 
我们介绍了 
如何评价一个异常检测算法 
同样地 
在能够评价算法之后 
通过一个简单的的 
数值的评价方法 
用一个简单的F1-积分 
这样你就能更有效率地 
在开发异常检测系统时 
更有效率地利用好你的时间 
把时间用在刀刃上 
我们能够作出决定 
确定应该如何选取ε 应该包括哪些特征等等 
在这段视频中 
刚开始我们用了一组 
带标签的数据 
目的是为了评价异常检测算法 
这让我们感觉到 
跟监督学习很相像

在下一节视频中 
我们将更深入地谈到这个问题 
具体来说 我们将谈到 
应该如何使用异常检测算法 
以及什么时候我们应该用监督学习 
这两种算法到底有什么区别 
 

Any programming problem can be solved by adding a level of indirection.

– David J. Wheeler

No Comments

Sorry, the comment form is closed at this time.