15 异常检测(Anomaly Detection)
这种算法虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题。
15.1 问题动机
例:假想一个飞机引擎制造商,当他生产的飞机引擎从生产线上流出时,需要进行QA(质量控制测试),而作为这个测试的一部分,他测量了飞机引擎的一些特征变量,比如引擎运转时产生的热量,或者引擎的振动等等。这样一来,就有了一个数据集,从 x(1) 到 x(m) ,如果你生产了 m 个引擎的话,你将这些数据绘制成图表:
这里的每个点都是收集的无标签数据。异常检测问题可以定义如下:假设有一天,有一个新的飞机引擎从生产线上流出,而新飞机引擎有特征变量。所谓的异常检测问题就是:我们希望知道这个新的飞机引擎是否有某种异常,或者说,我们希望判断这个引擎是否需要进一步测试。因为,如果它看起来像一个正常的引擎,那么我们可以直接将它运送到客户那里,而不需要进一步的测试。
给定数据集 ,假使数据集是正常的,我们希望知道新的数据是不是异常的,即这个测试数据不属于该组数据的几率如何。我们所构建的模型应该能根据该测试数据的位置告诉我们其属于一组数据的可能性 。
如下图,当测试数据在最密集的地方表示此数据没问题,当他离所有样本明显很远的时候,表示它是异常的。这种方法称为密度估计,表达如下:
异常检测的实际应用:
①欺诈检测: 表示用户的第 i 个活动特征,模型是其属于一组数据的可能性,通过检测非正常用户。在线采集而来的有关用户的数据,一个特征向量中可能会包含如:用户多久登录一次,访问过的页面,在论坛发布的帖子数量,甚至是打字速度等。尝试根据这些特征构建一个模型,可以用这个模型来识别那些不符合该模式的用户。
②检测数据中心:特征可能包含:内存使用情况,被访问的磁盘数量,CPU的负载,网络的通信量等。根据这些特征可以构建一个模型,用来判断某些计算机是不是有可能出错了。
15.2 高斯分布
高斯分布也叫正态分布。高斯分布有两个参数(均值,方差),如果实数x符合高斯分布记作.下图是高斯分布的图像:
其概率密度函数为:
其中:
,
高斯分布的例子:决定图像的中心,决定图像的宽窄。
15.3 算法
用高斯分布构建一个异常检测算法。
对于给定的数据集 ,我们要针对每一个特征计算和 的估计值。
,
获得了平均值和方差的估计值后,给定新的一个训练实例,根据模型计算 :
当时,异常。
下图是一个由两个特征的训练集,以及特征的分布情况:
下面的三维图表表示的是密度估计函数, z 轴为根据两个特征的值所估计值:
设定一个作为判定边界,当大于它时,正常,反之,异常。
15.4 开发和评估异常检测系统
异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量 y 的值来告诉我们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。当我们开发一个异常检测系统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试集。
例如:我们有10000台正常引擎的数据,有20台异常引擎的数据。 可以这样分配数据:
6000台正常引擎——训练集
2000台正常引擎和10台异常引擎——交叉检验集
2000台正常引擎和10台异常引擎——测试集
评估方法如下:
- 根据测试集数据,估计特征的平均值和方差并构建 p(x) 函数
- 对交叉检验集,尝试使用不同的 ε 值作为阈值,并预测数据是否异常,根据F1值或者查准率与查全率的比例来选择 ε
- 选出 ε 后,针对测试集进行预测,计算异常检验系统的 F1 值,或者查准率与查全率之比
15.5 异常检测VS监督学习
之前我们构建的异常检测系统也使用了带标记的数据,与监督学习有些相似,那么解决问题时就有了两种选择。异常检测或者监督学习,它们在选择上有些区别:
异常检测:
- 非常少量的正向类(异常数据 y=1 ), 大量的负向类( y=0 )
- 许多不同种类的异常,非常难。根据非常 少量的正向类数据来训练算法。未来遇到的异常可能与已掌握的异常、非常的不同。
- 例如: 欺诈行为检测 生产(例如飞机引擎)检测数据中心的计算机运行状况
监督学习
- 同时有大量的正向类和负向类
- 有足够多的正向类实例,足够用于训练 算法,未来遇到的正向类实例可能与训练集中的非常近似
- 例如:邮件过滤器 天气预报 肿瘤分类
15.6 如何选择特征
下面介绍如何选择特征,以及对特征进行一些小小的转换,让数据更像正态分布,然后再把数据输入异常检测算法。同时也介绍了建立特征时,进行的误差分析方法,来捕捉各种异常的可能。
对于异常检测算法,我们使用的特征是至关重要的,如何选择特征:
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数: x=log(x+c) ,其中 c 为非负常数; 或者 x=xc , c 为 0-1 之间的一个分数,等方法。(编者注:在python中,通常用np.log1p()
函数, log1p 就是 log(x+1) ,可以避免出现负数结果,反向函数就是np.expm1()
)
误差分析:一个常见的问题是一些异常的数据可能也会有较高的 p(x) 值,因而被算法认为是正常的。这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。
通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征(异常数据的该特征值异常地大或小),例如,在检测数据中心的计算机状况的例子中,我们可以用CPU负载与网络通信量的比例作为一个新的特征,如果该值异常地大,便有可能意味着该服务器是陷入了一些问题中。
15.7 多变量高斯分布
假使我们有两个相关的特征,而且这两个特征的值域范围比较宽,这种情况下,一般的高斯分布模型可能不能很好地识别异常数据。其原因在于,一般的高斯分布模型尝试的是去同时抓住两个特征的偏差,因此创造出一个比较大的判定边界。
下图中是两个相关特征,粉红色的同心圆(根据ε的不同其范围可大可小)是一般的高斯分布模型获得的判定边界,很明显绿色的样本点所代表的数据点很可能是异常值,但是其 p(x) 值却仍然在正常范围内。而多元高斯分布将创建像图中蓝色曲线所示的判定边界。
在一般的高斯分布模型中,计算的方法是: 通过分别计算每个特征对应的几率然后将其累乘起来,在多元高斯分布模型中, 构建特征的协方差矩阵,用所有的特征一起来计算 。首先计算所有特征的平均值,然后再计算协方差矩阵:
, μ 是一个向量,其每一个单元都是原特征矩阵中一行数据的均值。
, 是定矩阵,在 Octave 中用计算。
最后计算的多元高斯分布:
下面我们来看看协方差矩阵是如何影响模型的:参数修改不同,将得到不同的高斯分布平面图。
15.8 使用多变量高斯分布的异常检测
开发异常检测算法的步骤:
1.用数据集来拟合该模型p(x):通过设定和
2.假设有了一个新样本,就计算p(x),如果p(x)很小,就标记该样本为异常
原高斯分布模型和多元高斯分布模型的比较:
①相关性:
原高斯分布模型:不能捕捉特征之间的相关性 但可以通过将特征进行组合的方法来解决。
多元高斯分布模型:自动捕捉特征之间的相关性。
②计算代价:
原高斯分布模型:计算代价低,能适应大规模的特征n。
多元高斯分布模型:计算代价较高 训练集较小时也同样适用。
此外,多元高斯分布模型必须要有 m>n ,不然的话协方差矩阵 Σ 不可逆的,通常需要 m>10n ,另外特征冗余也会导致协方差矩阵不可逆。
原高斯分布模型被广泛使用着,如果特征之间在某种程度上存在相互关联的情况,我们可以通过构造新新特征的方法来捕捉这些相关性。如果训练集不是太大,并且没有太多的特征,我们可以使用多元高斯分布模型。
16 推荐系统(Recommender Systems)
16.1 问题规划
对机器学习来说,特征是很重要的,我们所选择的特征,将对学习算法的性能有很大的影响。因此,在机器学习中有一种大思想,它针对一些问题,可能并不是所有的问题,而是一些问题,有算法可以为你自动学习一套好的特征。因此,不要试图手动设计,而手写代码这是目前为止我们常干的。有一些设置,可以有一个算法,仅仅学习其使用的特征,推荐系统就是这种类型的一个例子。还有很多其它的,但是通过推荐系统,我们将领略一小部分特征学习的思想,至少,能够了解到这方面的一个例子。
举例:电影评分系统,假使我们是一个电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分。
前三部电影是爱情片,后两部则是动作片,我们可以看出Alice和Bob似乎更倾向与爱情片, 而 Carol 和 Dave 似乎更倾向与动作片。并且没有一个用户给所有的电影都打过分。我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据。
这其中包括一些变量:
代表用户的数量
代表电影的数量
如果用户 j 给电影 i 评过分则
代表用户 j 给电影 i 的评分
16.2 基于内容的推荐算法
还是电影评分系统的例子,假设对于每一部电影都对应两个特征值:(爱情片程度)、(动作片程度)。那么每一部电影都会产生特征向量:
如果要预测某个人对某部电影的评分,可以看作线性回归问题,对于每一个用户j,通过他的喜好可以学习训练出一组参数,在本例中,n=2(电影的两个特征),预测时只需计算即可得到评价分的预测值。
总结一下预测评分的过程:
①先找到用户j的参数向量和电影i的特征向量
②预测评分等于
代价函数:针对用户 j ,该线性回归模型的代价为预测误差的平方和,加上正则化项。
其中 表示我们只计算那些用户评过分的电影。在一般的线性回归模型中,误差项和正则项应该都是乘以(表示用户评价过的电影数量) ,在这里我们将去掉。并且我们不对方差项进行正则化处理。
上面的代价函数只是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:
如果我们要用梯度下降法来求解最优解,我们计算代价函数的偏导数后得到梯度下降的更新公式为:
16.3 协同过滤
在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征。
也就是说,问题为我们提供了用户的参数向量,我们需要计算学习电影的特征向量,我们能做的就是提出下列优化问题:
要学习出所有电影的特征向量,就需要对所有电影的代价函数求和:
这是给定了用户的参数,我们才能计算出电影的特征,上一节是已知电影特征,可以计算出用户参数,但是如果我们既没有用户的参数,也没有电影的特征,这两种方法都不可行了。协同过滤算法可以同时学习这两者。 它通过随机初始化用户参数,再得到电影特征,随着用户一次次的评分,再进行计算用户参数,再得到新的电影特征,不断更新,这样预测的用户兴趣越来越准确。
16.4 协同过滤算法
如果我们既没有用户的参数,也没有电影的特征,上面两种方法都不可行。协同过滤算法可以同时学习这两者。也就是将两个优化目标相结合得到一个代价函数,电影特征和用户参数同时针对和进行。
对代价函数求偏导数的结果如下:
协同过滤算法使用步骤如下:
- 初始为一些随机小值
- 使用梯度下降算法最小化代价函数
- 在训练完算法后,我们预测为用户 j 给电影 i 的评分
16.5 矢量化:低秩矩阵分解
本节总结了协同过滤算法的向量化实现,以及有关该算法可以做的其他功能。
协同过滤算法能做的其他事情举例:给定一个商品,可以找到与之相关的其他商品。
我们要做的是:实现一种选择的方法,写出协同过滤算法的预测情况。
还是上面的电影评分系统,五部电影,四位用户,我们想得到所有用户对所有电影的评分,然后把他们分组写入矩阵,矩阵的维度就是5*4.
预测评分矩阵:
如何找到相关影片:
电影 i 有一个特征向量,要找到一部不同的电影 j ,保证两部电影的特征向量之间的距离 和 很小,那就能很有力地表明电影 i 和电影 j 在某种程度上有相似,至少在某种意义上,某些人喜欢电影 i ,或许更有可能也对电影 j 感兴趣。总结一下,当用户在看某部电影 i 的时候,如果想找5部与电影非常相似的电影,为了能给用户推荐5部新电影,需要做的是找出电影 j ,在这些不同的电影中与我们要找的电影 i 的距离最小的电影,这样就能给你的用户推荐几部不同的电影了。 而这个距离也就是。
16.6 实施细节:均值归一化
有时均值归一化会使算法运行得更好。
举例:新增用户Eve,他没有给任何一部电影评分,那么系统该如何为他推荐电影呢。这里就用到了均值归一化,得到一组新的评分,他们的均值都为0.
然后我们利用这个新的 Y 矩阵来训练算法。 如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测 ,对于Eve,我们的新模型会认为她给每部电影的评分都是该电影的平均分。
这就是均值归一化,他作为协同过滤算法的预处理步骤。