【机器学习笔记 Ⅲ】3 异常检测算法
异常检测算法(Anomaly Detection)详解
异常检测是识别数据中显著偏离正常模式的样本(离群点)的技术,广泛应用于欺诈检测、故障诊断、网络安全等领域。以下是系统化的解析:
1. 异常类型
类型 | 描述 | 示例 |
---|---|---|
点异常 | 单个样本明显异常 | 信用卡交易中的天价消费 |
上下文异常 | 在特定上下文中异常(如时间序列) | 夏季气温突降至零下 |
集体异常 | 一组相关样本联合表现为异常 | 网络流量中突然的DDOS攻击流量 |
2. 常用算法
(1) 基于统计的方法
-
Z-Score(标准差法):
- 计算样本与均值的标准差距离,超出阈值(如3σ)判为异常。
- 公式:
[
z = \frac{x - \mu}{\sigma}
] - 代码实现:
from scipy import stats z_scores = stats.zscore(data) anomalies = np.where(np.abs(z_scores) > 3)
-
IQR(四分位距法):
- 定义异常值为低于Q1-1.5×IQR或高于Q3+1.5×IQR。
- 代码实现:
Q1, Q3 = np.percentile(data, [25, 75]) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR anomalies = data[(data < lower_bound) | (data > upper_bound)]
(2) 基于距离的方法
- KNN(K近邻):
- 计算每个样本到最近K个邻居的平均距离,距离过大则为异常。
- 代码实现:
from sklearn.neighbors import NearestNeighbors knn = NearestNeighbors(n_neighbors=5) knn.fit(X) distances, _ = knn.kneighbors(X) anomaly_scores = distances.mean(axis=1)
(3) 基于密度的方法
- LOF(局部离群因子):
- 比较样本的局部密度与邻居的密度,密度显著偏低则为异常。
- 代码实现:
from sklearn.neighbors import LocalOutlierFactor lof = LocalOutlierFactor(n_neighbors=20, contamination=0.01) anomalies = lof.fit_predict(X) # 返回-1表示异常
(4) 基于聚类的方法
- DBSCAN:
- 将不属于任何簇的样本(噪声点)标记为异常。
- 代码实现:
from sklearn.cluster import DBSCAN dbscan = DBSCAN(eps=0.5, min_samples=5) labels = dbscan.fit_predict(X) anomalies = X[labels == -1] # 噪声点即异常
(5) 基于树的方法
- Isolation Forest(孤立森林):
- 异常点因特征值特殊,容易被随机树快速隔离。
- 代码实现:
from sklearn.ensemble import IsolationForest iso_forest = IsolationForest(contamination=0.01) anomalies = iso_forest.fit_predict(X) # 返回-1表示异常
(6) 基于深度学习的方法
- 自编码器(Autoencoder):
- 正常数据重建误差低,异常数据误差高。
- 代码实现:
from tensorflow.keras import layers, Model # 构建自编码器 encoder = layers.Dense(32, activation='relu')(input_layer) decoder = layers.Dense(64, activation='sigmoid')(encoder) autoencoder = Model(input_layer, decoder) autoencoder.compile(optimizer='adam', loss='mse') # 训练后计算重建误差 reconstructions = autoencoder.predict(X) mse = np.mean(np.square(X - reconstructions), axis=1) anomalies = mse > threshold
3. 算法选择指南
场景 | 推荐算法 | 理由 |
---|---|---|
单维数据,分布已知 | Z-Score / IQR | 计算简单高效 |
高维数据,无标签 | Isolation Forest / LOF | 无需假设数据分布 |
时间序列异常 | LSTM-Autoencoder | 捕捉时序依赖关系 |
图像异常检测 | Variational Autoencoder (VAE) | 学习潜在特征空间 |
4. 评估指标
- 有标签时:
- 精确率(Precision)、召回率(Recall)、F1-Score。
- AUC-ROC(异常检测常偏重召回率)。
- 无标签时:
- 人工验证(如Top-N异常样本是否合理)。
- 聚类指标(如轮廓系数)间接评估。
5. 关键挑战
- 样本不平衡:异常样本极少(如0.1%),需使用过采样或调整损失函数。
- 动态环境:正常模式随时间变化(需在线学习或滑动窗口)。
- 解释性:需提供异常原因(如SHAP值解释)。
6. 应用案例
- 金融:信用卡欺诈交易识别。
- 工业:生产线设备故障预警。
- 医疗:心电图异常心跳检测。
- 网络安全:入侵行为检测。
7. 总结
- 核心目标:区分正常模式与异常,而非精确预测。
- 算法选择:取决于数据维度、分布和异常类型。
- 落地要点:
- 结合领域知识定义“异常”。
- 处理样本不平衡(如加权损失或过采样)。
- 模型需持续监控和更新(概念漂移问题)。