修正版拉依达准则的提出与应用

  • 前言
  • 一:基于实验说明异常点对模型结果的影响
  • 二:异常点的判定
  • 三:修正版拉依达准则(3σ准则)
  • 四:理论验证
  • 五:代码实现
  • 六:总结

前言

在前两次文章中,我们都提到异常点对此特征提取方法(模型)是有一定影响的,为了加强模型的鲁棒性(稳健性),对异常点处理是必不可少的。本文就从浅显案例说明异常点如何在实际中影响模型结果,以及如何处理异常点

PS:欢迎各位朋友与鄙人多多交流,多多关注,鄙人从2021/7/25日起,如没有特殊原因的话会1-2周左右更新一篇文章,写文章目的仅为了多认识新朋友,抛砖引玉,相互取长补短~~~
点击跳转个人知乎账号

一:基于实验说明异常点对模型结果的影响

  • 异常点的阐述

异常点不同于缺失值或者重复数据那么肉眼就能观察到,异常点的存在也不是完全没有意义的,往往会蕴含其他内容的信息,同时还要分析异常点出现的可能原因;异常点的判断也是要有依据的,不能把正确数据当成异常点了

  • 利用简单数据集做实验说明异常点的影响力

(PS:为了明了清晰说明问题,我们基于的原始数据集一般都为正数,这也大部分符合生产实际中的数据分布!)

我们还是利用第一篇文章的数据集,但在维度‘C’,‘D’,‘E’中各加了个异常值(异常值大小人为设定为平均值的10多),原来的敏感特征排名前3的是‘F’,‘A’,‘B’,
可以参考第一篇文章结论
含异常值后结果如下,原本敏感排名靠后的3个维度,结果就因为含了1个异常值,排名完全变了,可想而知异常点对一个模型影响是存在的,尤其是在原始数据集少的情况下

************************************距离运算法结果*************************************绝对距离      相对距离
0    8.527123  0.258398
1  153.253272  0.173560
2   52.000000  1.148917
3  140.000000  0.893883
4  114.700000  1.176652
5   24.387415  0.401770
Index(['E', 'C', 'D', 'F', 'A', 'B'], dtype='object')
原本不含异常点的排序情况(都为降序):['F', 'A', 'B', 'E', 'C', 'D']

图1

上图图1展示的是含有异常点的可视化折线图,红圈为异常点值。

二:异常点的判定

  • 异常点的判定目标

一般情况下,异常点指的是某一个维度下样本的数据值出现异常情况,可视为某一样本下的单一维度数据为异常点,
我们也可以把所有维度当做一个整体目标,判定在这些样本中哪些样本是异常点。

  • 异常点常用判定方法

既然判定目标不同,那么方法也就不同,如果基于单一维度下,哪些样本值是异常点,那么常用的可以基于统计分布模型来检验,顾名思义要先知道数据集的分布情况,如果数据集分布很明确,无论对高维还是非高维数据都是很不错的选择,

正态分布之所以是常态分布,是因为很大程度上客观事物随着数据量的增大都服从或者近似服从,所以在不非常明确具体数据集分布下,基于正态分布的统计假设应当作为首选。

还有些比较系统性的方法,有基于邻近度、基于聚类等等,这些方法可以对整体维度数据进行操作,但这会涉及维度数据差异性的影响,所以如果预处理得当的话,效果也是不错的。

三:修正版拉依达准则(3σ准则)

正态分布有个必要要求就是样本数据量要足够大(样本数大于30即可)。经典的3σ准则为:
令任意第iii维有mmm个数据样本数据为
xi=(x1i,x2i,...xmi)x^{i}=\left( x_{1}^{i}, x_{2}^{i},... x_{m}^{i} \right)xi=(x1i​,x2i​,...xmi​),
简记为
x=(x1,x2,...xm)x=\left( x_{1}, x_{2},... x_{m} \right)x=(x1​,x2​,...xm​),
其中 xxx的均值为 μ\muμ ,标准差为 σ\sigmaσ ,则如果
∣xj−μ∣≥3σ|x_{j}-\mu|\geq 3\sigma∣xj​−μ∣≥3σ,
那么xjx_{j}xj​ 视为异常值。

  • 以上准则在我看来需要修正

