异常检测的应用
- 欺诈检测
- 工业质量监测
- 计算机集群监测
- 等等
定义
给定一些数据集 D = { x 1 , x 2 , … , x m } D=\{x_1,x_2,\dots,x_m\} D={x1,x2,…,xm},注意这些样本是unlabel的,构建一个模型 p ( x ) p(x) p(x),对于一个新的样本 x t e s t x_{test} xtest,判断该样本是否异常。当 p ( x t e s t ) ≤ ϵ p(x_{test})\le \epsilon p(xtest)≤ϵ时为异常, p ( x t e s t ) > ϵ p(x_{test})> \epsilon p(xtest)>ϵ为正常的。
高斯分布
高斯分布又称正态分布
如果一个实数服从高斯分布,表示为
X
∼
N
(
μ
,
σ
)
X \sim N(\mu,\sigma)
X∼N(μ,σ),
μ
\mu
μ是均值,控制函数的中心,
σ
\sigma
σ是方差,控制函数的宽度。
公式
N ( μ , σ ) = 1 2 π σ 2 e − ( x − μ ) 2 2 σ 2 N(\mu,\sigma)=\frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}} N(μ,σ)=2πσ21e−2σ2(x−μ)2
异常检测算法
-
数据集 X = { x 1 , x 2 , … , x m } , x ∈ R n X=\{x^1,x^2,\dots,x^m\},x\in \mathbb{R}^n X={x1,x2,…,xm},x∈Rn
-
计算每个特征 j j j的高斯分布参数 μ j , σ j \mu_j,\sigma_j μj,σj:
μ j = 1 m ∑ i = 1 m x j i \mu_j=\frac{1}{m}\sum_{i=1}^{m}x_j^i μj=m1i=1∑mxji
σ j 2 = 1 m ∑ i = 1 m ( x j i − μ j ) 2 \sigma_j^2=\frac{1}{m}\sum_{i=1}^{m}(x_j^i-\mu_j)^2 σj2=m1i=1∑m(xji−μj)2 -
对于每一个待测试样本,计算
p ( x ) = ∏ j = 1 n p ( x j ; μ j ; σ j 2 ) = ∏ j = 1 n 1 2 π σ j 2 e − ( x j − μ j ) 2 2 σ j 2 p(x)=\prod_{j=1}^{n}p(x_j;\mu_j;\sigma_j^2)=\prod_{j=1}^{n}\frac{1}{\sqrt{2\pi\sigma_j^2}} e^{-\frac{(x_j-\mu_j)^2}{2\sigma_j^2}} p(x)=j=1∏np(xj;μj;σj2)=j=1∏n2πσj21e−2σj2(xj−μj)2 -
将结果跟阈值 ϵ \epsilon ϵ比较, p ( x ) < ϵ p(x) < \epsilon p(x)<ϵ则为异常
建立一个异常检测系统的一般步骤
- 将带有label的数据集划分为训练集、验证集和测试集
注意将异常数据大致平均分配到每个集合中
通常情况下,验证集和测试集的数据都应该是互不相同的,即两个集合没有交集 - 使用训练集训练算法P(x)
为了避免正负样本分布不均,使用F1-score来评价算法性能 - 使用验证集来选择阈值 ϵ \epsilon ϵ
异常检测和监督学习的区别
异常检测
- 正例(异常样本)通常都非常少,通常是10这个数量级。
- 反例(正常样本)数量非常多。
- 异常的种类非常多,无法通过特征一一确定。未来的异常种类不能预见。
监督学习
- 正例和反例都非常多,并且分布差异不大
- 可以用特征来确定分类
数据预处理
当特征的样本分布为正态分布时,可以直接将样本fit到算法中
当数据为长尾分布时
使用
x
=
l
o
g
(
x
+
c
)
o
r
x
=
x
c
,
c
<
1
x=log(x+c) \\ or\\ x=x^c,\quad c<1
x=log(x+c)orx=xc,c<1
来将数据转换为正态分布