异常值检测方法汇总

本文从项目角度探讨异常值检测,重点关注机器学习算法,包括传统统计方法(3σ准则、四分位图)、机器学习方法(监督、无监督、半监督学习)和深度学习方法。文章介绍了IsolationForest、DBSCAN、LOF等算法,并提供了代码示例。此外,还提及了模型部署和维护更新的相关内容。

前言

首先这不是一篇简单探究算法的文章,本文是从项目的角度出发来探究如何对数据进行异常值检测,重点是机器学习算法(针对有异常和无异常的各种情况),当然后面还会包括一些模型部署、产品上线的内容。

具体算法使用代码,见我的GitHub

一、项目流程

1.目标确立

要开始一个项目,首先就得明确一个目的,根据这个目的从而思考一下几个问题:

  1. 做什么?
  2. 为什么要做?
  3. 谁来做?
  4. 什么时候做?
  5. 怎么做?
  6. 优势在哪?

当然你或许考虑的更多,不光是技术,还有人力、成本、利润、营销等问题。但是一般这个不是你该考虑的问题,除非你就是项目经理。.

就拿本文来说,检测离群点或异常值是数据挖掘的核心问题之一。数据的爆发和持续增长以及物联网设备的传播,使我们重新思考处理异常的方式以及通过观察这些异常来构建的应用场景。

举个简单的例子:

我们现在可以通过智能手表和手环每几分钟检测一次心率。检测心率数据中的异常可以帮助预测心脏疾病。交通模式中的异常检测可以帮助预测事故。异常检测还可用于识别网络基础设施和服务器间通信的瓶颈。因此,基于异常检测构建的使用场景和解决方案是无限的。

2.数据准备

由于此次的数据是敏感数据源,所以不能公开展示,这里只是简单的描述一下数据如何准备。

一般数据的准备主要有以下几种方式:

  1. 数据库数据
  2. 由统计、调查、报告获得 CSV、Excel等文件型数据
  3. 网络爬虫数据
  4. 某些开放型平台数据

3.数据分析处理

数据处理分析详见前面写的这两篇文章:

Pandas数据处理与分析

数据预处理(sklearn.preprocessing)

数据分析处理没有固定的方法,仁者见仁智者见智,根据自己数据的形式和存在问题进行分析处理。

4.模型算法(重点)

进行异常值检测的方法有很多,主要的话有以下几种大的分类:

  1. 传统统计方法
  2. 机器学习方法
  3. 深度学习方法
  4. 其他方法
    在这里插入图片描述
4.1 传统统计方法

在统计学中,离群点是并不属于特定族群的数据点,是与其它值相距甚远的异常观测。离群点是一种与其它结构良好的数据不同的观测值。

4.1.1 3σ准则

3σ准则是指先假设一组检测数据只含有随机误差,对其进行计算处理得到标准偏差,按一定概率确定一个区间,认为凡超过这个区间的误差,就不属于随机误差而是粗大误差,含有该误差的数据应予以剔除。

这种判别处理原理及方法仅局限于对正态或近似正态分布的样本数据处理,它是以测量次数充分大为前提(样本>10),当测量次数少的情形用准则剔除粗大误差是不够可靠的。
3σ法则为:

  • 数值分布在(μ-σ,μ+σ)中的概率为0.6827
  • 数值分布在(μ-2σ,μ+2σ)中的概率为0.9545
  • 数值分布在(μ-3σ,μ+3σ)中的概率为0.9973

可以认为,Y 的取值几乎全部集中在(μ-3σ,μ+3σ)区间内,超出这个范围的可能性仅占不到0.3%
在这里插入图片描述
因此,如果你有任何数据点超过标准差的 3 倍,那么这些点很有可能是异常值或离群点。(正态分布)

算法实现:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(42)
anomalies = []
normal = []
# 生成一些数据
data = np.random.randn(50000)  * 20 + 20

# 在一维数据集上检测离群点的函数
def find_anomalies(random_data):
    # 将上、下限设为3倍标准差
    random_data_std = np.std(random_data)
    random_data_mean = np.mean(random_data)
    anomaly_cut_off = random_data_std * 3

    lower_limit  = random_data_mean - anomaly_cut_off 
    upper_limit = random_data_mean + anomaly_cut_off
    print("下限: ",lower_limit)
    print("上限: ",upper_limit)
    # 异常
    for outlier in random_data:
        if outlier > upper_limit or outlier < lower_limit:
            anomalies.append(outlier)
        else:
            norm
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值