检测离群值的方法,python离群值处理代码

  检测离群值的方法,python离群值处理代码

  全文6023字,预计学习时间20分钟以上。

  资料来源:Pexels

  离群点监测和处理是数据预处理中最重要的环节之一。机器学习算法关注数据点的范围和分布,而数据离群点掩盖了训练过程,导致训练时间更长,模型精度更低。离群值是明显不同于其他数据的数据点,这些值分布在整体模型之外。然而,均值、方差和相关性等统计指标很容易受到异常值的影响。

  下面是一个简单的异常值例子,可以看出一个数据点明显偏离整体模型:

  异常属性

  数据集中的异常值可能是以下原因之一:

  1.数据集中确实存在的极高或极低的值

  2.由人为或机器错误造成的

  3.通过替换缺失值生成

  有时候,离群值的存在可以反映很多信息,需要进一步研究。例如,异常值在与事务管理相关的用例中很重要,因为异常值可以识别事务管理中潜在的欺诈性事务。

  资料来源:Pexels

  本文将讨论以下方法来识别和处理数据集中的异常值。

  异常值检验

  极值分析

  Z分数法(Z分数)

  k-均值聚类算法

  可视化数据

  异常值处理

  平均值/中值或随机缺失值处理

  附加装饰

  顶部、底部和零编码。

  [数]离散化

  然而,上述方法都无法确认哪个观测值是真正的异常值。目前对于异常值的构成没有严格的数学定义,判断一个观测值是否是异常值基本上是我们的主观行为,很大程度上取决于具体的业务问题。因此,本文中讨论的这些方法只是检测过程的开始,帮助您识别应该被视为异常值的数据点。

  检查异常值的方法

  有许多方法可以确定数据中的异常值。本文将讨论以下方法:

  1.极值分析

  2.Z分数法(Z分数)

  3.k均值聚类算法

  需要重申的是,这些方法不能生搬硬套,要用来钻研数据本身。这些方法可以让你知道哪些数据点需要进一步研究。

  数据集:

  本文使用Kaggle中的LendingClub贷款数据集来演示本文的例子。

  导入库

  将熊猫作为pd导入

  import numpy as NP import seaborn as SNS import matplotlib . py plot as PLT % matplotlib inline

  导入数据集

  现在,输入csv文件中的年收入(annual_inc)列来识别异常值。

  use_cols=[annual_inc]

  data=pd.read_csv(loan.csv ,usecols=use_cols,nrows=30000)

  极值分析

  异常值检验最基本的方法是极值分析。这种方法的关键是确定变量基本分布的统计低点,找出极低值。

  就亮睫毛的分布而言,离群值会高于或低于平均值3倍的变量标准差。

  如果变量不是正态分布(不是亮睫毛的分布),那么可以采用计算四分位间距和四分位间距的方法。

  IQR(分位数间范围)=第75个分位数-第25个分位数

  异常值出现在上限和下限中:

  上限=第75个分位数(IQR * 1.5)

  下限=第25个分位数— (IQR * 1.5)

  或极值:

  上限=第75个分位数(IQR * 3)

  下限=第25个分位数— (IQR * 3)

  如果数据点高于或低于上限,则可以将其视为异常值。

  代码:

  首先,计算数据集的四分位距:

  IQR=data.annual_inc .分位数(0.75) - data.annual_inc .分位数(0.25)

  根据上面提到的公式,使用四分位间距(IQR),计算上限:

  upper_limit=data.annual_inc .分位数(0.75) (IQR * 1.5)

  upper _ limit _ extreme=data . annual _ Inc .分位数(0.75) (IQR * 3)

  上限,上限极限极限

  现在,我们来看看上限以上的数据点和极端上限的比值,比如:离群值。

  total=np.float(data.shape[0])

  打印(总借款人:{} 。格式(data.annual_inc.shape[0]/total))

  打印(收入为17.8万英镑的借款人:

  {}.格式(data[data.annual_inc178000]。形状[0]/总数)

  打印(收入为25.6万英镑的借款人:

  {}.格式(data[data.annual_inc256000]。形状[0]/总数)

  可以看出,5%的数据在上限以上,1%的数据在极限上限以上。

  z分数法

  z(或标准分数)表示有多少标准偏差(即给定的平均值偏差度量)。换句话说,它只是重新调整或标准化数据。Z得分可用于确定观察值在分布中的精确位置。z得分可以显示值是高于平均值还是低于平均值。

  Z-score法用于消除数据位置和大小的影响,以便直接比较不同的数据集。Z-score法检验异常值的方法是先对数据进行浓缩和重新调整,然后将任何偏离零太远的值(通常以Z-score 3或-3为临界值)视为异常值。

  计算Z得分的公式如下:

  代码:

  导入库

  从scipy导入统计

  计算z分数

  z=stats.zscore(数据)打印(z)

  3临界值

  阈值=3

  print(np.where(z 3))

  根据上面的输出,第一个序列包含行号,第二个序列表示列号。

  聚类分析方法

  聚类是一种常用的方法,用于将相似的数据点或对象分组到同一个组或簇中。这是异常值分析中一个非常重要的方法。在使用这种方法之前,我们应该首先将相似的对象分组。

  用K-means聚类方法帮助我们收集数据(也就是我们的年收入值),然后用满意的欧氏距离对相似对象进行分类。现在试试吧!

  代码:

  导入库

  现在从scipy.cluster导入K-means模数,vq SciPy支持科学Python,为科学实验的实施提供各种便利程序。

  从scipy.cluster.vq导入k means从scipy.cluster.vq导入vq

  将数据转换为numpy的对象数组,并应用K-means函数。同时要给出两个输入数据,然后,形成聚类数。

  data_raw=data[已支付_金额]。价值

  质心,avg_distance=kmeans(data_raw,4)组,cdist=vq(data_raw,质心)

  离中心的距离是kmeans()形成的聚类中心,avg_distance是每个数据点之间的满意海燕距离与离中心的距离的平均值。接下来,启动vq()方法。返回数据组(分类)与数据点及其最近的数据组之间的距离。

  现在把得到的组画在一起。

  y=np.arange(0,30000)

  plt.scatter(data_raw,y,c=groups)plt.xlabel(薪金)plt.ylabel(指数)plt.show()

  我相信你可以通过上面的图片来识别异常值。

  图解

  如前一篇文章所述,箱线图、直方图和散点图是用于识别数据集中异常值的一些主要方法。

  箱线图

  箱线图又称须线图,是一种用分位数和四分位数间距描述的图表方法。它可以帮助定义上限和下限,任何超出上限和下限的数据都是异常值。

  总而言之,分位数是分布中与值的顺序相关的点。在给定的示例中,分位数可以通过对样本进行排序来找到。所选样本的中值位于分位数的中间或第50个百分位数上(也称为样本的中值)。

  box方法的目的是在进行任何进一步的分析之前识别数据序列中的异常值,以便通过研究获得更准确的结果,并且不受任何极端和异常值的影响。

  sns.boxplot(y=年度公司,数据=数据)

  在这里,异常值是那些在数值上不同于其他数据的观察值。查看盒形图,异常值位于盒形图中的围栏线(“胡须”)之外。

  柱状图

  直方图是显示数据值和发现数据集分布的最常用图表之一。离群值在总体分布模型之外。

  Fig=data.annual_inc.hist(淡酸奶s=500)

  图. set_xlim(0,500000)

  这里,X轴最右侧的数据点是异常值。

  散点图

  散点图用于寻找两个变量之间的关系,这种关系通常有一个模型。不符合模型的数据点是异常值。

  data_raw=data[annual_inc]。价值观念

  y=np.arange(0,30000)plt.scatter(data_raw,y)plt.xlabel(年收入)plt.ylabel(指数)plt.show()

  异常值预处理方法

  1.平均值/中值/随机缺失值处理

  如果有理由认为异常值是由机器误差或测量误差引起的,则说明异常值在性质上类似于缺失值,任何数据缺失处理方法都可以用来替代异常值。异常值的数量很少(否则不会成为异常值),所以用中值、中值、随机缺失值代替异常值是合理的。

  修剪

  这种方法完全抛弃了离群值。也就是说,被认为是异常值的数据点被剔除。因为不可能删除数据集中的大量值,所以修剪是一种更好、更快的方法。

  index=data[(data[ annual _ Inc ]=256000)]. index data . drop(index,inplace=True)

  这里,使用极值分析来确定高于上限的值,然后使用pandas drop函数来移除这些值。

  3.顶部编码/底部编码/零编码

  在代码的顶部,分布中的最大值被设置为任意值。顶部编码变量是超过上限并已被删除的数据点。通过top编码,离群值被限制到一个特定的最大值,这个最大值接近很多观测值。

  底部代码类似,但在分布的右侧。也就是说,所有的值都在某个临界值以下,这个临界值是受临界值限制的。如果临界值为零,则称为零编码。例如,像“年龄”和“收入”这样的变量没有负值。因此,将最低值设置为零是有意义的。

  代码:

  打印(年收入256000: {} 。格式(data[data.annual_inc256000]。形状[0]))

  打印(异常值的百分比:{} 。格式(data[data.annual_inc256000]。shape[0]/NP . float(data . shape[0]))

  在此步骤中,将数据点值设置为大于256000。

  data.loc[data.annual_inc256000, annual_inc]=256000

  data.annual_inc.max()

  现在,最大值是256000。

  4.[数]离散化

  离散化是将连续变量转换为不连续变量的过程,通过创建一组跨越变量值范围的连续区间来完成。因此,这些异常值不再与其他分布的尾端值相同,它们都在相同的区间/范围内。

  将连续变量转化为不连续变量的方法有很多。这种方法也被称为数据宁滨技术,每个盒子属于它自己的部分。

  离散分析的方法:

  (1)等频率离散

  等分频盒将可能的变量值分成N个盒子,每个盒子都有相同数量的观测值。这种方法对于交错变量特别有用,因为它将观察值均匀地放在不同的框中。通常,区间关键度由分位数决定,这有助于减少信息损失,获得更好的结果。

  这里,我们使用熊猫的qcut函数(基于分位数的离散函数)来创建5个箱。

  income _ discretised,intervals=PD . q cut(data . annual _ Inc,5,

  Labels=None,ret light酸奶s=true,precision=3,duplicates=“raise”)

  PD . concat([income _ discreted,data.annual_inc],axis=1)。负责人(5)

  是:

  间隔

  下面,你可以看到每个区间的观测值数量几乎相同。

  temp=PD . concat([income _ discreted,data.annual_inc],axis=1)

  temp . columns=[ income _ discreted , annual_inc]

  temp . group by( income _ discreted )[ annual _ Inc ]。计数()

  (2)等宽离散

  等宽离散仓将可能值的范围分成n个等宽仓。宽度取决于变量值的范围和我们期望的箱数。

  宽度=(最大-最小)/N

  例如,如果变量的值在0到100之间,那么应该创建五个这样宽度的盒子:width=(100-0)/5=20。此时,可以扩展第一个框0~20和最后一个框80~100来放置异常值(即0以下和100以上的值可以放在这两个框中)。目前还不能用经验来定义N,但还是需要用实际用例来定义。

  代码:

  income _ range=data . annual _ Inc . max()-data . annual _ Inc . min()

  min _ value=int(NP . floor(data . annual _ Inc . min()))

  max _ value=int(NP . ceil(data . annual _ Inc . max()))

  #让我们把淡淡的酸奶宽度四舍五入

  inter _ value=int(NP . round(income _ range/5))

  最小值,最大值,中间值

  现在,计算间隔:

  intervals=[i for i in range(最小值,最大值,中间值,中间值)]

  Labels=[dedicated冬瓜_ str (i) for i in range (1,len(intervals))]print(intervals)

  打印(标签)

  最后,使用pandas的剪切功能将数据值剪切并排序到每个框中:

  data[年度_公司_标签]=PD . cut(x=data . annual _公司,

  淡酸奶s=区间,标签=标签,包含_最低=真)

  data[年度_ Inc _ interval ]=PD . cut(x=data . annual _ Inc,

  淡酸奶s=区间,include _ lowest=true)

  data.head(5)

  每个方框中的数据可以用下面的统计图来衡量。可以看出,在给定的样本数据中,大部分人的收入在1万元以下。

  sns .计数图(data.annual_inc_labels)

  留言关注

  我们一起分享AI学习和开发的干货。

  欢迎关注全平台AI挂自媒体“核心阅读”

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: