精华内容
下载资源
问答
  • Python数据分析基础: 异常值检测和处理

    千次阅读 多人点赞 2020-10-31 22:05:31
    【Python数据分析基础】: 数据缺失值处理 本篇继续分享数据清洗中的另一个常见问题:异常值检测和处理。 1 什么是异常值? 在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为...

    作者:东哥起飞

    公众号:Python数据科学



    上一篇分享了关于数据缺失值处理的一些方法,链接如下:
    【Python数据分析基础】: 数据缺失值处理

    本篇继续分享数据清洗中的另一个常见问题:异常值检测和处理。

    1 什么是异常值?

    在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些在这些性质上表现完全与整体样本不一致的点,我们就称其为异常点,通常异常点在预测问题中是不受开发者欢迎的,因为预测问题通产关注的是整体样本的性质,而异常点的生成机制与整体样本完全不一致,如果算法对异常点敏感,那么生成的模型并不能对整体样本有一个较好的表达,从而预测也会不准确。
    从另一方面来说,异常点在某些场景下反而令分析者感到极大兴趣,如疾病预测,通常健康人的身体指标在某些维度上是相似,如果一个人的身体指标出现了异常,那么他的身体情况在某些方面肯定发生了改变,当然这种改变并不一定是由疾病引起(通常被称为噪音点),但异常的发生和检测是疾病预测一个重要起始点。相似的场景也可以应用到信用欺诈,网络攻击等等。

    2 异常值的检测方法

    一般异常值的检测方法有基于统计的方法,基于聚类的方法,以及一些专门检测异常值的方法等,下面对这些方法进行相关的介绍。

    1. 简单统计

    如果使用pandas,我们可以直接使用describe()来观察数据的统计性描述(只是粗略的观察一些统计量),不过统计数据为连续型的,如下:

    df.describe()
    

    或者简单使用散点图也能很清晰的观察到异常值的存在。如下所示:

    2. 3∂原则

    这个原则有个条件:数据需要服从正态分布。在3∂原则下,异常值如超过3倍标准差,那么可以将其视为异常值。正负3∂的概率是99.7%,那么距离平均值3∂之外的值出现的概率为P(|x-u| > 3∂) <= 0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。

    红色箭头所指就是异常值。

    3. 箱型图

    这种方法是利用箱型图的四分位距(IQR)对异常值进行检测,也叫Tukey‘s test。箱型图的定义如下:

    四分位距(IQR)就是上四分位与下四分位的差值。而我们通过IQR的1.5倍为标准,规定:超过上四分位+1.5倍IQR距离,或者下四分位-1.5倍IQR距离的点为异常值。下面是Python中的代码实现,主要使用了numpypercentile方法。

    Percentile = np.percentile(df['length'],[0,25,50,75,100])
    IQR = Percentile[3] - Percentile[1]
    UpLimit = Percentile[3]+ageIQR*1.5
    DownLimit = 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. 基于模型检测

    这种方法一般会构建一个概率分布模型,并计算对象符合该模型的概率,把具有低概率的对象视为异常点。如果模型是簇的集合,则异常是不显著属于任何簇的对象;如果模型是回归时,异常是相对远离预测值的对象。

    离群点的概率定义:离群点是一个对象,关于数据的概率分布模型,它具有低概率。这种情况的前提是必须知道数据集服从什么分布,如果估计错误就造成了重尾分布。

    比如特征工程中的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. 基于聚类的方法来做异常点检测

    基于聚类的离群点:一个对象是基于聚类的离群点,如果该对象不强属于任何簇,那么该对象属于离群点。

    离群点对初始聚类的影响:如果通过聚类检测离群点,则由于离群点影响聚类,存在一个问题:结构是否有效。这也是k-means算法的缺点,对离群点敏感。为了处理该问题,可以使用如下方法:对象聚类,删除离群点,对象再次聚类(这个不能保证产生最优结果)。

    优缺点:(1)基于线性和接近线性复杂度(k均值)的聚类技术来发现离群点可能是高度有效的;(2)簇的定义通常是离群点的补,因此可能同时发现簇和离群点;(3)产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据中离群点的存在性;(4)聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大。

    7. 专门的离群点检测

    其实以上说到聚类方法的本意是是无监督分类,并不是为了寻找离群点的,只是恰好它的功能可以实现离群点的检测,算是一个衍生的功能。

    除了以上提及的方法,还有两个专门用于检测异常点的方法比较常用:One Class SVMIsolation Forest,详细内容不进行深入研究。

    3 异常值的处理方法

    检测到了异常值,我们需要对其进行一定的处理。而一般异常值的处理方法可大致分为以下几种:

    • 删除含有异常值的记录:直接将含有异常值的记录删除;
    • 视为缺失值:将异常值视为缺失值,利用缺失值处理的方法进行处理;
    • 平均值修正:可用前后两个观测值的平均值修正该异常值;
    • 不处理:直接在具有异常值的数据集上进行数据挖掘;

    是否要删除异常值可根据实际情况考虑。因为一些模型对异常值不很敏感,即使有异常值也不影响模型效果,但是一些模型比如逻辑回归LR对异常值很敏感,如果不进行处理,可能会出现过拟合等非常差的效果。

    4 异常值总结

    以上是对异常值检测和处理方法的汇总。

    通过一些检测方法我们可以找到异常值,但所得结果并不是绝对正确的,具体情况还需自己根据业务的理解加以判断。同样,对于异常值如何处理,是该删除,修正,还是不处理也需结合实际情况考虑,没有固定的。

    参考:

    https://zhuanlan.zhihu.com/p/33665409
    http://www.cnblogs.com/pinard/p/9314198.html
    https://blog.csdn.net/u013719780/article/details/48901183
    http://www.cnblogs.com/charlotte77/p/5606926.html

    《Python数据分析与挖掘实战》

    原创不易,来波点赞支持。

    本篇首发于我的原创公众号:Python数据科学,欢迎关注。
    数据科学网站:datadeepin

    展开全文
  • 数据预处理异常值处理表中的内容(Table of Content) Definition of Outliers离群值的定义Different types of Outliers不同类型的离群值Ways to deal with Outliers处理离群值的方法Optional Content about SD & ...

    数据预处理异常值处理

    表中的内容(Table of Content)

    1. Definition of Outliers

      离群值的定义
    2. Different types of Outliers

      不同类型的离群值
    3. Ways to deal with Outliers

      处理离群值的方法
    4. Optional Content about SD & Variance

      关于SD和差异的可选内容
    5. Standard Deviation Method

      标准偏差法
    6. Interquartile Range Method(IQR)

      四分位距法(IQR)
    7. Automatic Outliers detection

      自动异常值检测

    离群值的定义(Definition of Outliers)

    An outlier is an unlikely observation in a dataset. It is rare, or distinct, or does not fit in some way.

    离群值是数据集中不太可能观察到的。 它很少见或与众不同,或者在某种程度上不适合。

    不同类型的离群值: (Different types of Outliers:)

    Outliers can have many causes, such as:

    离群值可能有多种原因,例如:

    • Measurement or Manual error

      测量或手动错误
    • Data generation flaw

      数据生成缺陷
    • Data corruption

      资料损坏
    • True outlier observation (E.g. Sachin tendulkar/Virat Kohli in Cricket)

      真正的异常值观察(例如,板球中的Sachin tentenkar / Virat Kohli)

    There is no precise way to identify an outlier, domain expert needs to interpret the raw data and decide whether a value is an outlier or not.

    没有精确的方法来识别异常值,领域专家需要解释原始数据并决定是否 值是否为异常值。

    处理离群值的方法 (Ways to deal with Outliers)

    • Standard Deviation Method

      标准偏差法
    • Interquartile Range Method (IQR)

      四分位间距法(IQR)
    • Automatic Outlier Detection

      自动异常值检测

    关于SD和差异的可选内容(Optional Content about SD& Variance)

    Variance: In probability theory and statistics, variance is the expectation of the squared deviation of a random variable from its mean.Informally, it measures how far a set of numbers is spread out from their average value.

    方差:在概率论和统计学中,方差是对随机变量与其均值平方差的期望,非正式地,它衡量一组数字与平均值之间的距离。

    Image for post
    My photography :)
    我的摄影:)

    S² = sample varianceX = the value of the one observationμ = the mean value of all observationsN = the number of observations

    S²=样本方差X =一次观测的值μ=所有观测的平均值N =观测数量

    Standard Deviation: In statistics, the standard deviation is a measure of the amount of variation or dispersion of a set of values.A low standard deviation indicates that the values tend to be close to the mean of the set, while a high standard deviation indicates that the values are spread out over a wider range.

    标准偏差:在统计中,标准偏差是对一组值的偏差或离散程度的度量。低标准偏差表示值倾向于接近该组平均值,而高标准偏差表示这些值分布在更大的范围内。

    Image for post
    My photography :)
    我的摄影:)

    Variance (Sigma)² = average squared deviation of values from mean.Standard deviation (Sigma) = square root of the variance

    方差(Sigma)² =值与平均值的平均平方偏差。 标准偏差(Sigma) =方差的平方根

    As we square the deviations while calculating variance the unit changes E.g. lengths measured in metres(m) have a variance measured in metres squared (m²). Taking the square root of the variance gives us the units used in the original scale and this is the standard deviation.

    当我们在计算方差时对偏差求平方时,单位变化的Eg长度以米(m)为单位,方差以米平方(m²)为单位。 取方差的平方根即可得出原始比例中使用的单位,这是标准偏差。

    Standard deviation is a measures of spread around the mean. As it is closely linked with the mean, it is greatly affected by the outliers.

    标准差是围绕均值分布的度量。 由于它与均值密切相关,因此受异常值的影响很大。

    #当2个数据集具有相同或几乎相似的均值时? (# When 2 datasets have same or almost similar mean?)

    • SD is useful when comparing the spread of two separate data sets that have approximately the same mean. The data set with the smaller standard deviation has a narrower spread of measurements around the mean and therefore having comparatively fewer high or low values.

      比较两个均值大致相同的独立数据集的散布时,SD很有用。 标准偏差较小的数据集在平均值附近的测量范围较窄,因此较高或较低的值相对较少。

      But there are few considerations while checking the SD which have same mean.

      但是,在检查SD时,没有太多考虑具有相同的意思。

    Consider you are trying to compare two Cricket players having a difference of 3 centuries is pretty close but if we on the other hand compare the number of matches played has a difference of 30 then they are considered to be far apart. It is always useful to access the SD based on the mean value.

    考虑到您正在尝试比较两个具有3个世纪差异的板球运动员,这非常接近,但是如果我们比较进行的比赛数具有30个差异,则认为他们相距甚远。 根据平均值访问SD总是有用的。

    有关标准偏差和方差的重要事实 (Important facts about Standard deviation & Variance)

    1. Standard deviation:

      标准偏差:
    • Standard deviation is never negative.

      标准偏差永远不会为负。
    • Standard deviation is sensitive to outliers.

      标准差对异常值敏感。

    2. Variance:

    2.差异:

    • Doubles the unit of measurement

      将测量单位加倍
    • Variance is never negative.

      方差永远不会为负。

    If all values of a data set are the same, the standard deviation is zero

    如果数据集的所有值都相同,则标准偏差为零

    When analyzing normally distributed data, standard deviation can be used in combination with the mean in order to calculate data intervals.

    在分析正态分布的数据时,可以将标准差与平均值结合使用以计算数据间隔。

    If x bar = mean, SD = standard deviation and x = a value in the data set, then

    如果x bar =平均值,SD =标准偏差,x =数据集中的值,则

    • 68% of the data lie in the interval: mean — SD < x < mean + SD

      68%的数据位于间隔中:均值-SD <x <均值+ SD
    • 95% of the data lie in the interval: mean — 2SD< x <mean + 2SD

      95%的数据位于间隔中:均值-2SD <x <平均值+ 2SD
    • 99% of the data lie in the interval: mean — 3SD < x < mean + 3SD

      99%的数据位于间隔中:均值— 3SD <x <均值+ 3SD

    标准偏差法 (Standard Deviation Method)

    If we know that the distribution of data we have follows a Normal distribution then we can use standard deviation method to handle outliers.Gaussian distribution is also commonly called the “normal distribution” and is often described as a “bell-shaped curve” is one of the methods to handle outliers.

    如果我们知道数据的分布遵循正态分布,则可以使用标准差方法来处理离群值。 高斯分布通常也称为“正态分布”,通常被描述为“钟形曲线”,是处理离群值的方法之一。

    The nature of the Gaussian gives a probability of 0.683 of being within one standard deviation of the mean i.e. within one standard deviation of the mean will cover 68% of the data.

    高斯的性质给出0.683的概率在平均值的一个标准偏差内,即,在平均值的一个标准偏差内将覆盖68%的数据。

    Consider, we have mean of 30 and the standard deviation is 4, then all data in the datasets between 26 and 34 will account for about 68% of the data sample. We can cover more of the data sample if we expand the range as follows:

    考虑,我们的平均值为30,标准差为4,则数据集中26至34之间的所有数据将占数据样本的约68%。 如果我们扩大范围如下,我们可以涵盖更多的数据样本:

    1 Standard Deviation from the Mean: 68%2 Standard Deviations from the Mean: 95%3 Standard Deviations from the Mean: 99.7%4 Standard Deviations from the Mean: 99.9%

    1与均值的标准差:68%2与均值的标准差:95%3与均值的标准差:99.7%4与均值的标准差:99.9%

    如何使用Python实现 (How to implement using Python)

    # calculate mean & standard deviation
    data_mean = np.mean(data)
    data_std = np.std(data)
    # identifying outliers
    cut_off = data_std * 3 # We are considering 3SD away..please refer optional section if you have any doubts.
    lower = data_mean — cut_off
    upper = data_mean + cut_off

    We can then identify outliers as those examples that fall outside of the defined lower and upper limits.

    然后,我们可以将异常值标识为超出定义的上下限的那些示例。

    outliers = [x for x in data if x < lower or x > upper]
    actual_data = [x for x in data if x >= lower and x <= upper]

    四分位间距法(IQR) (Interquartile Range Method (IQR))

    All data points in real-world are not normally distributed. The interquartile range is a measure of where the “middle fifty” is in a data set.Where a range is a measure of where the beginning and end are in a set, an interquartile range is a measure of where the bulk of the values lie.

    现实世界中的所有数据点都不是正态分布的。 四分位数范围是对数据集中“中间五十”位置的度量。四分位数范围是对数据集中开始和结束位置的度量,四分位数范围是对大部分值所在的度量。

    In Simple words, the IQR is the first quartile subtracted from the third quartileFormulae :

    用简单的话来说,IQR是从第三个四分位数公式中减去的第一个四分位数:

    IQR = Q3 − Q1Where, Q3 is 75th percentile & Q1 is 25th percentile

    IQR = Q3 − Q1其中,Q3为第75个百分位,而Q1为第25个百分位

    The IQR can be used to identify outliers by defining limits on the sample values that are a factor k of the IQR below the 25th percentile or above the 75th percentile.The common value for the factor k is the value 1.5.

    通过定义样本值的限制,IQR可以用于识别异常值,这些样本值是IQR的因子k低于25%或高于75%百分数。因子k的通用值为1.5。

    A factor k of 3 or more can be used to identify values that are extreme outliers or “far outs” when described in the context of box and whisker plots.On a box and whisker plot, these limits are drawn as fences on the whiskers (or the lines) that are drawn from the box. Values that fall outside of these values are drawn as dots

    的因子k 3个或更多可被用于识别当的上下文和晶须plots.On一个盒须图描述是极端异常值或“远奏”,这些限制被绘制为在该晶须围栏值(或线条)。 超出这些值的值将被绘制为点

    在Python中计算百分位数的方法?(Ways to calculate percentiles in python?)

    • Describe function in python Dataframe.

      描述python Dataframe中的函数。
    • Percentile function in numpy.

      numpy中的百分位数函数。
    • Box / ViolenPlot.

      盒子/ ViolenPlot。

    示例箱图数据集 (Example Box plot dataset)

    Image for post

    如何使用笔和纸计算(How to calculate it using pen&paper)

    # Put the numbers in order.
    1, 2, 5, 6, 7, 9, 12, 15, 18, 19, 27
    # Find the median.
    1, 2, 5, 6, 7, 9, 12, 15, 18, 19, 27
    # Place parentheses around the numbers above and below the median.
    (1, 2, 5, 6, 7), 9, (12, 15, 18, 19, 27)
    # Find Q1 and Q3. Think of Q1 as a median in the lower half of the data and think of Q3 as a median for the upper half of data.
    (1, 2, 5, 6, 7), 9, ( 12, 15, 18, 19, 27). Q1 = 5 and Q3 = 18
    # Subtract Q1 from Q3 to find the interquartile range.
    18–5 = 13.

    What if I Have an Even Set of Numbers?

    如果我有偶数集怎么办?

    # Put the numbers in order.
    3, 5, 7, 8, 9, 11, 15, 16, 20, 21
    # Make a mark in the center of the data.
    3, 5, 7, 8, 9, | 11, 15, 16, 20, 21
    # Place parentheses around the numbers above and below the mark you made in Step 2–it makes Q1 and Q3 easier to spot.
    (3, 5, 7, 8, 9), | (11, 15, 16, 20, 21)
    # Find Q1 and Q3
    (3, 5, 7, 8, 9), | (11, 15, 16, 20, 21). Q1 = 7 and Q3 = 16.
    # Subtract Q1 from Q3.
    16–7 = 9

    自动异常值检测 (Automatic Outlier Detection)

    Image for post

    外部链接:(External Links:)

    翻译自: https://medium.com/@dhirajmishra57/handling-outliers-in-datasets-3740b04b52a2

    数据预处理异常值处理

    展开全文
  • 数据挖掘:数据处理-异常值处理

    千次阅读 2020-04-22 20:31:42
    数据挖掘:数据处理-异常值处理 1,什么是异常值?    异常值即是样本数据中的离群点,将那些明显与其他样本不同的数据视为异常值。异常值虽然数量较少,但是对于模型(对异常值敏感的模型)的影响很大,所以必须...

    1,什么是异常值?
       异常值即是样本数据中的离群点,将那些明显与其他样本不同的数据视为异常值。异常值虽然数量较少,但是对于模型(对异常值敏感的模型)的影响很大,所以必须对异常值进行处理。

    在这里插入图片描述

    2,异常值的来源
       异常值的来源主要分为人为误差和自然误差,具体来说包括以下几类:数据输入错误、测量误差、实验误差、故意异常值、数据处理错误、抽样错误、自然异常值。总而言之,在数据处理的任何环节都有可能产生异常值。

    3,异常值识别
       最常用的检测异常值的方法是可视化,从可视化结果中发现离群点,从而发现异常值,具体可以使用各种可视化方法,如Box plot,Histogram,Scatter Plot。同时也还可通过统计学的方法识别异常值:
    (1)简单统计分析:对属性值进行一个描述性的统计,从而查看哪些值是不合理的。比如对年龄这个属性进行规约:年龄的区间在[0:200],如果样本中的年龄值不在该区间范围内,则表示该样本的年龄属性属于异常值。
    (2)小于5%或大于95%的任何值都可以被认为是异常值,这种判定方法是比较粗糙的。
    (3)3δ原则:根据正态分布的定义可知,距离平均值3δ之外的概率为 P(|x-μ|>3δ) <= 0.003 ,这属于极小概率事件,在默认情况下我们可以认定,距离超过平均值3δ的样本是不存在的。因此,当样本距离平均值大于3δ,则认定该样本为异常值。当数据不服从正态分布,可以通过远离平均距离多少倍的标准差来判定,多少倍的取值需要根据经验和实际情况来决定。
    (4)箱线图分析:箱线图(Boxplot)也称箱须图(Box-whisker Plot),是利用数据中的五个统计量:最小值、第一四分位数、中位数、第三四分位数与最大值来描述数据的一种方法,它也可以粗略地看出数据是否具有有对称性,分布的分散程度等信息。箱线图识别异常点的具体方法如下:首先计算出第一四分位数(Q1)、中位数、第三四分位数(Q3)。中位数我们都知道,就是将一组数字按从小到大的顺序排序后,处于中间位置(也就是50%位置)的数字。 同理,第一四分位数、第三四分位数是按从小到大的顺序排序后,处于25%、75%的数字。令 IQR=Q3−Q1,那么 Q3+1.5(IQR) 和 Q1−1.5(IQR) 之间的值就是可接受范围内的数值,这两个值之外的数认为是异常值。在Q3+1.5IQR(四分位距)和Q1-1.5IQR处画两条与中位线一样的线段,这两条线段为异常值截断点,称其为内限;在Q3+3IQR和Q1-3IQR处画两条线段,称其为外限。 处于内限以外位置的点表示的数据都是异常值,其中在内限与外限之间的异常值为温和的异常值(mild outliers),在外限以外的为极端的异常值的异常值(extreme outliers)。箱型图选取异常值比较客观,在识别异常值方面有一定的优越性。

    箱线图

    4,异常值处理
       异常值的处理方法类似于缺失值处理方法:
    (1)删除:删除含有异常值的样本。
    (2)视为缺失值:将异常值视为缺失值,使用缺失值处理方法来处理。
    (3)单独处理:如果有大量异常值,应该在统计模型中单独对待它们。 其中一个方法是将异常数据视为单独的一组,为两组样本分别建立模型,然后组合输出。

    参考:
    https://blog.csdn.net/jyxmust/article/details/80659324

    展开全文
  • 安然数据集——回归和异常值处理 以下代码是在python 3.6下运行。 安然事件造成有史以来最大的公司破产。在2000年度,安然是美国最大的能源公司,然而被揭露舞弊后,它在一年内就破产了。 我们之所以选择使用安然...


    机器学习——回归和异常值处理(安然数据集)

    以下代码是在python 3.6下运行。

    安然事件造成有史以来最大的公司破产。在2000年度,安然是美国最大的能源公司,然而被揭露舞弊后,它在一年内就破产了。

    我们之所以选择使用安然事件的数据集来做机器学习的项目,是因为我们已经有安然的电子邮件数据库,它包含150名前安然员工之间的50万封电子邮件,主要是高级管理人员。这也是唯一的大型公共的真实邮件数据库。

    感兴趣的可以看一下安然的纪录片,也是非常令人唏嘘的一部经典纪录片:【纪录片】安然:房间里最聪明的人
    或者阅读安然事件文章

    关于安然数据集的分析可参考上一篇文章:
    安然数据集分析

    根据年龄和工资回归

    #!/usr/bin/python
    
    import random
    import numpy
    import matplotlib.pyplot as plt
    import pickle
    
    from outlier_cleaner import outlierCleaner
    
    
    #python2_to_python3
    class StrToBytes:  
        def __init__(self, fileobj):  
            self.fileobj = fileobj  
        def read(self, size):  
            return self.fileobj.read(size).encode()  
        def readline(self, size=-1):  
            return self.fileobj.readline(size).encode()
    
    
    ### load up some practice data with outliers in it
    ages = pickle.load( StrToBytes(open("practice_outliers_ages.pkl", "r")))
    net_worths = pickle.load( StrToBytes(open("practice_outliers_net_worths.pkl", "r")) )
    
    
    
    ### ages and net_worths need to be reshaped into 2D numpy arrays
    ### second argument of reshape command is a tuple of integers: (n_rows, n_columns)
    ### by convention, n_rows is the number of data points
    ### and n_columns is the number of features
    ages       = numpy.reshape( numpy.array(ages), (len(ages), 1))
    net_worths = numpy.reshape( numpy.array(net_worths), (len(net_worths), 1))
    #from sklearn.cross_validation import train_test_split
    
    from sklearn.model_selection import train_test_split
    ages_train, ages_test, net_worths_train, net_worths_test = train_test_split(ages, net_worths, test_size=0.1, random_state=42)
    
    ### fill in a regression here!  Name the regression object reg so that
    ### the plotting code below works, and you can see what your regression looks like
    
    
    
    
    from sklearn.linear_model import LinearRegression
    
    reg = LinearRegression()
    reg.fit(ages_train, net_worths_train)
    
    print("scope: ", reg.coef_)
    print("intercept: ", reg.intercept_)
    print("train score: ", reg.score(ages_train, net_worths_train))
    print("test score: ", reg.score(ages_test, net_worths_test))
    
    try:
        plt.plot(ages, reg.predict(ages), color="blue")
    except NameError:
        pass
    plt.scatter(ages, net_worths)
    plt.show()
    

    在这里插入图片描述

    scope: [[5.07793064]]
    intercept: [25.21002155]
    train score: 0.4898725961751499
    test score: 0.8782624703664671

    此时斜率是5.07,训练集的R-平方值是0.4898,测试集的R-平方值是0.878

    删除年龄和工资中的异常值

    在outlier_cleaner.py中定义异常值清除函数outlierCleaner(),清楚10%的异常值

    #!/usr/bin/python
    
    import math
    
    def outlierCleaner(predictions, ages, net_worths):
        """
            Clean away the 10% of points that have the largest
            residual errors (difference between the prediction
            and the actual net worth).
    
            Return a list of tuples named cleaned_data where 
            each tuple is of the form (age, net_worth, error).
        """
        
        cleaned_data = []
    
        ### your code goes here
    
        errors = abs(predictions - net_worths)
        cleaned_data = zip(ages, net_worths, errors)
        cleaned_data = sorted(cleaned_data, key=lambda clean:clean[2])
        clean_num = int(math.ceil(len(cleaned_data)*0.9))
        cleaned_data = cleaned_data[:clean_num]
        
    
        print('data length: ',len(ages))
        print('cleaned_data length: ',len(cleaned_data))
        return cleaned_data
    

    调用异常值清除函数outlierCleaner(),讲清除后的数据重新回归拟合

    import outlier_cleaner
    
    cleaned_data = outlierCleaner(reg.predict(ages_train), ages_train, net_worths_train)
    
    ages_train_new, net_worths_train_new, e = zip(*cleaned_data)
    
    ages_train_new       = numpy.reshape( numpy.array(ages_train_new), (len(ages_train_new), 1))
    net_worths_train_new = numpy.reshape( numpy.array(net_worths_train_new), (len(net_worths_train_new), 1))
    
    reg.fit(ages_train_new, net_worths_train_new)
    
    
    
    print("scope_removal: ", reg.coef_)
    print("intercept_removal: ", reg.intercept_)
    print("train score_removal: ", reg.score(ages_train_new, net_worths_train_new))
    print("test score_removal: ", reg.score(ages_test, net_worths_test))
    
    try:
        plt.plot(ages_train_new, reg.predict(ages_train_new), color="blue")
    except NameError:
        pass
    plt.scatter(ages_train_new, net_worths_train_new)
    plt.show()
    

    在这里插入图片描述

    scope_removal: [[6.36859481]]
    intercept_removal: [-6.91861069]
    train score_removal: 0.9513734907601892
    test score_removal: 0.9831894553955322

    删除异常之后,斜率是6.369,训练集的R-平方值是0.95,测试集的R-平方值是0.98,效果明显的好很多了。

    根据工资和奖金处理数据集

    主要是根据安然数据集中的工资和奖金进行处理,来判断此数据集中是否有异常值。

    import pickle
    import sys
    import matplotlib.pyplot
    sys.path.append("../tools/")
    from feature_format import featureFormat, targetFeatureSplit
    
    #python2 to python3
    class StrToBytes:  
        def __init__(self, fileobj):  
            self.fileobj = fileobj  
        def read(self, size):  
            return self.fileobj.read(size).encode()  
        def readline(self, size=-1):  
            return self.fileobj.readline(size).encode()
    
    ### read in data dictionary, convert to numpy array
    data_dict = pickle.load( StrToBytes(open("../final_project/final_project_dataset.pkl", "r") ))
    features = ["salary", "bonus"]
    
    
    data = featureFormat(data_dict, features)
    

    可视化工资和奖金数据集

    for point in data:
        salary = point[0]
        bonus = point[1]
        matplotlib.pyplot.scatter( salary, bonus )
    
    matplotlib.pyplot.xlabel("salary")
    matplotlib.pyplot.ylabel("bonus")
    matplotlib.pyplot.show()
    

    在这里插入图片描述
    很明显,右上角的那一数据点与其他点差距太大,是异常值。

    找出工资和奖金的异常值

    max_value = sorted(data, reverse=True, key=lambda sal:sal[0])[0]
    print('the max_value is: ', max_value)
    
    for i in data_dict:
        if data_dict[i]['salary'] == max_value[0]:
            print('Who is the max_value is: ',i)
    

    the max_value is: [26704229. 97343619.]
    Who is the max_value is: TOTAL

    删除异常值后重新可视化工资和奖金数据

    data_dict.pop( 'TOTAL', 0 )
    data = featureFormat(data_dict, features)
    
    for point in data:
        salary = point[0]
        bonus = point[1]
        matplotlib.pyplot.scatter( salary, bonus )
    
    matplotlib.pyplot.xlabel("salary")
    matplotlib.pyplot.ylabel("bonus")
    matplotlib.pyplot.show()
    

    在这里插入图片描述

    我们认为还有 4 个异常值需要调查;让我们举例来看。两人获得了至少 5 百万美元的奖金,以及超过 1 百万美元的工资;换句话说,他们就像是强盗。

    和这些点相关的名字是什么?

    for i in data_dict:
        if data_dict[i]['salary'] != 'NaN' and data_dict[i]['bonus'] != 'NaN':
            if data_dict[i]['salary'] > 1e6 and data_dict[i]['bonus'] > 5e6:
                print(i)
    

    LAY KENNETH L
    SKILLING JEFFREY K

    你认为这两个异常值应该并清除,还是留下来作为一个数据点? 留下来,它是有效的数据点 清除掉,它是一个电子表格怪癖 清除掉,它是一个错误?

    这两个异常数据当天不能删除,事实表明他们两个非法拿到了很多钱,是司法的重点研究对象

    展开全文
  • 数据处理之异常值处理

    千次阅读 2021-03-17 19:52:39
    异常值是指那些在数据集中存在的不...如果忽视这些异常值,在某些建模场景下就会导致结论的错误(如线性回归模型、K均值聚类等),所以在数据的探索过程中,有必要识别出这些异常值处理好它们。 异常值检测 简单统
  • 数据挖掘:数据清洗——异常值处理 一、离群点是什么? 离群点,是一个数据对象,它显著不同于其他数据对象,与其他数据分布有较为显著的不同。有时也称非离群点为“正常数据”,离群点为“异常数据”。 离群点跟...
  • 数据分析--异常值处理

    千次阅读 2020-10-04 18:19:35
    1 什么是异常值? 模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些在这些性质上表现完全与整体样本不一致的点,我们就称其为异常点 异常点在某些场景下极为...
  • 数据预处理_异常值处理

    千次阅读 2020-04-12 18:45:53
    2.异常值处理,先是辨别出哪些是异常值,再根据实际情况选择如何处理异常值。 伪异常,比如由于特定业务运营而产生的; 真异常,并非业务运营而产生的,是客观反映数据本身存在异常的分布。 3.异常值分析 3σ...
  • 4异常值处理 4.1导读 数据预处理过程中,异常值的处理也相当重要。例如,一批数据中,11 号被试是高中二年级学生,但年龄为 33 岁,显然这个数据比较异常,很可能干扰实际结果,理论上高中二年级学生的平均年龄为 16...
  • 数据处理异常值分析、处理

    千次阅读 2018-07-30 21:52:41
    异常值的分析方法 1、简单统计量分析 做一个描述性统计,进而查看哪些数据不合理。最常用的是最大值和最小值,如年龄的最大值199,则存在异常。 2、3σ原则 针对服从正态分布的数据, 3、箱形图分析(R语言)...
  • Python数据预处理--异常值处理

    千次阅读 2020-05-15 07:43:04
    异常值处理异常值分析3σ原则创建数据、计算均值和标准差、筛选异常值绘制数据密度曲线利用散点图绘制出数据和异常值箱型图分析, 较准确箱型图看数据分布情况计算基本统计量和分位差计算异常值条数图表表达 ...
  • 数据处理-利用 python进行异常值分析

    千次阅读 2019-07-06 14:17:18
    异常值分析是检验数据是否有录入错误数据和不合常理的数据。不加剔除的把异常值代入数据分析过程中,会对结果产生不良影响,而对异常值的分析其原因,常常成为为发现问题的而改进决策的契机。 异常值是指样本中的...
  • 数据分析学习总结笔记04:异常值处理1 异常值概述2 如何判断异常值2.1 简单的统计分析2.2 3δ原则2.3 四分位数检验/箱型图分析2.4 格拉布斯检验2.5 基于模型检测2.6 基于距离检测2.7 基于密度检测3 如何处理异常值 ...
  • 数据预处理之异常值处理

    千次阅读 2018-07-27 14:49:00
    通常,我们倾向于在构建模型时忽略异常值,这不是一个明智的做法, 异常值使数据偏移并降低准确性,在此让我们进一步了解异常处理。 什么样的值是异常值异常值是分析师和数据科学家常用的术语,因为它需要密切...
  • 基于Python的异常值处理汇总

    千次阅读 2020-07-23 14:28:46
    背景: 不论是在机器/深度学习还是普通的业务场景的描述性统计分析等,我们首先要做...本篇幅主要列举了本人遇到的一些异常值处理方法,如有更好的,欢迎指正! 1. 如何发现异常值异常值的方法想法有很多种,基于
  • R语言数据异常值处理

    千次阅读 2019-11-03 08:47:23
    异常值简单来说就是偏离数据集整体的值。在统计学意义上,如果一个值偏离整体,那么就会影响其正态分布,进而影响需要以正态分布为前提的统计模型(如线性回归、方差分析)的结果准确度。 ###检验异常值的方法 ####...
  • 数据处理--缺失值处理&异常值处理

    万次阅读 2018-08-12 16:29:21
    缺失值处理: 造成数据缺失的原因是多方面的,主要可能有以下几种: 有些信息暂时无法获取,致使一部分属性值空缺出来。 有些信息因为一些人为因素而丢失了。 有些对象的某个或某些属性是不可用的。如一个未婚者...
  • 数据异常值的鉴定和处理(1)

    千次阅读 2020-12-14 22:23:00
    数据预处理中最不想碰到但又绕不过的一个问题是异常样品的鉴定和处理异常样本,也称为离群样本,其定义是与其它样本有显着差异的样本。通常是由实验操作失败、样本受损等不易发现的外部因素引起,比...
  • 数据分析之异常值检测与处理

    千次阅读 多人点赞 2020-03-20 15:10:22
    (一)什么是异常值? 在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体...
  • 异常值是什么?什么原因导致异常值。找出和剔除异常值的方法介绍
  • R语言︱异常值检验、离群点分析、异常值处理

    万次阅读 多人点赞 2016-04-21 20:25:28
    异常值处理一般分为以下几个步骤:异常值检测、异常值筛选、异常值处理。 其中异常值检测的方法主要有:箱型图、简单统计量(比如观察极值) 异常值处理方法主要有:删除法、插补法、替换法。 提到异常值不得不说...
  • 缺失值处理完毕后,我们还需要进行异常值处理。异常值是指明显偏离大多数抽样数据的数值,比如...由于本文采用的样本总体GermanCredit已经进行了数据预处理,即已经做了缺失值和异常值处理,因此,我们以随机产生的样
  • 异常值产生的原因 数据输入错误 测量误差 实验误差 故意异常值 数据处理错误 抽样错误 ...使用封顶法,任何超出5%或95%的...异常值处理方法 类似缺失值的处理 删除观察。 适用人为异常值 变换合并值:比如log变换...
  • 在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些...
  • 数据清洗中异常值如何处理(下)

    千次阅读 2019-03-25 17:47:07
    数据清洗工作中面对的对象有三个——异常值,缺失值和重复值。而每个肮脏数据都是有各自的清洗方法,尤其是异常值的方法是最多的。由此可见,数据中的异常值是有很多的,在上一篇文章中我们给大家介绍了关于清洗异常...
  • 3、双变量分析)》机器学习实战-数据探索(缺失值处理) 上面两篇文章介绍了数据探索的前四步,机器学习更多内容可以关注github项目:machine learning 通常,我们倾向于在构建模型时忽略异常值,这不是一个明智...
  • 机器学习中的异常值检测和处理

    万次阅读 2019-02-03 15:08:53
    1 什么是异常值? 在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本...
  • 去噪/异常值处理

    千次阅读 2018-04-11 22:52:45
    异常值对模型的影响有时是比较显著地,去掉噪声/异常值有利于提升训练结果。关键是定义什么是异常值/噪声,以及如何去掉他。通过业务理解分析去除噪声.异常值检测:异常点检测,采用异常点检测算法对样本进行分析:...
  • 关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 详细内容为 《R语言游戏数据分析与挖掘》第五章学习笔记之数据清洗 setwd('H:\\程志伟\\R语言游戏数据分析与... # 5.2.1 缺失值处理 > # 导入玩家的玩...
  • 阅读之前看这里????:博主是正在学习数据分析的一员,博客记录的是在学习过程中一些总结,也希望和大家一起进步,在记录之时,未免存在很多...实际上,最佳做法是在进行下一步分析之前,就应该进行异常值去除处理。在某

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 204,768
精华内容 81,907
关键字:

数据集异常值处理