我们假设如果出现某一个或几个(有限个,因为毕竟异常点的存在是少量的)特别“大”的异常值,那么由二阶原点距(方差)公式:
σ2=∑im(xi−μ)2m\sigma^{2}=\frac{\sum_{i}^{m}{(x_{i}-\mu)^{2}}}{m}σ2=m∑im​(xi​−μ)2​(全数据集)
我们有 :
σμ=(x1−u)2+(x2−u)2+...+(xm−u)2mu\frac{\sigma}{\mu}=\frac{\sqrt{(x_{1}-u)^{2}+(x_{2}-u)^{2}+...+(x_{m}-u)^{2}}}{\sqrt{m}u}μσ​=m​u(x1​−u)2+(x2​−u)2+...+(xm​−u)2​​
=[(m−1)x1−(x2+x3+...+xm)m]2+[(m−1)x2−(x1+x3+...+xm)m]2+[(m−1)xm−(x1+x2+...+xm−1)m]2(m)−1(x1+x2+...+xm)=\frac{\sqrt{\left[ \frac{(m-1)x_{1}-(x_{2}+x_{3}+...+x_{m})}{m} \right]^{2}+\left[ \frac{(m-1)x_{2}-(x_{1}+x_{3}+...+x_{m})}{m} \right]^{2}+\left[ \frac{(m-1)x_{m}-(x_{1}+x_{2}+...+x_{m-1})}{m} \right]^{2}}}{(\sqrt{m})^{-1}(x_{1}+x_{2}+...+x_{m})}=(m​)−1(x1​+x2​+...+xm​)[m(m−1)x1​−(x2​+x3​+...+xm​)​]2+[m(m−1)x2​−(x1​+x3​+...+xm​)​]2+[m(m−1)xm​−(x1​+x2​+...+xm−1​)​]2​​
=[(m−1)x1−(x2+x3+...+xm)]2+[(m−1)x2−(x1+x3+...+xm)]2+[(m−1)xm−(x1+x2+...+xm−1)]2m(x1+x2+...+xm))(∗1)= \frac{\sqrt{\left[ (m-1)x_{1}-(x_{2}+x_{3}+...+x_{m}) \right]^{2}+\left[ (m-1)x_{2}-(x_{1}+x_{3}+...+x_{m}) \right]^{2}+\left[ (m-1)x_{m}-(x_{1}+x_{2}+...+x_{m-1}) \right]^{2}}}{\sqrt{m}(x_{1}+x_{2}+...+x_{m})})(*1)=m​(x1​+x2​+...+xm​)[(m−1)x1​−(x2​+x3​+...+xm​)]2+[(m−1)x2​−(x1​+x3​+...+xm​)]2+[(m−1)xm​−(x1​+x2​+...+xm−1​)]2​​)(∗1)
接下来我们设异常点是第k(k∈[1,m])k\left( k\in[1,m] \right)k(k∈[1,m]) 个,则对第 kkk 个样本我们同理有表达式 :
[(m−1)xk−(x1+x2+...+xk−1+xk+1+...+xm)]2\left[ (m-1)x_{k}-(x_{1}+x_{2}+...+x_{k-1}+x_{k+1}+...+x_{m}) \right]^{2}[(m−1)xk​−(x1​+x2​+...+xk−1​+xk+1​+...+xm​)]2。
由开始假设异常点值足够大,可令 xk→∞x_{k}\rightarrow\inftyxk​→∞ ,那么上面 (*1) 式变为
⇒lim⁡xk→∞(m−1)xk2+[(m−1)xk]2mxk=m−1+o(m)(m≥1)(∗2)\Rightarrow\lim_{x_{k} \rightarrow \infty}{}\frac{\sqrt{(m-1)x_{k}^{2}+\left[ (m-1)x_{k} \right]^{2}}}{\sqrt{m}x_{k}}=\sqrt{m-1}+o(m)(m\geq1)(*2)⇒limxk​→∞​m​xk​(m−1)xk2​+[(m−1)xk​]2​​=m−1​+o(m)(m≥1)(∗2)
由上面简单推导发现,当存在异常大的样本值后, σμ\frac{\sigma}{\mu}μσ​ 的结果完全跟 mmm 的大小有关,且 mmm 越大,这比值就会越大,对于存在非单个且少量异常点时 (1<τ≪m)(1<\tau\ll m)(1<τ≪m) ,其中 τ\tauτ 为异常点个数,同理很容易得到(*2 ) 式的变形结果
(m−τ)/τ+o(m)(m≫τ,xk→∞)\sqrt{(m-\tau)/\tau}+o(m)(m\gg \tau ,x_{k}\rightarrow\infty)(m−τ)/τ​+o(m)(m≫τ,xk​→∞)。

