当前位置: 首页 > 后端技术 > Python

Python数据分析-异常值检测与处理

时间:2023-03-26 12:08:45 Python

上一篇分享了一些关于数据缺失值处理的方法,链接如下:【【Python数据分析基础】:数据缺失值处理本文继续分享另一部分数据cleaning一个常见的问题:异常检测和处理。1什么是异常值?在机器学习中,异常检测和处理是一个比较小的分支,或者说是机器学习的一个副产品,因为在一般的预测问题中,模型通常是整体样本数据结构的一个表达,这个表达通常捕获了整体样本的一般属性,而那些在这些属性中与整体样本完全不一致的点,我们称之为离群点,通常离群点不受开发者在预测问题中的影响。欢迎,因为预测问题通常关注的是整体样本的性质,异常值的产生机制与整体样本完全不一致。如果算法对异常值敏感,那么生成的模型就不能对整体样本有更好的表达,所以预测是不准确的。另一方面,在某些场景下,异常点是分析师非常感兴趣的,比如疾病预测。通常,健康人的身体指标在某些方面是相似的。如果一个人的身体指标不正常,那么他的身体状况一定在某些方面发生了变化。当然,这种变化不一定是由疾病引起的(通常称为噪声点),但异常的发生和检测是疾病预测的重要起点。类似的场景也可以应用于信用欺诈、网络攻击等。2离群值检测方法通常,离群值检测方法包括基于统计的方法、基于聚类的方法以及一些特殊的异常值检测方法等,下面分别介绍这些方法.1.简单统计如果使用pandas,我们可以直接使用describe()来观察数据的统计描述(粗略观察一些统计即可),但是统计数据是连续的,如下:df.describe()或者干脆使用散点图也可以清楚地观察到异常值的存在。如下图:2.3?原理这个原理有一个条件:数据需要服从正态分布。在3?原则下,如果异常值超过标准差的3倍,则可以视为异常值。正负3?的概率为99.7%,则平均值为3?以外的值出现的概率为P(|x-u|>3?)<=0.003,属于极小概率事件.如果数据不服从正态分布,也可以用偏离均值的标准差多少倍来描述。红色箭头指向异常值。3.箱线图这种方法利用箱线图的四分位间距(IQR)来检测异常值,也称为Tukey'stest。箱形图的定义如下:四分位距(IQR)是上四分位数和下四分位数之间的差值。而我们以1.5倍IQR为标准,规定:超过上四分位数+1.5倍IQR距离,或下四分位数-1.5倍IQR距离的点为异常值。下面是Python中的代码实现,主要使用了numpy的percentile方法。Percentile=np.percentile(df['length'],[0,25,50,75,100])IQR=Percentile[3]-Percentile[1]UpLimit=Percentile[3]+ageIQR*1.5DownLimit=Percentile[1]-ageIQR*1.5也可以使用seaborn的可视化方法boxplot来实现:f,ax=plt.subplots(figsize=(10,8))sns.boxplot(y='length',data=df,ax=ax)plt。show()红色箭头指向异常值。以上是常用的异常值判断的简单方法。让我们介绍一些更复杂的异常值检测算法。由于涉及内容较多,这里只介绍核心思想。有兴趣的朋友可以自行深入研究。4.Model-baseddetection该方法一般构建概率分布模型,计算对象符合模型的概率,将概率低的对象视为异常值。如果模型是集群的集合,则异常是不明显属于任何集群的对象;如果模型是回归,则异常是与预测值相对较远的对象。异常值的概率定义:异常值是相对于数据的概率分布模型具有低概率的对象。这种情况的前提是需要知道数据集服从什么分布。如果估计错误,就会造成重尾分布。比如特征工程中的RobustScaler方法,在对数据特征值进行缩放时,会利用数据特征的分位数分布,将数据按照分位数划分成多个段,只取中间段进行缩放,例如只25将数据从%分位数缩放到75%分位数。这减少了异常数据的影响。优点和缺点:(1)有坚实的统计理论基础,当有足够的数据和对所用测试类型的了解时,这些测试会非常强大;(2)对于多变量数据,可用的选项较少并且是维度数据,这些检测概率很差。5.基于接近程度的离群点检测统计方法是利用数据的分布来观察离群点。有些方法甚至需要一些分布条件。在实践中,数据的分布很难满足一些假设,在使用上也有一定的局限性。局限性。为数据集确定有意义的邻近度量比确定其统计分布更容易。此方法比统计方法更通用且更易于使用,因为对象的异常值分数由与其k最近邻(KNN)的距离给出。需要注意的是,离群值对k值高度敏感。如果k太小,附近的少量离群值可能会导致离群值较低;如果k太大,则簇中少于k个点的所有对象都可能成为异常值。为了使方案对k的选择更加鲁棒,可以使用k个最近邻的平均距离。优缺点:(1)简单;(2)缺点:基于邻近度的方法需要O(m2)时间,不适用于大数据集;(3)该方法对参数的选择也很敏感;(4)无法处理具有不同密度区域的数据集,因为它使用全局阈值,无法解释这种密度变化。5.基于密度的异常值检测从基于密度的角度来看,异常值是低密度区域中的对象。基于密度的异常值检测与基于接近度的异常值检测密切相关,因为密度通常根据接近度来定义。定义密度的一种常用方法是将密度定义为到k个最近邻居的平均距离的倒数。如果距离小,则密度高,反之亦然。另一种密度定义是DBSCAN聚类算法使用的密度定义,即一个对象周围的密度等于该对象指定距离d内的对象个数。优点和缺点:(1)给出了对象是异常值的量化度量,即使数据有不同的区域也能很好地处理;(2)与基于距离的方法一样,这些方法必然具有O(m2)时间复杂度。对于低维数据,使用特定的数据结构可以达到O(mlogm);(3)参数选择困难。虽然LOF算法通过查看k的不同值然后取最大异常值分数来处理这个问题,但仍然需要为这些值选择上下界。6.Clustering-basedmethodsforoutlierdetectionCluster-basedoutliers:一个对象是一个基于聚类的异常值,如果这个对象不属于任何一个簇,那么这个对象就是一个异常值。异常值对初始聚类的影响:如果通过聚类检测到异常值,则存在结构是否有效的问题,因为异常值会影响聚类。这也是k-means算法的缺点,对离群点比较敏感。处理这个问题,可以使用以下方法:聚类对象,去除异常值,再次聚类对象(这不保证产生最佳结果)。优点和缺点:(1)基于线性和近线性复杂度(k-means)的聚类技术可以非常有效地发现异常值;(2)聚类的定义通常是离群值的补集,所以有可能同时发现聚类和离群值;(3)生成的异常值集及其分数可能非常依赖于使用的聚类数量和数据中异常值的存在;(4)聚类算法产生的聚类质量影响很大该算法产生的异常值质量影响非常大。7.专门的离群点检测其实上面说的聚类方法的初衷是无监督分类,不是为了寻找离群点,但恰好它的功能可以实现离群点的检测,这是一个派生函数。除了上面提到的方法外,还有两种常用的异常值检测方法:OneClassSVM和IsolationForest。具体细节就不深入研究了。3离群值的处理方法我们检测到了离群值,需要对其进行处理。一般的异常值处理方法大致可以分为以下几类:删除包含异常值的记录:直接删除包含异常值的记录;treatasmissingvalues:将异常值视为缺失值,使用缺失值处理的方法处理;平均值校正:异常值可以通过前后两次观测值的平均值来校正;不处理:直接对有异常值的数据集进行数据挖掘;是否剔除异常值可根据实际情况考虑。因为有些模型对离群值不是很敏感,即使有离群值也不会影响模型的效果,但是有些模型比如逻辑回归LR对离群值很敏感,如果不处理,可能会有很差的效果比如过拟合。4异常值总结以上是对异常值检测和处理方法的总结。通过一些检测手段,我们可以发现异常值,但是得到的结果并不是绝对正确的,具体情况需要根据业务的理解来判断。同样,异常值如何处理,是删除、纠正还是不处理,也需要结合实际情况考虑,没有固定的。本文转载自https://juejin.cn/post/6844903653178867726,如有侵权请联系删除。