【机器学习笔记 Ⅲ】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. 总结
  • 核心目标:区分正常模式与异常,而非精确预测。
  • 算法选择:取决于数据维度、分布和异常类型。
  • 落地要点
    1. 结合领域知识定义“异常”。
    2. 处理样本不平衡(如加权损失或过采样)。
    3. 模型需持续监控和更新(概念漂移问题)。

你可能感兴趣的:(机器学习,机器学习,笔记,算法)