为了结合实际论证分析有效,我们稍加程序验证即可

#当有1个异常点值时,随样本m增大
S1 = pd.Series([1,2,3,4,1000,2,5,5])
print(S1.std(ddof=0)/S1.mean())##2.58S2 = pd.Series([1,2,3,4,1000,2,5,5,6,5,6,9,8,9,8,3,2,2,3])
print(S2.std(ddof=0)/S2.mean())##3.89S3 = pd.Series([1,2,3,4,1000,2,5,5,6,5,8,8,6,9,8,9,8,9,5,6,6,6,5,4,5,5,2,2,3,8,3,2,2,3,6,1,1])
print(S3.std(ddof=0)/S3.mean())##5.09#当存在1个异常点趋于无穷大
S6 = pd.Series([1,2,3,4,100000000,2,5,5,6,5,8,2,6,9,8,9,9,5,6,6,6,5,11,5,5,10,2,3,8,3,2,2,3,6,1,1])
print(S6.std(ddof=0)/S6.mean(),np.power((len(S6) - 1) / 1,0.5))##5.9160692 5.9160798#当存在2个异常点趋于无穷大
S7 = pd.Series([1,2,3,4,100000000,2,5,5,1,2,6,5,1,5,8,2,6,9,8,9,9,5,6,6,6,5,100000000,5,1,5,5,2,1,3,2])
print(S7.std(ddof=0)/S7.mean(),np.power((len(S7) -2) / 2,0.5))##4.0620161 4.0620192#当存在3个异常点趋于无穷大
S8 = pd.Series([1,2,3,4,100000000,2,5,5,1,2,6,5,1,5,8,2,100000000,9,8,9,9,5,6,6,6,5,100000000,5,1,5,5,2,1,3,2])
print(S8.std(ddof=0)/S8.mean(),np.power((len(S8) -3) / 3,0.5))##3.2659847 3.2659863#当存在2个异常值很大,却不是无穷大时
S7 = pd.Series([1,2,3,4,1000,2,5,5,1,2,6,5,1,5,8,2,6,9,8,9,9,5,6,6,6,5,1000,5,1,5,5,2,1,3,2])
print(S7.std(ddof=0)/S7.mean(),np.power((len(S7) -2) / 2,0.5))##3.7709924 4.062019
以上程序结果很符合我们理论分析结果。
注:在理论分析时,异常点设为的是同级别的“无穷大”,取极限结果才成立!
  • 修正原因理论分析

我们再结合拉依达准则: ∣xj−μ∣≥3σ|x_{j}-\mu|\geq 3\sigma∣xj​−μ∣≥3σ ,很明确的会发现当存在过大的异常点时,那么判定异常点的阈值范围非常大即 [xj<−(1+3Cm)μ,xj>(1+3Cm)μ]\left[ x_{j}<-(1+3C\sqrt{m})\mu, x_{j}>(1+3C\sqrt{m})\mu \right][xj​<−(1+3Cm​)μ,xj​>(1+3Cm​)μ] (C设为变常数),那这样就会造成除非非常异常的数据能剔除,稍微异常数据(亚异常值)有可能都落在这范围内,导致亚异常值根本剔除不掉,方法效率变得极为低下

  • 修正方法

