异常检测,也称为离群值检测,是指识别那些与大多数正常数据对象不同的数据点。在数据科学领域,异常是指那些显著偏离预期模式的数据点。异常检测不仅是技术挑战,也是揭开神秘面纱的过程,例如发现欺诈行为、识别异常活动等。本文作为数据科学博客大赛的一部分发布,旨在解释异常检测的基本概念、类型、原因以及其在现实世界中的应用方法。
异常可以分为以下几种:
点异常:如果单个数据实例与其余数据过于疏远,则被认为是异常。例如,基于消费金额检测万事达卡欺诈。
上下文异常:在特定上下文中,异常由特定标准定义。例如,在时间序列数据分析中,日常工作日的汽油消费金额被认为是正常行为,但如果在假期期间出现类似的支出模式,则会被标记为不寻常。处理此类异常时,通常会使用机器学习技术,尤其是孤立森林算法。孤立森林算法在识别数据集中预期模式的偏差中起着至关重要的作用。
集体异常:一组数据实例放在一起有助于检测异常。例如,有人试图将数据从一个远程机器意外地复制到本地主机,这样的异常会被标记为可能的网络攻击。
异常产生的原因可能包括:
1. 不同类别的数据:一个对象之所以不同,可能是因为它属于不同的类别。例如信用卡盗窃、入侵检测、疾病结果、异常测试结果等,都是使用类别标签识别异常的例子。
2. 自然变异:在正态或高斯分布中,数据对象的概率迅速降低。这些对象被认为是异常值,也称为离群值。
3. 数据测量和收集错误:当收集错误的数据或者在测量数据时出现偏差时,就会发生这种错误。
异常检测被广泛应用于以下领域:
- 数据泄露
- 身份盗窃
- 制造业
- 网络
- 医学
- 视频监控
异常检测能够帮助发现指标的不寻常值,以便发现未检测到的问题;发现重要指标或过程的变化,以便人类可以进行调查;减少诊断已检测到问题时的表面积或搜索空间;减少校准或重新校准阈值的需要;增强人类的直觉和判断力。
尽管异常检测有许多优点,但它也有一些局限性:
- 无法提供根本原因分析,尽管它可以在这方面提供帮助。
- 如果存在异常,它无法提供是或否的答案。
- 它不能证明系统中存在异常,只是说被观察的指标有些不寻常。
- 无法检测到实际的系统故障或失败,因为故障与异常不同。
- 它不能替代人类的判断和经验。
- 无法理解指标的含义。
异常检测方法可以分为以下几种:
基于模型的方法:在这种方法中,构建数据的模型。那些不太适合的物体被认为是异常。例如,如果构建了一个以聚类形式存在的数据模型,那么异常就是那些不强烈属于构建的聚类的数据对象。在回归模型中,异常是远离预测值的数据。然而,这种方法的问题在于,如果没有训练数据来构建模型,或者没有数据的统计分布,就需要不需要构建数据模型的技术。
基于距离的方法:这种方法基于接近性。考虑一个2D或3D散点图,所有的数据对象都在一个接近性中。但是异常对象远离它们。
基于密度的方法:对象的密度很容易计算,特别是如果对象之间有接近性度量。低密度对象是那些相对远离邻居的对象。称这些对象为异常。
1. 监督异常检测:在这种监督学习中,必须有一个训练集,包括数据对象和预期的异常对象。必须观察到,可以有多个异常类别。
2. 无监督异常检测:对于没有类别标签的情况。可以为每个对象给出一个分数,显示实例异常的程度。还可以观察到,如果有很多异常彼此相似,那么可以把它们作为正常组或异常分数低的组。因此,可以说,要使无监督异常检测成功,异常必须是不同的。
3. 半监督异常检测:有时,当有带有标签的正常对象和给定分数的训练数据,但没有异常对象时,可以实施半监督异常检测来发现异常。使用正常对象来发现异常。但是,有时找到一组代表性的正常对象并不容易,用它来发现异常。
基于模型的方法(也称为统计方法):趋势和季节性是时间序列指标的两个特征,它们破坏了许多模型。事实上,它们是静态阈值破裂的两个主要原因之一。趋势是指标值的持续增加或减少。而季节性反映了系统中出现的周期性模式,通常高于基线然后再次下降。常见的季节性周期是小时、日和周,但系统可能有一个更长的季节性周期,甚至是不同周期的组合。
基于距离的方法:基于距离的方法将数据点分类为异常(离群值),如果其局部区域更稀疏。它是从它到所有点的距离、到最近邻居的距离、到k最近邻居的平均距离或到k最近邻居的中值距离来计算的。
基于密度的方法:基于密度的方法确定区域的密度。基于密度的聚类使用点的局部密度来决定聚类,而不是仅使用点之间的距离。
DBSCAN(基于密度的空间聚类应用带噪声)是广泛使用的基于密度的聚类算法之一,用于异常检测应用。DBSCAN算法的基本思想是,一个聚类必须包含在指定半径内的最小点数。DBSCAN算法使用两个参数,最小点数("minpts")和epsilon("eps")来执行聚类。
首先,使用Z分数。Z分数的公式是(观测值 - 平均值)/ 标准差。
dataset = [11,10,12,14,12,15,14,13,15,102,12,14,17,19,107, 10,13,12,14,12,108,12,11,14,13,15,10,15,12,10,14,13,15,10]
outliers = []
def detect_outliers(data):
threshold = 3
mean = np.mean(data)
std = np.std(data)
for i in data:
z_score = (i - mean) / std
if np.abs(z_score) > threshold:
outliers.append(i)
return outliers
outlier_pt = detect_outliers(dataset)
outlier_pt
现在使用四分位数范围,即75% - 25%的值在给定数据集中。
sorted(dataset)
quartile1, quartile3 = np.percentile(dataset, [25, 75])
print(quartile1, quartile3)
iqr_value = quartile3 - quartile1
print(iqr_value)
lower_bound_val = quartile1 - (1.5 * iqr)
upper_bound_val = quartile3 + (1.5 * iqr)
print(lower_bound_val, upper_bound_val)
异常检测就像在人群中发现奇怪事物的敏锐眼光。以下是它的工作原理:
收集数据:从不同的来源收集信息,如传感器或记录。
清洗数据:整理数据,确保一切都是好的,没有错误。
挑选重要内容:从数据中选择最重要的细节,这些细节可以帮助判断某事是否奇怪。
训练模型:教计算机程序根据收集的数据识别什么是正常,使用扩展的孤立森林算法等技术。
如果有例子:使用正常和奇怪事物的例子来教程序。这就像向它展示猫和狗的图片以学习差异。
如果没有例子:让程序自己弄清楚什么是正常,可能通过将数据拟合到正态分布。这就像让它探索一个新地方并学习那里的通常情况。
检查性能:通过将其与已经知道的奇怪或不奇怪的东西进行比较,看看程序能多好地发现奇怪的东西。
设定规则:决定什么是奇怪的,什么是不奇怪的规则。这就像说,“在这个房间里,任何超过7英尺高的东西都是不寻常的。”