异常检测概览——孤立森林 效果是最好的

简介:

用机器学习检测异常点击流

本文内容是我学习ML时做的一个练手项目,描述应用机器学习的一般步骤。该项目的目标是从点击流数据中找出恶意用户的请求。点击流数据长下图这样子,包括请求时间、IP、平台等特征:

该项目从开始做到阶段性完成,大致可分为两个阶段:算法选择和工程优化。算法选择阶段挑选合适的ML模型,尝试了神经网络、高斯分布、Isolation Forest等三个模型。由于点击流数据本身的特性,导致神经网络和高斯分布并不适用于该场景,最终选择了Isolation Forest。工程优化阶段,最初使用单机训练模型和预测结果,但随着数据量的增加,最初的单机系统出现了性能瓶颈;然后开始优化性能,尝试了分布化训练,最终通过单机异步化达到了性能要求。

上文摘自:https://cloud.tencent.com/community/article/177890 只是为了说明Iforest的应用广度!

 

下文转自博客:

一、关于异常检测

异常检测(outlier detection)在以下场景:

  • 数据预处理
  • 病毒木马检测
  • 工业制造产品检测
  • 网络流量检测

等,有着重要的作用。由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM、逻辑回归等分类算法,都不适用,因为:

监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致。

以下是异常检测和监督学习相关算法的适用范围:

异常检测:信用卡诈骗、制造业产品异常检测、数据中心机器异常检测、入侵检测

监督学习:垃圾邮件识别、新闻分类

二、异常检测算法

1. 基于统计与数据分布

假设数据集应满足正态分布(Normal Distribution),即:

分布的平均值为μ和方差为σ² 。

当满足上图训练数据的正态分布,如果x的值大于4或者小于-4,都可以认为是异常值。

以下以“600680”股票成交量为例:

import tushare
from matplotlib import pyplot as plt df = tushare.get_hist_data("600680") v = df[-90: ].volume v.plot("kde") plt.show() 

 

近三个月,成交量大于200000就可以认为发生了异常(天量,嗯,要注意风险了……)

算法示例:

2. 箱线图分析

箱线图,不做过多说明了:

import tushare
from matplotlib import pyplot as plt df = tushare.get_hist_data("600680") v = df[-90: ].volume v.plot("kde") plt.show() 

图:

import tushare
from matplotlib import pyplot as plt
 
df = tushare.get_hist_data("600680")
v = df[-90: ].volume
v.plot("kde")
plt.show()

大体可以知道,该股票在成交量少于20000,或者成交量大于80000,就应该提高警惕啦!

3. 基于距离/密度

典型的算法是:“局部异常因子算法-Local Outlier Factor”,该算法通过引入“k-distance,第k距离”、“k-distance neighborhood,第k距离邻域”、“reach-distance,可达距离”、以及“local reachability density,局部可达密度 ”和“local outlier factor,局部离群因子”,来发现异常点,详情可参考:异常点/离群点检测算法--LOF - wangyibo0201的博客 - 博客频道 - CSDN.NET

4. 基于划分思想

典型的算法是 “孤立森林,Isolation Forest”,其思想是:

假设我们用一个随机超平面来切割(split)数据空间(data space), 切一次可以生成两个子空间(想象拿刀切蛋糕一分为二)。之后我们再继续用一个随机超平面来切割每个子空间,循环下去,直到每子空间里面只有一个数据点为止。直观上来讲,我们可以发现那些密度很高的簇是可以被切很多次才会停止切割,但是那些密度很低的点很容易很早的就停到一个子空间了。

这个的算法流程即是使用超平面分割子空间,然后建立类似的二叉树的过程:

详情见:

iForest (Isolation Forest)孤立森林 异常检测 入门篇IsolationForest example

示例代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

rng = np.random.RandomState(42)

# Generate train data
X = 0.3 * rng.randn(100, 2)
X_train = np.r_[X + 1, X - 3, X - 5, X + 6]
# Generate some regular novel observations
X = 0.3 * rng.randn(20, 2)
X_test = np.r_[X + 1, X - 3, X - 5, X + 6]
# Generate some abnormal novel observations
X_outliers = rng.uniform(low=-8, high=8, size=(20, 2))

# fit the model
clf = IsolationForest(max_samples=100*2, random_state=rng)
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)

# plot the line, the samples, and the nearest vectors to the plane
xx, yy = np.meshgrid(np.linspace(-8, 8, 50), np.linspace(-8, 8, 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.title("IsolationForest")
plt.contourf(xx, yy, Z, cmap=plt.cm.Blues_r)

b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white')
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='green')
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='red')
plt.axis('tight')
plt.xlim((-8, 8))
plt.ylim((-8, 8))
plt.legend([b1, b2, c],
           ["training observations",
            "new regular observations", "new abnormal observations"],
           loc="upper left")