通过以上理论分析,我们知道了单纯拉依达准则准则是有局限的(除非保证没有极端异常点出现),所以我们对数据合理阈值要有修正范围,本篇文章主要是从 μ\muμ 前面的系数入手,在计算 μ\muμ 之前我们可以先对数据集进行去极值处理。接下来会结合程序和实际,做出具体修正措施。

四:理论验证

  • 经典拉依达筛选结果

图2

我们从图2中直观感觉这些红圈数据明显异常于它们所在的维度的其它数据,那么如果纯粹用经典的拉依达准则,判断的结果是:

A列:异常值范围在区间[-44.04,63.65]之外,有[A,7]:75;
B列:异常值范围在区间[-823.01,1315.51]之外,有[B,15]:1500;
C列:异常值范围在区间[0.31,5.79]之外,无异常点
D列:异常值范围在区间[5.53,18.77]之外,无异常点
E列:异常值范围在区间[-2.79,4.25]之外,有[E,7]:5

这大大超乎我们的预期,所以这也验证了第三节所说的,因为特异常点的存在,亚异常点很难被筛选出。

  • 剔除极端值的经典拉依达筛选结果

那么就有疑问,经典的法则肯定受极端值影响,那么我们剔除极端值之后再利用经典拉依达准则如何,结果如下:

A列:异常值范围在区间[-22.41,35.86]之外,有[A,2]:45,[A,7]:75;
B列:异常值范围在区间[-429.37,809.81]之外,有[B,15]:1500;
C列:异常值范围在区间[0.63,5.38]之外,无异常点
D列:异常值范围在区间[6.51,17.83]之外,无异常点
E列:异常值范围在区间[-1.49,2.72]之外,有[E,2]:3,[E,7]:5

这结果就好很多,而且正常点区间范围比之前缩小些,但还是有明显的异常点没有筛选出来。

  • 修正版拉依达筛选结果

同样对图2数据集操作,最终基于修正版的筛选结果如下

A列:异常点范围在区间[1.42,12.03]之外,有[A,2]:35,[A,7]:75;[A,19]:0.02
B列:异常点范围在区间[47.53,332.91]之外,有[B,3]:700,[B,14]:800,[B,15]:1500,[B,18]:1
C列:异常点范围在区间[0.63,5.38]之外,无异常点
D列:异常点范围在区间[6.51,17.83]之外,无异常点
E列:异常点范围在区间[0.178,1.05]之外,有[E,2]:3,[E,7]:5

通过修正方法,我们的筛选结果符合预期,而且正常点范围进一步缩小,显得更加合理。

  • 异常点的替换

我们从结果上看,修正版的拉依达准则的有效性比经典版(包括去除极端值的)的好,那么筛选出的异常点该如何处理呢,一般会做如下几个处理

  1. 无视,把异常点的值作为正常值继续后面建模,
  2. 平均值处理,这里的平均值可以是原始样本的平均值,也可以是剔除异常点后的,但这里有个说明,异常点绝大部分包含极值点,但也有可能会一端正常点的范围过大而不包含极值点
  3. 直接删除,那这个异常点位置将变为Nan值(空值),
  4. 视为缺失值,利用处理缺失值的方法进行处理。

此文的异常点替换是上述所说的方法2,结果如下:

图3

从图3结果我们观察到,处理后的结果还是比较“干净的”。

五:代码实现

  • 经典拉依达准则代码如下
