简介
信用卡公司如何检测欺诈和滥用?网络管理员如何发现入侵?科学家如何了解他们的实验是否正常运行?
为了实现上述目标,他们会对数据集进行分析,寻找异常的数据点。例如,信用卡公司寻找某些交易中非正常的高收费或奇怪的购买行为。上述情形可能表明信用卡被盗。网络管理员搜索日志文件,监督网络上的不规则活动,如某些地址的非正常加载或来自外地 IP 地址的网络访问,这些是存在网络入侵风险的最好证明。同样地,科学家查看数据是否反常,是否超出预期的范围,并以此作为衡量实验非正常运行的指标。
这些反常或不规则的活动被称为孤立点,也被称为异常现象 (anomalies)。本文描述了在数据中检测孤立点 1的各种方法,以及英特尔® 数据分析加速库(英特尔® DAAL)2如何帮助优化孤立点检测,前提需要在配备了英特尔® 至强® 处理器的系统上运行英特尔® DAAL。
什么是孤立点?
孤立点是一个数据点,与其他数据存在显著差异(异常或不规则),或偏离其他数据(见图 1)。
图 1:孤立点案例 #1.
每个紫点代表了数据集中的一个数据点。由于图中有两个数据点与其它数据点的距离非常远,可以判定这两个数据点为孤立点。
图 2:孤立点案例 #2.
图 2 显示了另一种孤立点案例。在本案例中,数据集分为三组(集群)。不在三组范围内的任何数据点均被视为孤立点。
图 3:孤立点案例 #3.
图 3 显示了第三类孤立点案例,尽管图 3 中的数据集也被分为不同的组,但是图 3 和图 2 的案例不同,这是因为数据点的密度不同。在图 2 中,各组间的数据点几乎均匀分布,但是在图 3 中,各组间的数据点密度不同。
孤立点是如何产生的?
孤立点有利也有弊。通过检测网络中的不规则活动(孤立点),网络管理员能够提前发现并阻止数据入侵。另一方面,检测并清除孤立点有助于消除或最大限度降低对计算结果的影响。孤立点能够扭曲或误导机器学习 3的训练过程,造成训练时间变长、模型准确性下降。例如,在 K-means 集群算法的示例中,数据集中的孤立点将导致集群的中心偏离预定位置。
孤立点产生的常见原因包括:
- 数据采集错误:数据采集设备可能受噪音的影响收集异常数据。
- 数据输入错误:输入了错误数据。例如,错误地输入某所房屋的售价可能导致房屋价格超出房屋所在社区的平均价格范围。
- 选择类型错误:如高中生的身高,在某些高中,打篮球的学生的身高明显高于他们的同学,这些学生的身高就是孤立点。为了确保结果正确,测量整个学生群体的身高时,应该单独测量篮球队队员的身高。
- 转换错误:从多个来源中提取数据时,有可能产生操作或提取错误,最终引起孤立点。
检测孤立点的方法
计划数据集,然后查看图表(相似于图 1 到图 3 所示的内容)是检测孤立点的常见方法。
在第二版《孤立点分析》4一书中,Charu C. Aggarwal 提供了检测孤立点的以下方法:
- 概率模型
- 线性模型
- 近距离模型
- 高维度孤立点检测
检测孤立点的应用
由于借助孤立点检测方法能够检测出奇怪或异常的数据,这些方法被用于:
- 在分析网络安全时,检测不规则的活动和奇怪的地址
- 通过观察反常的购物模式或收费过高的交易,确定信用卡欺诈
- 通过发现反常的症状或测试结果,诊断患者存在的潜在健康问题
- 通过分析异常数据(与其他球员的数据相比),发掘优秀球员
本文只列举了孤立点检测方法的几个应用,还有很多没有提到。
英特尔® 数据分析加速库
英特尔 DAAL 是一个包含众多基本构建模块的库,面向数据分析和机器学习而优化。这些基本构建模块经过高度优化,能适应最新版英特尔® 处理器的全新特性。本文中,我们利用英特尔 DAAL 的 Python* API 来展示如何调用孤立点检测函数。遵循英特尔 DAAL 文档 5中的说明安装 Python* API。
利用英特尔数据分析加速库中的孤立点检测方法
《英特尔® DAAL 手册》介绍了什么是单变量孤立点并提供了定义孤立点区域的公式,原文如下所示:
“规定集合 X 代表 p 个维数中的 n 个特征向量 x 1= (x 11,…,x 1p ), ..., x n = (x n1,…,x np ),问题是需要确认不属于底层分配的向量。单变量孤立点检测算法单独考虑每个特性。单变量孤立点检测方法可能包含参数,假设一个数据集的已知基本分配,并定义孤立点区域,属于这个区域的观察被标记为孤立点。孤立点区域的定义与假设的基本数据分配相连。以下是面向单变量孤立点检测的孤立点区域示例:
m n和 σ n是指定数据集的平均值(稳健)估计和标准偏差,α n是置信系数,g (n, α n ) 定义了区域的限制,应该调整为观察数量。”
本章节展示了如何利用英特尔 DAAL 在 Python 6中调用孤立点方法。
从英特尔 DAAL 中调用单变量孤立点检测算法的步骤如下所示:
- 输入 from 命令以导入必要的程序包,并导入
- 执行如下命令,导入英特尔 DAAL 数值表:
from daal.data_management import FileDataSource, writeOnly, DataSourceIface, BlockDescriptor_Float64
- 利用以下命令导入单变量孤立点检测算法:
from daal.algorithms.univariate_outlier_detection import InitIface, Batch_Float64DefaultDense, data, weights
- 执行如下命令,导入英特尔 DAAL 数值表:
- 如果数据输入来源于 .csv 文件,初始化文件数据来源:
DataSet = FileDataSource( trainDatasetFileName, DataSourceIface.doAllocateNumericTable, DataSourceIface.doDictionaryFromContext )
- 加载输入数据:
DataSet.loadDataBlock() nFeatures = DataSet.getNumberOfColumns()
- 创建一个函数算法:
- 首先创建一个算法对象
algorithm = Batch_Float64DefaultDense()
- 将数据集输入算法
algorithm.input.set(data, DataSet.getNumericTable())
- 首先创建一个算法对象
- 计算孤立点并得出结论:
results = algorithm.compute()
- 利用以下命令打印结果:
printNumericTable(results.get(weights), “outlier results“)
注:UCI 机器学习存储库提供一些常用的数据集。7
结论
孤立点检测在欺诈检测、网络安全等领域中发挥重要的作用。英特尔 DAAL 利用未来英特尔至强处理器的全新特性优化了孤立点检测方法,只需在配备上述处理器的计算机系统上运行这些方法,便可实现优化。
参考资料
1.一般孤立点检测
4.孤立点检测
5.如何在 Linux* 中安装英特尔 DAAL 的 Python 版本
7.常用数据集