使用 z 分数进行异常检测

Python 中的异常检测

Bekhruz (Bex) Tuychiev

Kaggle Master, Data Science Content Creator

什么是 z 分数?

  • z 分数表示:
    • 距均值的标准差个数

示例:

  • 在分布 $\mu=10$、$\sigma=3$ 中:
    • $Z_{16.3}=(16.3-10) / 3=2.1$

用于计算 z 分数的公式。

Python 中的异常检测

经验法则与异常值

经验法则:

  • 68% 落在 1 个标准差内
  • 95% 落在 2 个标准差内
  • 99.7% 落在 3 个标准差内

异常值:

  • 超出 3 个标准差范围
  • 位于尾部(两侧粉色区域)

来自维基百科的经验法则图,显示正态分布及其 68%、95%、99.7% 区域并注释。

1 图像来自维基百科 Empirical Rule 页面
Python 中的异常检测

代码中的 z 分数

from scipy.stats import zscore


scores = zscore(sales) scores[:5]
0    0.910601
1   -1.018440
2   -0.049238
3    0.849103
4   -0.695373
Python 中的异常检测

代码中的 z 分数

is_over_3 = np.abs(scores) > 3

is_over_3[:5]
0    False
1    False
2    False
3    True
4    False
Python 中的异常检测

代码中的 z 分数

outliers = sales[is_over_3]

print(len(outliers))
90
Python 中的异常检测

z 分数的缺点

  • 适用于近似正态分布的数据
  • 均值和标准差易受异常值影响
  • 异常值过多会降低效果
Python 中的异常检测

中位数绝对偏差(MAD)

  • 度量离散度(变异性)
  • 对异常值更稳健
  • 以中位数为核心

用于计算中位数绝对偏差得分的公式。

Python 中的异常检测

MAD 得分

from scipy.stats import median_abs_deviation

mad_score = median_abs_deviation(sales)

mad_score
1081.925
Python 中的异常检测

PyOD 简介

  • 基于 MAD 的修正 z 分数在 PyOD 中实现
  • PyOD(Python 异常检测库):
    • 提供 40+ 种算法
    • 语法与 sklearn 相似
Python 中的异常检测

代码中的修正 z 分数

from pyod.models.mad import MAD

# threshold defaults to 3.5
mad = MAD(threshold=3.5)


# Reshape sales sales_reshaped = sales.values.reshape(-1, 1)
Python 中的异常检测

代码中的修正 z 分数

labels = mad.fit_predict(sales_reshaped)

print(labels.sum())
83
Python 中的异常检测

Passons à la pratique !

Python 中的异常检测

Preparing Video For Download...