写点什么

机器学习 - 异常检测

  • 2022 年 7 月 09 日
  • 本文字数:1657 字

    阅读完需:约 5 分钟

机器学习-异常检测

异常检测,又称为离群点检测(Outlier Detection)。离群点为数据样本中有别于其他样本的少量样本,这些样本的特征与其他样本存在显著的差异,是被不同的机制产生的。


异常检测的经常应用在信用卡欺诈,网络攻击检测,数据预处理等领域。


经典算法主要包括


  • 基于统计的方法

  • 基于密度的方法

  • 基于划分的方法


1. 数据说明

为了说明算法,采用随机产生的数据集合为实验数据。

import numpy as npimport pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
np.random.seed(42)
# Generate train data
X = 0.3 * np.random.randn(100, 2)
# Generate some abnormal novel observations
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))
X = np.r_[X + 2, X - 2, X_outliers]
data = pd.DataFrame(X,columns=["X","Y"])
plt.scatter(data["X"], data["Y"], color='black')
复制代码


2.基于统计的方法

  • 3 倍标准差


假设数据服从正态分布,在正态分布中σ代表标准差,μ代表均值。 从概率密度函数看,99.73%的值都落在(μ-3σ,μ+3σ)区间内,超出这个范围的数据可以是异常值,俗称 3 倍标准差。当然这个 3 可以根据不同数据分布来确定异常值,值越大异常越显著。



mean=np.mean(data["X"])
std=np.std(data["X"])
data["xn"]=abs((data["X"]-mean)/std)
def flag(x):if x > 1.5:
return 1;
else:
return 2;
c=data["xn"].apply(flag)
plt.scatter(data["X"], data["Y"], c=c)
复制代码



可以看出如果数据集存在多个特征,3 倍方差的效果并不理想。

如果是特征单一的,效果好一点。




3.基于密度的方法

  • 局部异常因子算法-Local Outlier Factor(LOF)

  • (1) 是一个基于密度的异常检测算法,通过计算样本点的 K 邻居可达密度,可达密度越小,说明 K 邻居越稀疏,可能为异常点。

  • (2)通过点计算样本的邻域点的局部可达密度与该样本的局部可达密度之比的平均数为局部离群因子来判断是否异常。




  • (3)关键参数:

  • n_neighbors:邻居个个数

  • contamination: 判定异常的标准,(0,0.5), 明显异常的值接近 0,明显正常的值接近 1。默认值 0.1

from sklearn.neighbors import LocalOutlierFactor
clf = LocalOutlierFactor(n_neighbors=20,contamination=0.08)
y_pred = clf.fit_predict(data)
y_pred
plt.scatter(data["X"], data["Y"], c=y_pred)
复制代码



LOF 的思想和 DBCSAN 聚类的思路是相似的,DBSCAN 也是可以用来进行异常值检测。


4.基于划分的方法

  •  孤立森林 IsolationForest

    (1)假设现在有一组一维数据,我们要对这组数据进行随机切分,希望可以把点 A 和点 B 单独切分出来。具体的,我们先在最大值和最小值之间随机选择一个值 x,然后按照 <x 和 >=x 可以把数据分成左右两组。然后,在这两组数据中分别重复这个步骤,直到数据不可再分。

    (2)如果点 B 跟其他数据比较疏离,可能用很少的次数就可以把它切分出来;点 A 跟其他数据点聚在一起,可能需要更多的次数才能把它切分出来。

    (3)构建一棵 iTree 时,先从全量数据中抽取一批样本,然后随机选择一个特征作为起始节点,并在该特征的最大值和最小值之间随机选择一个值,将样本中小于该取值的数据划到左分支,大于等于该取值的划到右分支。然后,在左右两个分支数据中,重复上述步骤,直到叶子节点都是相同数据或者二叉树达到限定的最大深度。通过查找样本点树的深度以及叶子节点的样本数的综合分数来判定是否是异常点。

    (4)关键参数

    n_estimators :树个数目,默认是 100

    max_samples: 树构建基准树的最大样本数据(随机抽取一定的样本作为构建树)

    contamination: 判定异常的标准,(0,0.5), 明显异常的值接近 0,明显正常的值接近 1。默认值 0.1


from sklearn.ensemble import IsolationForest
clf = IsolationForest(max_samples=140, random_state=42, contamination=0.08)
clf.fit(data)
y_pred = clf.predict(data)
plt.scatter(data["X"], data["Y"], c=y_pred)
复制代码


5 结语

本文介绍了三种异常检测的方法,其中工业界普遍认为孤立森林的效果是最好的。当然还有其他很多领域的离群点检测算法,可以看一些离群点检测算法综述。





发布于: 刚刚阅读数: 3
用户头像

公众号:人工智能微客(weker) 2019.11.21 加入

人工智能微客(weker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
机器学习-异常检测_机器学习_AIWeker-人工智能微客_InfoQ写作社区