机器学习笔记三-检测异常值

检测异常值是数据预处理中非常重要的一步,因为异常值可能会影响模型的训练效果,甚至导致错误的结论。以下是几种常见的检测异常值的方法:

1. 箱线图(Box Plot)

箱线图是一种简单的统计图形,可以直观地显示数据的分布情况及其离群点(异常值)。在箱线图中,异常值通常定义为超出"盒须"范围的点。

  • IQR(四分位距)方法

    • 箱线图的盒子代表数据的第一四分位数(Q1,25%)和第三四分位数(Q3,75%)。
    • 四分位距(IQR)定义为 Q3 - Q1。
    • 异常值通常定义为小于 Q1 - 1.5 * IQR 或大于 Q3 + 1.5 * IQR 的数据点。
    python 复制代码
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 示例数据
    data = np.random.randn(100)  # 生成100个正态分布的数据点
    data = np.append(data, [10, -10])  # 添加几个异常值
    
    # 绘制箱线图
    plt.boxplot(data)
    plt.show()
    
    # 使用IQR方法检测异常值
    Q1 = np.percentile(data, 25)
    Q3 = np.percentile(data, 75)
    IQR = Q3 - Q1
    
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    
    outliers = data[(data < lower_bound) | (data > upper_bound)]
    print("Detected Outliers:", outliers)

2. 标准差方法

标准差法适用于数据呈正态分布的情况。异常值通常定义为超出平均值 μ \mu μ的3倍标准差 σ \sigma σ 的数据点。

  • 公式

    • 异常值定义为小于 μ − 3 σ \mu - 3\sigma μ−3σ 或大于 μ + 3 σ \mu + 3\sigma μ+3σ 的数据点。
    python 复制代码
    mean = np.mean(data)
    std_dev = np.std(data)
    
    lower_bound = mean - 3 * std_dev
    upper_bound = mean + 3 * std_dev
    
    outliers = data[(data < lower_bound) | (data > upper_bound)]
    print("Detected Outliers using Standard Deviation:", outliers)

3. Z-score 方法

Z-score 表示数据点与均值的偏离程度,用于判断该数据点是否为异常值。Z-score 方法适用于数据呈正态分布的情况。

  • 公式

    • Z-score = x − μ σ \frac{x - \mu}{\sigma} σx−μ
    • 当 Z-score 的绝对值大于某个阈值(通常为 3)时,该数据点被认为是异常值。
    python 复制代码
    from scipy import stats
    
    z_scores = stats.zscore(data)
    outliers = data[np.abs(z_scores) > 3]
    print("Detected Outliers using Z-score:", outliers)

4. 使用 Mahalanobis 距离

Mahalanobis 距离考虑了数据的协方差结构,适合检测多变量数据中的异常值。

  • 公式

    • Mahalanobis 距离 D 2 = ( x − μ ) T Σ − 1 ( x − μ ) D^2 = (x - \mu)^T \Sigma^{-1} (x - \mu) D2=(x−μ)TΣ−1(x−μ)
    • 异常值通常定义为 Mahalanobis 距离超过某个阈值的数据点。
    python 复制代码
    from scipy.spatial import distance
    
    # 示例多维数据
    data = np.random.randn(100, 2)
    mean = np.mean(data, axis=0)
    cov_matrix = np.cov(data, rowvar=False)
    
    mahalanobis_distances = [distance.mahalanobis(x, mean, np.linalg.inv(cov_matrix)) for x in data]
    
    threshold = np.percentile(mahalanobis_distances, 97.5)  # 选择一个合适的阈值
    outliers = data[np.array(mahalanobis_distances) > threshold]
    print("Detected Outliers using Mahalanobis Distance:", outliers)

5. 视觉化异常值检测

通过绘制散点图、直方图等图表,可以直观地观察数据分布并识别可能的异常值。

6. 处理异常值的方法

  • 删除: 直接删除异常值,适用于异常值数量很少的情况。
  • 替换: 使用均值、中位数或插值方法替换异常值。
  • 模型化: 在一些情况下,异常值可能是数据的有效部分,可以通过重新建模来处理这些异常值。

总结:

不同的方法适用于不同类型的数据和异常值检测场景。在实际应用中,通常结合多种方法进行异常值检测,并根据业务需求和数据特点采取适当的处理策略。

相关推荐
Seeklike几秒前
11.22 深度学习-pytorch自动微分
人工智能·pytorch·深度学习
庞传奇1 分钟前
TensorFlow 的基本概念和使用场景
人工智能·python·tensorflow
华清远见IT开放实验室9 分钟前
【每天学点AI】实战图像增强技术在人工智能图像处理中的应用
图像处理·人工智能·python·opencv·计算机视觉
OpenVINO 中文社区18 分钟前
实战精选|如何使用 OpenVINO™ 在 ElectronJS 中创建桌面应用程序
人工智能·openvino
只怕自己不够好22 分钟前
《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》
人工智能·opencv·计算机视觉
网络研究院28 分钟前
国土安全部发布关键基础设施安全人工智能框架
人工智能·安全·框架·关键基础设施
Komorebi.py2 小时前
【Linux】-学习笔记05
linux·笔记·学习
不去幼儿园2 小时前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
亦枫Leonlew2 小时前
微积分复习笔记 Calculus Volume 1 - 6.5 Physical Applications
笔记·数学·微积分
想成为高手4992 小时前
生成式AI在教育技术中的应用:变革与创新
人工智能·aigc