异常点检测算法实战案例
目录
1. 异常点检测概述
异常点(Outlier)是指与大多数数据明显不同的观测值,可能由测量误差、数据录入问题或真实但罕见的事件引起。在数据分析和机器学习中,异常检测是数据清洗和模型优化的重要环节。常见的检测方法包括统计方法(Z-Score、IQR)、基于模型的方法(Isolation Forest、KNN、One-Class SVM)和基于密度的方法(DBSCAN)。本文将通过Python代码实现这些方法,并分析其适用场景。
2. Z-Score方法
Z-Score方法基于数据点与均值的偏差,适用于正态分布的数据集。其核心思想是:若数据点与均值的偏差超过一定阈值(如3σ),则视为异常。
代码实现:
import numpy as np
from scipy.stats import zscore
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(42)
data = np.random.randn(100) # 正态分布数据
data[50] = 10 # 人为添加异常值
# 计算Z-Score
z_scores = zscore(data)
# 定义阈值(通常为2或3)
threshold = 2.5
outliers = np.where(np.abs(z_scores) > threshold)[0]
# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(range(len(data)), data, c='blue', label='正常值')
plt.scatter(outliers, data[outliers], c='red', label='异常值')
plt.title("Z-Score异常检测")
plt.legend()
plt.show()
结果分析:
- Z-Score方法简单高效,但对非正态分布数据效果较差。
- 图中红色点表示被标记为异常值的数据。
3. IQR方法
IQR(Interquartile Range)方法基于四分位数,适用于非正态分布数据。通过计算四分位距(IQR = Q3 - Q1),并定义异常值范围为:Q1 - 1.5*IQR
到Q3 + 1.5*IQR
。
代码实现:
import pandas as pd
import seaborn as sns
# 生成随机数据
np.random.seed(42)
data = pd.DataFrame({'value': np.random.normal(0, 1, 1000)})
data.loc[990:999, 'value'] = np.random.uniform(5, 10, 10) # 添加异常值
# IQR检测
def detect_outliers_iqr(data):
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return (data < lower_bound) | (data > upper_bound)
outliers = detect_outliers_iqr(data['value'])
outliers_count = sum(outliers)
# 可视化
plt.figure(figsize=(15, 6))
plt.subplot(1, 2, 1)
sns.scatterplot(x=range(len(data)), y=data['value'], hue=