import pandas as pddef choosesigm_prin(df,n=3):###默认sigm前面系数为3for i in range(df.shape[1]):tt = df.iloc[:, i]LS = list(tt)Max = list(df.max())[i]Min = list(df.min())[i]while Max in LS:LS.remove(Max)while Min in LS:###处理掉样本中的极值,如果极值重复,一直去除LS.remove(Min)m = pd.Series(LS).mean()s = pd.Series(LS).std()print('极值取出后均值:%.3f'%m)print('极值取出后标准差:%.3f'%s)t1 = m - n * st2 = m + n * sprint('\033[1;38m异常值范围在区间[%s,%s]之外\033[0m'%(t1,t2))fil_S = tt[(tt < t1) | (tt > t2)]###基于数据框做条件筛选,避免for循环出现print(fil_S)fil_index = fil_S.index###异常点的横坐标位置col = df.columns[i]DF = df[col].drop(list(fil_index), axis=0)###去除异常值后的数据框的均值代替df[col].loc[fil_index] = DF.mean()print('\033[1;33m{0:*^80}\033[0m'.format('处理后结果'))print(df)
matx = [[8,5,45,7,6,2,3,75,4,2,5,3,4,6,3,5,5,6,2,0.02],[100,125,124,98,102,152,88,143,145,170,156,169,89,76,800,1500,85,102,1,98],[2,4,3,2,2,3.2,1.9,3,4,5,4,3.5,2,2,3,4,3,2.4,3,4],[12,14,15,9,10,11,13,14,13,12,10,11,13,14,12,12,16,9,8,15],[0.5,0.4,3,0.3,0.2,0.3,0.3,5,0.4,0.3,0.5,0.2,0.2,0.2,0.8,0.6,0.4,0.2,0.3,0.5]]
Index = ['A','B','C','D','E']
df = pd.DataFrame(matx,index=Index).T
choosesigm_prin(df,3)
  • 修正版拉依达准则代码(节选)如下,我们上文也提到过,当存在过大异常点时,异常点的影响过于强烈,原始数据集去除极端值只能防止第一步,但存在多个后就很难有效,于是我们要相应改变标准差 σ\sigmaσ 前面的系数,逻辑如下:
R = s / m###去除极值后的样本标准差/均值
if 0.5 <= R < 1:t1 = m - (n - R) * st2 = m + (n - R) * sprint('\033[1;38m对应第%s列标准差/均值倍数%.3f,由于0.5<值<1,临界系数为%s,其合理值范围[%.3f,%.3f]\033[0m' %(i + 1, R, n - R, t1, t2))
elif R < 0.5:##此时的标准差系数不变为nt1 = m - n * st2 = m + n * sprint('\033[1;38m对应第%s列标准差/均值倍数%.3f,由于值<0.5,临界系数为%s,其合理值范围[%.3f,%.3f]\033[0m' %(i + 1, R, n, t1, t2))
else:###当比值>1,我们设如下规则,其中R1是未去除极值的样本标准差/均值R1 = list(df_sigm)[i] / list(df_mean)[i]# n = (1 / R1) + (1 / R)# n = n / 2# print(R1,R)n = min(1 / R1, 1 / R)t1 = m - n * st2 = m + n * sprint('\033[1;38m对应第%s标准差/均值倍数%.3f,由于值>1,临界系数取%.3f,其合理值范围[%.3f,%.3f]\033[0m' %(i + 1, R, nn, t1, t2))

以上规则也是可以变得,可以根据实际数据分布做不同运算处理,我们的目的是寻找更合理的正常值取值范围,剔除更多的异常点数据

六:总结

  • 本文比较系统地阐述了修正拉依达准的必要性,并增强了准则的鲁棒性,通过理论+实验得到验证,
  • 但我们最终要用到实际场景的,此修正方法能否在实际数据集中表现很好,需要进一步实验,尤其对 σ\sigmaσ 前面的系数选择,要根据实际指定新规则
  • 如果想把整体维度数据直接判定哪个样本是异常样本,那又会有什么样的模型方法,这也是要解决的问题。