plt.show()

结果如下,其中:红色即为异常点,白色是训练集,绿色是测试数据

注意:孤立森林不适用于特别高维的数据。由于每次切数据空间都是随机选取一个维度,建完树后仍然有大量的维度信息没有被使用,导致算法可靠性降低。高维空间还可能存在大量噪音维度或无关维度(irrelevant attributes),影响树的构建。孤立森林算法具有线性时间复杂度。因为是ensemble的方法,所以可以用在含有海量数据的数据集上面。通常树的数量越多,算法越稳定。由于每棵树都是互相独立生成的,因此可以部署在大规模分布式系统上来加速运算。

5. 其他算法

包括:One-class SVM 以及 Elliptic Envelope 等。

参考:2.7. Novelty and Outlier Detection

6. 值得一提

这些算法里面,孤立森林和局部异常因子算法相比之下,效果是最好的。

文章参考资料:

Isolation ForestLOF – Identifying Density-Based Local Outlierskamidox.com异常检测(anomaly detection)如何在Python中实现这五类强大的概率分布 - Python - 伯乐在线博客频道 - CSDN.NET2.7. Novelty and Outlier DetectioniForest (Isolation Forest)孤立森林 异常检测 入门篇异常点检测算法(一)
异常值检测算法(二)
异常点检测算法(三)
异常点检测算法综述















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/7776711.html,如需转载请自行联系原作者



相关文章
|
3月前
|
机器学习/深度学习 数据可视化 算法
图特征工程实践指南:从节点中心性到全局拓扑的多尺度特征提取
本文详细介绍了如何利用NetworkX库从图结构中提取重要特征。首先,通过定义辅助函数设置了图的可视化选项,并以Zachary网络数据集为例进行了可视化展示。接着,文章深入探讨了三类图特征:基于节点的特征(如节点度、中心性等)、基于边的特征(如最短路径、邻域重叠等)以及基于图的特征(如Graphlets、Weisfeiler-Leman特征等)。通过这些特征的提取与分析,可以全面理解网络结构,识别关键节点,分析信息流动模式,并发现潜在的隐藏模式。本文不仅展示了如何应用这些特征来揭示社交网络中的角色和联系,还强调了其在交通网络分析和生物系统研究等领域的广泛应用潜力。
90 12
图特征工程实践指南:从节点中心性到全局拓扑的多尺度特征提取
|
5月前
|
机器学习/深度学习 Python
贝叶斯分析与决策理论:用于确定分类问题决策点的应用
在分类问题中,一个常见的难题是决定输出为数字时各类别之间的切分点
63 9
贝叶斯分析与决策理论:用于确定分类问题决策点的应用
|
4月前
|
机器学习/深度学习 算法
【机器学习】不同决策树的节点分裂准则(属性划分标准)
决策树的不同节点分裂准则,包括原始决策树的节点分裂准则、ID3算法的信息增益、C4.5算法的信息增益比以及CART算法的平方根误差最小化和基尼指数。
56 1
|
7月前
|
机器学习/深度学习 数据采集 数据可视化
R语言SVM、决策树与因子分析对城市空气质量分类与影响因素可视化研究
R语言SVM、决策树与因子分析对城市空气质量分类与影响因素可视化研究
|
7月前
|
机器学习/深度学习 数据采集 算法
R语言、WEKA关联规则、决策树、聚类、回归分析工业企业创新情况影响因素数据
R语言、WEKA关联规则、决策树、聚类、回归分析工业企业创新情况影响因素数据
|
7月前
|
算法 数据挖掘 数据库
R语言主成分PCA、决策树、boost预警模型在跨区域犯罪研究数据挖掘分析|数据分享
R语言主成分PCA、决策树、boost预警模型在跨区域犯罪研究数据挖掘分析|数据分享
|
7月前
|
数据采集 自然语言处理 算法
疾病关联网络构建及并发症预测模型
疾病关联网络构建及并发症预测模型
|
7月前
|
数据可视化 数据挖掘
R语言复杂网络分析:聚类(社区检测)和可视化
R语言复杂网络分析:聚类(社区检测)和可视化
|
7月前
R语言对混合分布中的不可观测与可观测异质性因子分析
R语言对混合分布中的不可观测与可观测异质性因子分析
|
数据采集 算法 关系型数据库
数据分类分级实践难点
数据分类分级是开展数据全生命周期管理的基础,企业做好数据分类分级才能更好地去落实合规义务以及进行数据安全管控。今天,我们从数据分类分级落地实践的角度,来阐述企业在开展数据分类分级过程中的难点以及如何“破局”。
460 1