基于统计学的方法一般是假定正常的数据对象由一个统计模型产生,而不遵守该模型的数据是异常点。
统计学方法的有效性高度依赖于对给定数据所做的统计模型假定是否成立。
根据如何指定和学习模型,异常检测的统计学方法可以划分为两个主要类型:参数方法和非参数方法
- 参数方法假定正常的数据对象是由某些参数的参数分布产生,该参数分布会给出对于每个点的产生的概率。概率越小,则该点越可能是异常点
- 非参数方法并不假定先验统计模型,而是试图从输入数据确定模型。
1.参数方法
基于正态分布的一元异常点检测
仅涉及一个属性或变量的数据称为一元数据。我们假定数据由正态分布产生,然后可以由输入数据学习
正态分布的参数,并把低概率的点识别为异常点
阈值是个经验值,可以选择在验证集上使得评估指标值最大(也就是效果最好)的阈值取值作为最终阈值。
多元异常点检测
涉及两个或多个属性或变量的数据称为多元数据。许多一元异常点检测方法都可以扩充,用来处理多元数据。其核心思想是把多元异常点检测任务转换成一元异常点检测问题。
在各个维度的特征之间相互独立的情况下,可以如下计算:
但是如果特征之间有相关性,就需要要用到多元高斯分布。
2.非参数方法
在异常检测的非参数方法中,“正常数据”的模型从输入数据学习,而不是假定一个先验。通常,非参数方法对数据做较少假定,因而在更多情况下都可以使用。
以HBOS为例
HBOS:Histogram-based Outlier Score。其基本假设是数据集的每个维度相互独立。然后对每个维度进行区间(bin)划分,区间的密度越高,异常评分越低。
在全局异常检测问题上表现良好,但不能检测局部异常值。但是HBOS比标准算法快得多,尤其是在大数据集上。
Step1:
- 1.对于categroy 值,统计每个值出现的次数,并计算相对频率;
- 2.对于数值特征,可以用两种方法
静态跨度的柱状图
,也即我们画频率分布直方图经常用的那种
将值域分成K个等宽的桶,落入每个桶的值的频数作为密度的估计(桶的高度)
动态宽度柱状图
,
先将所有值排序,然后将连续的N/k个值装进一个桶里,其中N是所有的样例数,k是桶的个数,是一个超参数;柱状图的面积对应桶中的样例数。因为桶的宽度是有桶中第一个值和最后一个值决定的,所有桶的面积都一样,所以,每一个桶的高度可以被计算出来。这意味着跨度大的桶的高度低,即密度小,只有一种情况例外,超过k个数相等,此时一个桶里允许超过N/k个值
HBOS提供上述两种方法是因为真实的数据分布种类繁多,尤其是值域跨度大的时候,更倾向于使用动态宽度柱状图,尤其是值得分布位置或者长尾的情形。
Step2:
按照上面的方法,每一个维度的数据都画出一个柱状图,每个桶的高度代表数据的密度,使用归一化操作保证桶最高的高度是1.这样可以保证每个特征的权重相同。最终每一个样本的HBOS值按照下面的公示计算:
练习
使用PyOD库生成toy example并调用HBOS
1.生成数据,异常率10%
2.训练HBOS模型(无监督)
对于HBOS模型,n_bins默认是10,alpha默认是0.1,
n_bins : int, optional (default=10)The number of bins.
alpha : float in (0, 1), optional (default=0.1)The regularizer for preventing overflow.tol : float in (0, 1), optional (default=0.5)The parameter to decide the flexibility while dealingthe samples falling outside the bins.contamination : float in (0., 0.5), optional (default=0.1)The amount of contamination of the data set,i.e. the proportion of outliers in the data set. Used when fitting todefine the threshold on the decision function.
HBOS源码
3.评价HBOS效果
4.可视化HBOS效果