进阶版拉依达准则(3sigm准则)的提出与应用相关推荐

  1. matlab实现拉依达准则,拉依达准则matalb程序

    页数:2 中图分类:O212 正文语种:CHI 关键词:数据分析;甑别值;拉依达准则;肖维勒准则;格拉布斯准则 摘要:对测量数据进行分析,是为了及时发现错误,防止错误,数据...... 原始信号 中值 ...

  2. matlab 基于拉依达检验法(3σ准则) 实现多类别多参数的批量检验异常值与异常样本

    拉依达检验法(pauta) 拉依达准则_百度百科 (baidu.com) 拉依达公式: S为样本标准差,3s水平相当于显著水平0.01,2s相当于显著水平0.05 Xp为当前检验的样本参数值,与其相减 ...

  3. 【数据异常校验】拉依达准则( PauTa Criterion 或 3σ准则) 处理异常数据

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

  4. C#使用拉依达准则(3σ准则)剔除异常数据(.Net剔除一组数据中的奇异值)

    1.问题的提出: 电池生产中,遇到一批电池的测量结果数据: 电压值 电池个数 电压值 电池个数 电压值 电池个数 电压值 电池个数 0.056 1   4.09 1   4.146 17   4.17 ...

  5. java中算术异常值_依据拉依达准则来剔除异常值程序

    java源码在下,在main主方法里的data数组里输入要测量的数据(个数长度>=10个),会判断里面有误异常值,如果有则警告 /** * @author 廖启安 * @data 2018年4月 ...

  6. 拉依达准则剔除数据异常

    /// <summary>     /// 拉依达准则剔除数据异常     /// </summary>     public class DataExceptionHelpe ...

  7. 数据预处理 拉依达准则 matlab,数学建模数据预处理.doc

    数据预处理 摘要 目前,大量研究工作都集中于数据挖掘算法的探讨,而忽略了对数据预处理的研究.事实上,数据预处理对数据挖掘十分重要,而且必不可少.要使数据挖掘出有效的知识,必须为其提供干净,准确,简洁的 ...

  8. 拉依达准则python实现

    根据拉依达准则(3σ准则)去除异常值 3σ准则:设对被测量变量进行等精度测量,得到x1,x2,--,xn,算出其算术平均值x及剩余误差vi=xi-x(i=1,2,-,n),并按贝塞尔公式算出标准误差σ ...

  9. matlab拉依达法,基于拉依达准则的奇异数据滤波法.ppt

    基于拉依达准则的奇异数据滤波法 第四章 智能仪器的基本数据处理算法 数据处理能力是智能仪器水平的标志,不能充分发挥软件作用,等同硬件化的数字式仪器. 基本数据处理算法内容提要 克服随机误差的数字滤波算 ...

最新文章

  1. 为什么阿里巴巴禁止把SimpleDateFormat定义为static类型的?
  2. ansible模块---续
  3. 【PHP7.2+】win10安装laravel(完整版,包含运行)
  4. 监控指标10K+!携程实时智能检测平台实践
  5. /usr/lib/python2.6/site-packages/pycurl.so: undefined symbol: CRYPTO_set_locking_callback
  6. javascript --- 让函数的实例可以链式调用
  7. mysql goldengate_goldengate同步mysql
  8. 2012递归求解单链表中的结点个数(C++,附递归函数思路讲解与手绘图)
  9. 【慢慢学Android】:11.对话框大全
  10. 用python输出200以内的素数_Python练习题 008:打印101-200之间的所有素数
  11. 3.2. 开始入住实验
  12. 数据结构1——堆栈和队列
  13. 优秀的Git客户端:Tower for mac
  14. 计算机网络是几级学科,教育部更新学科目录 “网络空间安全”增设为一级学科...
  15. linux iometer io
  16. POJ-3764 01-Trie
  17. ML.NET 示例:聚类之客户细分
  18. ts定义数组类型_ts基本类型
  19. mysql 数据转移历史表_mysql 历史数据表迁移方案
  20. 我们能为别人留下什么?——纪念一位真正的兄长

热门文章

  1. CSS学习笔记一 ——详细附图、入门必看
  2. 电脑访问打印机连接的共享文件夹
  3. php里切换不了输入法,电脑中怎么切换输入法
  4. python爬取网易云音乐飙升榜音乐_python爬取网易云音乐热歌榜单(获取iframe中数据,src为空)...
  5. 红帽子6.4服务器版下载、安装,更改yum教程收集
  6. VIVO、蚂蚁金服跨界握手,融入区块链技术,共同研发新型智能手机
  7. RT_Thread_串口数据解包
  8. Web性能压力测试工具之WebBench详解
  9. 头条号发视频有收益吗,头条号发视频就有收益吗
  10. 2013年计算机试题(三),2013年计算机等级考试(一级Ms Office)经典试题(三)及答案...