当前位置: 首页 > news >正文

【数据挖掘】3σ原则识别数据中的异常值(附代码)

写在前面:
首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。

路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬步以至千里,就一定能够把宏伟目标变为美好现实。

今天给大家分享一个异常值处理的小方法,它的名字叫3σ原则,在实际项目中使用这个方法对异常数据进行处理,模型精度必须猛涨。多的不说,少的不唠,下面开始今天的教程。

1、引言

异常值是指数据样本中的一些数值明显偏离其他的样本值,这些偏离其他样本值的异常值也称离群点,异常值分析则也称为离群点分析。

在机器学习、数据分析、数据挖掘项目中,需要对数据集进行异常值处理(包括直接删除或者数据修正),这样处理的目的是方便后续更好地进行信息挖掘,减少噪声数据的干扰,提高分析的准确性[1]。

2、3σ原则

3σ原则,又叫拉依达原则,是一基于正态分布的数学原理,它假设一组检测数据中只含有随机误差,通过计算得到标准偏差σ,然后按一定概率确定一个区间,对于超过这个区间的误差,就不属于随机误差而是粗大误差,将含有粗大误差的数据进行剔除[2]。

在统计学中,如果一个变量服从正态分布,且它的均值是u, 标准差是σ,那么将有:

(1)68.27%的数据会落在 u ± σ 内,即数据分布在处于(u−σ, u+σ)中的概率是0.6827

(2)95.45%的数据会落在 u ± 2σ 内,即数据分布在处于(u−2σ, u+2σ)中的概率是0.9545

(3)99.73%的数据会落在 u ± 3σ 内,即数据分布在处于(u−3σ, u+3σ)中的概率是0.9973

通常认为,数据“Y”的取值几乎全部集中在(μ-3σ,μ+3σ)区间内,超出这个范围的可能性仅占不到0.3%,这些超出该范围的数据可以认为是异常值[2]。

(注:此部分内容为3σ原则的定义,已做了引用,无不良引导,不存在滥用原创的情况)

3、代码

3.1 数据

import numpy as np  
import matplotlib.pyplot as plt  
from scipy.stats import lognorm  
import pandas as pd# 设置参数  
s = 0.5  # 形状参数(σ),较小的值会导致更重的右尾  
mean = 0  # 对数正态分布的底数(μ)对应的对数均值  
scale = np.exp(s**2)  # 尺度参数(exp(σ^2)),确保对数正态分布的方差正确  
n_samples = 1000  # 样本数量  # 生成对数正态分布数据  
data = lognorm.rvs(s=s, scale=scale, size=n_samples)  # 写入excel
df = pd.DataFrame(data)
df.to_excel("data.xlsx", index=False, header=None)# 绘制直方图  
plt.hist(data, bins=30, density=True, alpha=0.6, color='g')  # 绘制对数正态分布曲线作为参考  
xmin, xmax = plt.xlim()  
x = np.linspace(xmin, xmax, 100)  
pdf_values = lognorm.pdf(x, s=s, scale=scale)  
plt.plot(x, pdf_values, 'k', linewidth=2, label='Lognormal Distribution (s={})'.format(s))  # 设置图表标题和坐标轴标签  
plt.title('Lognormal Distribution with Long Right Tail (s={})'.format(s))  
plt.xlabel('Value')  
plt.ylabel('Probability Density')  
plt.legend()  # 显示图形  
plt.grid(True)  
plt.show()

数据分布图如下:

3.2 3σ代码

def three_sigma(data_df, column):out_index = []mean_value = data_df[column].mean()        # 求平均值std_value = data_df[column].std()          # 求标准差# print("均值和标准差", mean_value, std_value)lower_bound = mean_value-3*std_valueupper_bound = mean_value+3*std_valuerule = (data_df[column] < lower_bound) | (data_df[column] > upper_bound)  # 位于(u-3std,u+3std)区间的数据是正常的,不在这个区间的数据为异常的out = data_df[column].index[rule]# print("异常索引:", out)out_index += out.tolist() data_df.drop(out_index, inplace=True)return data_df

上面的代码做了单列数据的异常剔除,如果需要多列异常剔除,需要对代码进行改写。

4、优缺点

4.1、3σ原则的优点

1.简单易懂:3σ原则基于标准差的观念,提供了一个直观且易于理解的判断标准。通过计算数据的平均值和标准差,并与3σ进行比较,可以快速判断数据是否处于正常范围内。

2.科学性和客观性:由于3σ原则基于统计学原理,其判断具有一定的科学性和客观性。它依赖于数据的统计特性,而不是主观的、经验性的判断。

3.有效检测异常值:根据正态分布的特性,大约有99.73%的数据落在u±3σ范围内。因此,当一个数据点落在这一范围之外时,可以初步判断为异常值。

4.2、3σ原则的缺点

1.对样本量的依赖:3σ原则的有效性依赖于样本量的大小。当样本量较小时,使用3σ原则进行异常值检测可能不够可靠。因为小样本数据可能无法准确反映总体的分布特性。

2.对非正态分布数据的限制:3σ原则主要适用于具有正态分布或近似正态分布特性的数据。对于非正态分布的数据,3σ原则可能无法有效检测异常值,甚至可能出现误判。

写在最后

在实际的数据挖掘项目中,请结合自身数据情况,酌情使用3σ原则。

参考资料

[1]https://zhuanlan.zhihu.com/p/572327280?utm_id=0
[2]https://zhidao.baidu.com/question/585044313.html
[3]https://www.sohu.com/a/365218206_387904
[4]https://blog.csdn.net/Jormungand_V/article/details/109775367
[5]https://blog.51cto.com/u_15834745/6011865
[6]https://www.cnblogs.com/Tree0108/p/12116099.html

在这里插入图片描述

请扫码关注下方的公众号,让我们共同进步吧。
在这里插入图片描述

http://www.lryc.cn/news/359928.html

相关文章:

  • 人眼是如何看到物体的
  • vue打包时报错文件包过大
  • 预编码算法(个人总结)
  • 【重学C语言】十七、预处理指令
  • SQL注入的危害和原理
  • Unity2D横版摄像机跟随
  • Practicing Version Control
  • 新宏观范式和产业趋势下,纷享销客如何助力企业出海?
  • 安装zookeeper
  • 深入分析 Android Activity (二)
  • 数据结构——经典链表OJ(二)
  • 文件IO(三)
  • 单实例11.2.0.3迁移到RAC11.2.0.4_使用RMAN 异机恢复
  • JavaScript第四讲:函数,作用域,运算符
  • IDEA中,MybatisPlus整合Spring项目的基础用法
  • 从不同角度看如何让大模型变得更聪明呢?
  • Buffer Pool运行机制理解
  • windows配置dns访问git , 加快访问速度保姆级教程
  • Solidity学习-投票合约示例
  • 前端Vue自定义支付密码输入框键盘与设置弹框组件的设计与实现
  • 【QEMU中文文档】1.1 支持的构建平台
  • 摄影后期照片编辑工具:LrC2024 for Mac/win 中文激活版
  • 通关!游戏设计之道Day20
  • 2024年上半年软件设计师试题及答案(回忆版)--选择题
  • 5.28.1 使用卷积神经网络检测乳腺癌
  • 【JavaScript脚本宇宙】JavaScript日期处理神器: 6款顶级库解析
  • C++基础编程100题-002 OpenJudge-1.1-04 输出保留3位小数的浮点数
  • Linux挂载硬盘
  • 用户购物性别模型标签(USG)之决策树模型
  • Mock的用法