AnomalyDetection(异常检测)
ProblemMotivation(问题的动机)
给定数据集x(1),x(2),..,x(m),我们假使数据集是正常的,我们希望知道新的数据xtest 是不是异常的,即这个测试数据不属于该组数据的几率如何。我们所构建的模型应该能根据该测试数据的位置告诉我们其属于一组数据的可能性 p(x)。
上图中,在蓝色圈内的数据属于该组数据的可能性较高,而越是偏远的数据,其属于该组数据的可能性就越低。
这种方法称为密度估计,表达如下:
欺诈检测:
X(i)=用户的第 i 个活动特征
模型p(x) =我们其属于一组数据的可能性
通过p(x)< ε检测非正常用户。
高斯分布
通常如果我们认为变量x符合高斯分布x~N(μ,σ^2)则其概率密度函数为:
其中μ=1/m(∑_(i=1)^m▒x^((i)) );σ^2=1/m ∑_(i=1)^m▒〖(x^((i) )-u)〗^2 ;
算法
异常检测算法:
对于给定的数据集 x(1),x(2),...,x(m),我们要针对每一个特征计算μ和的估计值。
一旦我们获得了平均值和方差的估计值,给定新的一个训练实例,根据模型计算p(x):
当时P(x)<ε,为异常。
我们选择一个,将p(x)=ε作为我们的判定边界,当p(x)>ε时预测数据为正常数据,否则为异常。
开发和评价一个异常检测系统
异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量y的值来告诉我们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。
当我们开发一个异常检测系统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试集。
例如:我们有10000台正常引擎的数据,有20台异常引擎的数据。我们这样分配数据:
6000台正常引擎的数据作为训练集
2000台正常引擎和10台异常引擎的数据作为交叉检验集
2000台正常引擎和10台异常引擎的数据作为测试集
具体的评价方法如下:
1.根据测试集数据,我们估计特征的平均值和方差并构建p(x)函数。
2.对交叉检验集,我们尝试使用不同的值作为阀值,并预测数据是否异常,根据 F1值或者查准率与查全率的比例来选择。
3. 选出后,针对测试集进行预测,计算异常检验系统的 F1 值, 或者查准率与查全率之比。
异常检测与监督学习的对比
之前我们构建的异常检测系统也使用了带标记的数据,与监督学习有些相似,下面的对比有助于选择采用监督学习还是异常检测。
异常检测 | 监督学习 |
非常少量的正向类(异常数据y=1),大量的负向类(y=0) | 同时有大量的正向类和负向类 |
许多不同种类的异常(非常难找出统一的模型)。少量的正向类数据来训练算法 | 有足够多的正向类实例,足够用于训练算法,未来遇到的正向类实例可能与训练集中的非常相似。 |
未来遇到的异常可能与已掌握的异常非常的不同。 |
|
例如: 1、 欺诈行为检测 2、 生产(如:飞机引擎) 3、 检测数据中心的计算机运行状况 | 例如: 1、 邮件过滤器 2、 天气预报 3、 肿瘤分类 |
选择特征
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:x=log(x+c),其中c为非负常数;或者,c为0-1之间的一个分数
一个常见的问题是一些异常的数据可能也会有较高的p(x)值,因而被算法认为是正常的。这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征后获得的新算法能够帮助我们更好地进行异常检测。
异常检测误差分析:
我们通常可以通过将一些相关的特征进行组合,来获得一些新的更好的特征(异常数据的该特征值异常地大或小)。
推荐系统(Recommender Systems)
问题形式化
在机器学习中有一种大思想,它针对一些问题,可能并不是所有的问题,而是一些问题,有算法可以为你自动学习一套好的特征。因此,不要试图手动设计,而手写代码这是目前为止我们常干的。有一些设置,你可以有一个算法,仅仅学习其使用的特征,推荐系统就是类型设置的一个例子。
我们从一个例子开始定义推荐系统的问题。
假使我们是一个电影供应商,我们有5部电影和4个用户,我们要求用户为电影打分。
我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据。
下面引入一些标记:
代表用户的数量
代表电影的数量
如果用户i给电影j评过分则
代表用户i给电影j的评分
代表用户j评过分的电影的总数
基于内容的推荐系统(Content Based Recommendation)
我们可以假设每部电影都有两个特征,如x1代表电影的浪漫程度, x2代表电影的动作程度。
假设我们采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如θ^((1))是第一个用户的模型的参数。于
是,我们有:
θ^((j))用户j的参数向量
x^((i))电影i的特征向量
对于用户j和电影i,我们预测评分为:(〖θ^((j)))〗^T x^((i))
代价函数
针对用户j,该线性回归模型的代价为预测误差的平方和,加上归一化项:
其中 i:r(i,j)表示我们只计算那些用户j评过分的电影。在一般的线性回归模型中,误差项和归一项应该都是乘以 1/2m,在这里我们将m去掉。并且我们不对方差项θ_0进行归一化处理。
上面的代价函数只是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:
用梯度下降算法更新代价函数的偏导数如下:
协同过滤
之前我们通过电影的特征向量和评分学得用户的参数theta,我们同样可以通过用户的参数和电影的评分学得电影的特征向量x。
优化的目标函数如下:
但是,如果既没有用户参数,也没有电影特征x,这两种方法就不再可行。协同过滤算法可以同时学习这两者。
我们的优化目标改为同时针对和x进行。
对代价函数求偏导数结果如下:
协同过滤算法的步骤:
1、 初始化x^((1) ),x^((2)),…,x^((i))…,x^((m) ),θ^((1) ),θ^((2) ),…,θ^((j) ),…,θ^((n) )为一些随机的较小的值。
2、 使用梯度下降算法求最小代价函数。
3、 在训练完算法后我们用解出的theat,x,计算〖(θ^((j)))〗^T x^((i)),为用户i对电影j的评分。
通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不是总能被人所理解,但是我们可以用这些数据作为给用户推荐电影的依据。
例如,如果一位用户正在观看电影x^((i)),我们可以寻找另一部电影x^((j)),依据两部电影的特征向量之间的距离||x^((i)) 〖-x〗^((j)) ||的大小。
协同过滤算法的向量化(低矩阵秩分解)
首先可先假设y矩阵如下:
Y矩阵还可以写成如下形式:
Y=X〖(θ〗^T)
均值归一化
主要是解决如何为那些没有对任何电影评过分的用户推荐新电影的问题。
对于Y矩阵,我们可以先分别用行中的每个元素减去每行元素的均值,如下:
然后再用新的Y去训练模型,当用新模型评分时再把均值u加上去,即预测值为(〖θ^((j) ))〗^T x^((i) )+u_i
大规模机器学习(large scale machine learning)
大型数据集的学习(learning with large datasets)
如果我们有一个低方差的模型,增加数据集的规模能提高算法的性能,那么我们怎么应对上百万记录的训练集呢?
左图是一个高方差、低偏差的算法,增加训练集能获得更好的模型。
右图是一个高偏差、低方差的算法,增加训练集没什么效果。
随机梯度下降法(stochastic gradient descent)
批量梯度下降算法,每次更新需要用到所有的训练集,theta更新的方向是代价函数减小最快的方向,但这样需要的内存和计算量都很大。
随机梯度下降算法,每次只用到一个训练样本,来计算梯度下降的方向。具体的代价函数和随机梯度下降算法计算步骤如下:
一般情况下,随机梯度下降算法(SGD)比批量梯度下降算法(BGD)收敛的更快,最外层循环一般为1-10次。这个算法虽然会逐步走向全局最小的位置,但可能最终仅在最小的那个点附近徘徊(震荡)。
小批量梯度下降(mini-batch gradient descent)
小批量梯度下降是每次选取b个训练样本计算梯度下降方向,用来更新theta。具体的实施步骤如下:
b的值通常再2-100之间。
随机梯度下降的收敛(stochastic gradient descent convergence)
在随机梯度下降中,我们在每一次更新theta之前都计算一次代价,然后每X次迭代后,求出这X次对训练实例计算代价的平均值,然后绘制这些平均值与X次迭代的次数之间的函数图表。
左上角的图表中的迭代次数X的值特别小。
我们介绍了一种方法,近似地监测出随机梯度下降算法在最优化代价函数中的表现,这种方法不需要定时地扫描整个训练集,来算出整个样本集的代价函数,而是只需要每次对最后1000个,或者多少个样本,求一下平均值。应用这种方法,你既可以保证随机梯度下降法正在正常运转和收敛,也可以用它来调整学习速率α的大小。
为了合理的调整α的值我们可以令学习率随迭代次数的增加而逐渐减小,例如:
在线学习算法(online learning)
在线学习的算法与随机梯度下降算法有些类似,我们对单一的实例进行学习,而非对一个提前定义的训练集进行循环。具体算法如下:
在线学习的一个优点是,如果有一个变化的用户群,又或者你在尝试预测的事情,在缓慢变化,这个在线学习算法可以慢慢更新用户变化的行为(习惯)。
映射化简和数据并行(map reduce and data parallelism)
如果任何学习算法能够表达为,对训练集的函数的求和,那么便能将这个任务分配给多个计算机,已达到加速的目的。
例如,我们有400个训练实例,我们可以将批量梯度下降的任务分配给四台计算机进行处理:
很多高级的线性代数函数库已经能够利用多核CPU的多个核心来并行地处理矩阵运算,这也是算法的向量化实现如此重要的缘故(比调用循环快)。
图片文字识别(OCR)
问题描述(problem description)
为了从图片中识别文字,需要采用以下步骤:
1、文字侦测(Text detection),将图片上的文字与其他环境对象分离开来。
2、字符切分(character segmentetion),将文字分割成一个个单一的字符
3、字符分类(character classification),确定每一个字符是什么。
滑动窗口(sliding windows)
滑动窗口是从图像中抽取对象的技术。假如我们要在图片中识别行人,首先我们用很多大小固定的图片训练出能够准确识别行人的模型,再按照固定的尺寸用滑动窗口将图像裁剪,最后将裁减的切片交给模型去识别。
滑动窗口技术也被用于文字识别,首先训练出能够识别字符和非字符的模型,再利用滑动窗口技术识别出字符区域,然后将该区域扩展,将重叠的区域合并。接着以宽高比作为过滤条件,过滤掉宽度比高度更小的区域(认为单词的长度通常比高度大)。
然后将文字区域分割成一个个字符。训练模型需要的训练集由单个字符图片和两个相连字符之间的图片构成。训练完成后使用滑动窗口来分割字符。
最后使用字符分类器来识别分割出来的字符。
获取大量数据和人工数据(getting lots of data and artificial data)
如果模型是高偏差、高方差的,可以通过增加训练集来改进模型。可以获取更多的原始数据,或者人工对已有的数据做旋转、扭曲、模糊等处理。
获取更多数据的几种方法:
人工数据合成
1、 手动收集、标记数据
2、 众包
上限分析
我们需要知道那部分对提高模型的效果重要,即那部分更值得我们花费更多的精力去优化。
通常,每一部分的输出作为下一部分的输入。上限分析中,我们选取一部分手工提供100%的正确率,观察模型的整体效果提升了多少。如果提升较多,说明这一部分值得我们投入更多的精力。