4.6 识别异常值
异常值是指显著偏离数据整体分布的极端值,可能是 “噪声(如输入错误、测量误差)”,也可能是 “真实的极端情况(如高收入用户、罕见疾病样本)”。准确识别异常值是后续处理的前提。
4.6.1 常见识别方法
-
3σ 原则(Z - 分数法)
前提:假设特征服从正态分布。原理:计算每个样本的 Z - 分数(即标准化后的数值),若 (|Z| > 3),则视为异常值(正态分布中,99.7% 的数据落在 μ±3σ 内)。 -
箱线图法(四分位距法)
原理:
计算特征的四分位数:Q1(下四分位,25% 分位数)、Q3(上四分位,75% 分位数);
计算四分位距(IQR):(IQR = Q3 - Q1);
异常值判定:小于 (Q1 - 1.5 * IQR) 或大于 (Q3 + 1.5 * IQR) 的值。
优点:不依赖数据分布假设,对偏态分布更鲁棒。 -
聚类法
原理:用聚类算法(如 K-Means)将数据聚为若干类,计算每个样本到其聚类中心的距离,距离远于阈值的样本视为异常值。
适用场景:数据分布复杂(无明显正态 / 偏态特征)的场景。 -
孤立森林(Isolation Forest)
原理:基于决策树的无监督算法,通过 “随机划分特征空间”,异常值会被更快地孤立(划分次数更少),从而识别异常。
适用场景:高维数据的异常值识别,效率较高。
问题描述
识别样本中的一些极端的观察值(异常值)。
解决方案
与其说识别异常值是一门技术不如说是一门艺术,常用的方法就是假设数据是正态分布的,基于这个假设,在数据周围“画”一个椭圆。将所有的处于椭圆内的观察值视为正常值(标注为1),将所有椭圆外的值视为异常值(标注为-1):
import numpy as np
from sklearn.covariance import EllipticEnvelope
from sklearn.datasets import make_blobs
#创建模拟数据
feature,_ = make_blobs(n_samples=10,n_features=2,centers=1,random_state=1)
#将第一个观察值转换成极端值
feature[0,0] = 10000
feature[0,1] = 10000
#创建识别器
outlier_detector = EllipticEnvelope(contamination=.1)
#拟合识别器
outlier_detector.fit(feature)
#预测异常值
x = outlier_detector.predict(feature)
print(x)
讨论
这个方法的一个主要限制是它需要指定一个contamination(污染指数)参数,表示异常值在观察值中的一个比例-----这个值我们也不知道是多少。可以将contamination视为你估计的数据的清洁程度。如果你认为数据中只有很少几个异常值,可以将contamination设置得小一点。反之,如果数据中很有可能有好几个异常值,就将contamination设置成更大点的值。
注意:
除了查看所有的观察值,我们还可以之查看某些特征,并且使用四分位差(IQR)来识别这些特征的极端值。
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.covariance import EllipticEnvelope
features,_ = make_blobs(n_samples=10,n_features

最低0.47元/天 解锁文章
5507

被折叠的 条评论
为什么被折叠?



