使用 Intel® 数据分析加速库增强异常检测
本文介绍了检测数据中异常值(outliers)的不同方法,以及 Intel® 数据分析加速库(Intel® DAAL)如何在配备 Intel® Xeon® 处理器的系统上运行,以优化异常值检测。
引言
信用卡公司如何检测欺诈或滥用?网络管理员如何发现入侵?科学家如何知道他们的实验是否运行正确?
为了做到这些,他们会分析数据集并寻找偏离常规的数据点。例如,信用卡公司会寻找某些交易中异常的高额消费或奇怪的消费行为。这些行为可能表明信用卡已被盗。网络管理员会在日志文件中搜索网络上的异常活动,例如来自某些位置的异常流量负载或来自外国 IP 地址的网络访问,这些都可能是潜在网络入侵的迹象。同样,科学家会查看数据是否偏离正常或预期范围,以指示实验是否运行不正常。
这些类型的不寻常或不规则活动被称为异常值(outliers)或异常(anomalies)。本文介绍了检测数据中异常值1的不同方法,以及 Intel® 数据分析加速库(Intel® DAAL)2如何在配备 Intel® Xeon® 处理器的系统上运行,以优化异常值检测。
什么是异常值?
异常值是指与其余数据显著不同(异常或不规则)或偏离其余数据的任何数据点(见图 1)。
每个紫色圆点代表数据集中的一个数据点。从图中可以看出,这两个数据点被视为异常值,因为它们远离其余的数据点。
图 2 显示了另一种异常值情况。在本例中,数据集被分为三个组(簇)。位于组外的任何数据点都被视为异常值。
图 3 显示了另一种异常值情况。尽管数据集被分为不同的组,但这种情况与图 2 不同,因为数据点的密度不同。在图 2 中,数据点几乎均匀地分布在各个组中,而图 3 中的数据点密度不同。
异常值的原因是什么?
异常值有好有坏。通过检测网络中的异常活动(异常值),网络管理员可以发现并阻止数据入侵。另一方面,检测并消除异常值有助于消除或最小化计算结果中的影响。异常值可能会扭曲和误导机器学习3算法的训练过程,导致训练时间更长,模型准确性更低。例如,在 K-means 聚类算法的情况下,数据集中的异常值会将簇的质心拉离其预期位置。
常见的异常值原因包括以下几点:
- 数据采集错误:数据采集设备可能因噪声而采集到异常数据。
- 数据录入错误:输入了错误的数据。例如,在特定社区中输入了错误的房屋销售价格,可能会导致该房屋的价格超出该社区房屋价格的平均范围。
- 选择类型错误:例如,考虑高中生的身高。一些高中篮球队员与他们的同龄人相比非常高。这些学生的身高就是异常值。为了准确起见,应该将篮球队员的身高与整体学生人群分开测量。
- 转换错误:从多个来源提取数据时的操作或提取错误可能导致异常值。
异常值检测方法
检测异常值的常用方法是绘制数据集,然后查看图表,类似于图 1-3 中所示。
在《异常值分析》一书的第二版中4,Charu C. Aggarwal 提供了以下异常值检测方法:
- 概率模型
- 线性模型
- 基于邻近的模型
- 高维异常值检测
异常值检测的应用
由于异常值检测方法可以检测到奇怪或异常的数据,因此它们可以用于:
- 分析网络安全时,检测不规则活动和可疑地址。
- 通过观察异常的购物模式或超高额交易来识别信用卡欺诈。
- 通过发现患者的异常症状或测试结果来诊断潜在的健康问题。
- 分析运动员的数据,当数据与同伴相比异常时,识别优秀运动员。
这些只是异常值检测方法的一些应用;还有更多。
Intel® 数据分析加速库
Intel DAAL 是一个由许多基础构建块组成的库,这些构建块针对数据分析和机器学习进行了优化。这些基础构建块针对最新的 Intel® 处理器的最新功能进行了高度优化。在本文中,我们使用 Intel DAAL 的 Python* API 来演示如何调用异常值检测函数。要进行安装,请按照 Intel DAAL 文档中的说明进行操作。5
使用 Intel 数据分析加速库中的异常值检测方法
根据 Intel® DAAL 手册,以下段落描述了单变量异常值(univariate outlier)是什么以及定义异常值区域的公式:
“给定一个包含 n 个维度为 p 的特征向量的集合 X,x 1= (x 11,…,x 1p ), ..., x n = (x n1,…,x np ),问题在于识别不属于底层分布的向量。单变量异常值检测算法独立考虑每个特征。单变量异常值检测方法可以是参数化的,它假设数据集具有已知的底层分布,并定义一个异常值区域,如果一个观测值属于该区域,则将其标记为异常值。异常值区域的定义与假设的底层数据分布相关。以下是单变量异常值检测的异常值区域示例:
其中 m n 和 σ n 是为给定数据集计算的均值和标准差的(稳健)估计值,α n 是置信系数,g (n, α n ) 定义了区域的边界,应根据观测值的数量进行调整。”
本节将展示如何使用 Intel DAAL 在 Python6 中调用异常值方法。
以下步骤用于从 Intel DAAL 调用单变量异常值检测算法:
- 使用 from 和 import 命令导入必要的包。
- 通过发出以下命令导入 Intel DAAL 数值表:
from daal.data_management import FileDataSource, writeOnly, DataSourceIface, BlockDescriptor_Float64
- 使用以下命令导入单变量异常值检测算法:
from daal.algorithms.univariate_outlier_detection import InitIface, Batch_Float64DefaultDense, data, weights
- 通过发出以下命令导入 Intel 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中找到一些常见数据集。
结论
异常值检测在欺诈检测、网络安全等方面发挥着重要作用。Intel DAAL 在运行这些方法时,利用了未来几代 Intel Xeon 处理器的新功能,从而优化了异常值检测方法,当在配备这些处理器的计算机系统上运行时。