原创内容
No.770
数分人必知必会 | 异常值检测
敲黑板,这个真的非常非常重要!
图片由夸克AI绘制
异常值检测是数据分析中至关重要的一步,它可以帮助识别数据中的错误、特殊事件或潜在问题。当我们接触一个全新的数据分析项目时,第一件事往往是检查一下数据中是否存在异常值。
然而异常检测是一个非常特殊的数据处理技术,没有一种“放之四海而皆准”的方法,选择哪种技术取决于数据的分布、维度、问题的背景以及计算资源,对于异常本身的判定标准也取决于不同的分析场景,在一些场景下我们可以对异常数据进行剔除或其他处理,但是在另一些分析场景下我们要对异常值进行保留处理。
纯数据角度的离群值是错误吗?是罕见但真实的极端事件吗?是数据固有分布的一部分吗?我们常说数据分析师要懂业务,其实相关领域知识至关重要!很多时候是领域知识在辅助我们进行这样的判断。
在开始讨论具体的技术之前,我们先罗列一下通常需要处理异常值的场景,换言之这些场景之外的场景异常值是不是真的需要处理就得根据实际情况来讨论了。
1.目标在于描述“典型”或“中心”趋势时:
在计算平均值、标准差等描述性统计量的时候,因为平均值对异常值非常敏感,一个极端的异常值会显著拉高或拉低平均值,使其无法代表大多数数据的中心位置。标准差也会被异常值夸大,导致对数据离散度的误判。对于这类场景,我们通常 使用中位数、四分位距等稳健统计量;或识别并处理异常值后再计算平均值/标准差。
2.使用对异常值敏感的模型/算法时:
对异常值敏感的算法模型很多,比如:线性回归、逻辑回归、基于距离的算法(如K-Means聚类、KNN分类)、主成分分析、支持向量机(取决于核函数)、神经网络(尤其是使用MSE等损失函数时)。
这些模型/算法假设误差服从正态分布或对输入特征的尺度敏感。异常值会严重扭曲回归线/决策边界(如线性回归),使基于距离的算法将异常值误判为独立簇或强行扭曲其他簇的中心(如K-Means);主导PCA的主成分方向;导致模型过度关注拟合异常点而牺牲整体性能(过拟合或欠拟合)等。
对于这种问题,我们通常需要在建模前识别并处理异常值(删除、转换、用稳健值替换等),或者使用对异常值更稳健的模型(如基于树的模型、使用Huber损失的回归),使用正则化技术等。
3.进行参数假设检验时:
比如鼎鼎有名的T检验、ANOVA等。 这些检验通常假设数据服从正态分布或方差齐性。异常值会破坏这些假设,导致检验效能降低(难以检测到真实差异)或增加第一类错误(错误拒绝原假设)的风险。对于这种情况,我们一般需要检查并处理异常值以满足假设,或者改成使用非参数检验(如Mann-Whitney U检验、Kruskal-Wallis检验),因为它们对异常值相对不敏感。
4.异常值明显是错误数据时:
这个是最好理解的场景。比如数据录入错误(如身高录入为2.8米)、传感器故障(如温度传感器突然飙到1000度)、系统处理错误(如负值出现在不可能为负的指标中)。因为这些点不代表真实世界现象,保留它们会引入噪音,误导分析结果。在确认错误后,直接删除或用合理值替换(如前后观测值的插值、基于业务规则的修正)。
5.数据标准化/归一化时:
比如在使用Min-Max缩放或Z-Score标准化的时候,需要对异常值进行处理。因为异常值会使Min-Max缩放的极值范围过大,导致其他绝大多数数据被压缩在一个很小的区间内(如[0.01, 0.02])。Z-Score标准化会被异常值拉高均值和标准差,导致标准化后大多数数据集中在0附近很小的范围内,异常值本身可能仍在±3之外。
对于这类问题,我们也需要先处理异常值;使用对异常值稳健的标准化方法(如Robust Scaler,基于中位数和四分位距)。
了解了什么样的场景下我们需要对异常值进行处理,接下来就是一些常用的异常值处理技术了。
总的来说,数据异常处理的技术有很多,基本可以分为基于统计的方法、基于距离的方法、基于密度的方法和基于机器学习的方法四类,每类方法中又有若干子方法,也算得上是另一种层面上的博大精深了。
一、基于统计的方法 (简单直接,假设数据分布)
Z-Score (标准分数):
原理: 计算每个数据点与均值的偏差,并用标准差进行标准化。Z = (X - μ) / σ
检测: 通常认为 |Z| > 3 的点是异常值(经验法则,可根据需要调整阈值,如2.5或3.5)。
优点: 简单直观,计算快速。
缺点: 假设数据服从(或近似服从)正态分布。对非正态分布效果差。对均值 μ 和标准差 σ 非常敏感(它们本身容易被异常值影响)。不适用于高维数据。
适用场景: 单变量数据,且数据近似正态分布时作为初步筛查。
修改的 Z-Score (Median Absolute Deviation - MAD):
原理: 使用中位数 (Median) 代替均值,使用绝对中位差 (MAD) 代替标准差。MAD = median(|X_i - median(X)|), Modified Z = (X_i - median(X)) / (c * MAD) (c 是一个常数,通常取1.4826,使得在正态分布下 MAD 约等于 σ)。
检测: 同样使用 |Modified Z| > 3 作为阈值。
优点: 比标准 Z-Score 更鲁棒,因为中位数和 MAD 对异常值不敏感。
缺点: 仍然是单变量方法。阈值选择是经验性的。
适用场景: 单变量数据,尤其当数据存在异常值或非正态分布时,比标准 Z-Score 更可靠。
IQR 法 (四分位距法 / 箱线图法):
原理: 计算数据的四分位距 IQR = Q3 - Q1 (Q3是第三四分位数,Q1是第一四分位数)。定义异常值的边界:下限 Lower Bound = Q1 - k * IQR,上限 Upper Bound = Q3 + k * IQR。k 通常取 1.5(温和异常值)或 3(极端异常值)。
检测: 低于下限或高于上限的点被视为异常值。这是箱线图识别异常点的理论基础。
优点: 对数据分布没有强假设(不依赖正态性),非常鲁棒,计算简单。可视化友好(箱线图)。
缺点: 主要适用于单变量数据。对于多模态分布可能不理想。k 的选择是经验性的。
适用场景: 单变量数据异常值检测的首选方法之一,尤其当数据分布未知或非正态时。
二、基于距离的方法 (适用于多变量数据)
K-最近邻 (K-Nearest Neighbors - KNN) 距离:
原理: 对于每个数据点,计算它与最近的 K 个邻居的距离(如欧氏距离)。异常点通常远离其邻居,因此其 KNN 距离会很大。
检测: 设定一个距离阈值,或者对 KNN 距离进行排序,将距离最大的前 n% 的点视为异常值。
优点: 概念简单,适用于多变量数据。
缺点: 计算复杂度高(O(n²)),尤其在大数据集上慢。需要选择 K 值。对数据的局部密度变化不敏感(在密度差异大的区域效果不佳)。对高维数据可能失效(“维度灾难”)。
适用场景: 中小规模、低维的多变量数据集。
三、基于密度的方法 (能处理局部密度变化)
局部离群因子 (Local Outlier Factor - LOF):
原理: 衡量一个数据点相对于其邻居的局部密度偏离程度。计算每个点的 LOF 分数。LOF ≈ 1 表示密度与邻居相似;LOF < 1 可能属于密集区域(可能是内点);LOF >> 1 表示其局部密度显著低于邻居,很可能是异常点。
检测: 设定一个 LOF 阈值(如 > 1.5, > 2 等),或对 LOF 分数排序。
优点: 能够识别局部异常点,对数据中密度变化大的区域处理效果好。适用于多变量数据。
缺点: 计算复杂度高(O(n²)),大数据集慢。需要选择 K(邻居数),结果对 K 值敏感。在高维数据上表现可能下降。
适用场景: 多变量数据,且数据存在不同密度簇时识别局部异常点效果较好。
基于密度的带噪声应用空间聚类 (Density-Based Spatial Clustering of Applications with Noise - DBSCAN):
原理: DBSCAN 本身是一个聚类算法。它将数据点分为三类:核心点、边界点和噪声点。
检测: 算法直接输出的噪声点 (Noise Points) 通常被视为异常值。这些点不属于任何稠密簇,且其邻域内点数不足。
优点: 可以发现任意形状的簇,并能有效识别不属于任何簇的噪声点(异常值)。不需要预先指定簇数量。对噪声相对鲁棒。
缺点: 对参数(邻域半径 eps,最小点数 minPts)选择敏感。在高维数据上确定合适的 eps 困难。在簇间密度差异大时效果可能不佳。
适用场景: 寻找不属于任何明显簇的、稀疏区域的点作为异常值。
四、基于机器学习的方法 (更高级,灵活性强)
隔离森林 (Isolation Forest - iForest):
原理: 利用决策树/二叉树随机地“隔离”数据点。异常点通常具有稀有且不同的特征值,更容易被随机选定的特征和分割值快速隔离到树的叶子节点(路径长度短)。正常点则需要更多的分割步骤(路径长度长)。
检测: 构建多棵隔离树(集成)。计算每个点在所有树中的平均路径长度。平均路径长度越短,异常得分越高,越可能是异常点。
优点: 计算效率高(接近 O(n log n)),适用于大数据集和高维数据。不依赖于距离或密度度量,对数据的分布没有强假设。集成方法鲁棒性较好。
缺点: 在具有大量冗余特征或特征相关性高时效果可能下降。对于某些特定分布的异常(如局部密集的异常簇)可能不如基于密度的方法敏感。需要设定树的数量和子采样大小。
适用场景: 处理大规模、高维数据异常值检测的首选方法之一。
一类支持向量机 (One-Class Support Vector Machine - OCSVM / SVDD):
原理: 是一种无监督学习算法。它在特征空间中学习一个尽可能紧密包围正常数据的边界(超球体或超平面)。目标是最大化正常数据点到原点的间隔,同时最小化边界范围(或允许少量数据点位于边界外)。
检测: 位于学习到的边界之外的点被判定为异常值。
优点: 理论上可以处理复杂形状的边界。可以通过核技巧映射到高维空间处理非线性问题。
缺点: 对核函数和参数(如核系数 ν,它大致控制异常点比例的上限估计)的选择敏感,调参可能复杂。训练过程相对较慢(尤其大数据集)。在高维空间解释性差。
适用场景: 当正常数据的分布模式复杂(非线性),且有一定计算资源时。也常用于半监督场景(只有正常数据)。
自编码器 (Autoencoders - AEs):
原理: 一种神经网络,通过学习将输入数据压缩到一个低维潜在空间(编码),然后再重构回原始空间(解码)。训练目标是让重构输出尽可能接近原始输入。
检测: 异常点通常与训练数据(主要是正常数据)的模式不同,因此其重构误差(如均方误差)会显著高于正常点。
优点: 能够学习数据复杂的非线性特征表示,适用于高维数据(如图像、文本)。
缺点: 需要足够多的“正常”数据来训练。训练神经网络计算成本高,需要调参(网络结构、学习率等)。解释性差(黑盒)。重构误差的阈值选择需要技巧。
适用场景: 高维复杂数据(如传感器数据、图像、序列数据)的异常检测,特别是当数据模式难以用传统统计或距离方法描述时。
五、可视化方法 (辅助探索)
散点图/散点图矩阵: 观察两个或多个变量之间的关系,肉眼识别明显偏离主体模式的点。
箱线图: 可视化单变量分布,直接显示基于 IQR 的异常值。
直方图: 观察单变量分布形状,识别尾部或孤立的柱状。
热力图: 查看相关矩阵或高维数据聚合视图,识别异常模式。
降维可视化 (如 PCA, t-SNE): 将高维数据投影到2D/3D空间,在低维空间中观察整体结构并识别远离密集区域的点。
总的来说,异常值检测的方法非常多,这也就意味着我们在实操过程中有一点点选择使用的方法的说法。我这里列出一个常用的选择方式:
1.看数据维度:
单变量(统计方法、IQR)
多变量/高维(距离、密度、机器学习如 iForest, OCSVM, AE)
2.看数据规模:
小规模(大部分方法可用)
大规模(优先考虑 iForest, 近似 KNN/LOF, 分布式算法)
3.看数据分布:
正态(Z-Score)
非正态/未知(MAD, IQR, 鲁棒方法)
多密度簇(LOF)
4.看异常类型:
全局异常(大部分方法)
局部异常(LOF)。
5.看计算资源:
资源有限(统计、IQR、iForest)
资源充足(OCSVM, AE, 精确 KNN/LOF)。
6.看是否需要可解释性:
高(统计、IQR、箱线图)
低(深度学习如 AE)。
7.看标签可用性:
无监督(上述大部分方法)
半监督(如 OCSVM 使用正常数据训练)
有监督(可训练分类器,但这通常不叫“异常检测”而叫“稀有类检测”)
不过这里列出的很多场景在数据分析师这个职位的日常来说都不是很常见,对于数据分析师日常会接触到的企业经营数据相关的分析常见来说,用得最多的还是箱线图法。