精华内容
下载资源
问答
  • python 异常值检测

    千次阅读 2019-05-07 13:55:23
    利用图形检测和输出异常值的方法–箱线图法。 箱线图法 箱线图实际就是利用数据的分位数识别其中的异常点,其特征如下图所示: 下四分位数:25%分位点所对应的值(Q1) 中位数:50%分位点对应的值(Q2) 上...

    python数据清洗-异常点识别与检测

    利用图形检测和输出异常值的方法–箱线图法。

    箱线图法

    箱线图实际就是利用数据的分位数识别其中的异常点,其特征如下图所示:
    在这里插入图片描述
    下四分位数:25%分位点所对应的值(Q1)
    中位数:50%分位点对应的值(Q2)
    上四分位数:75%分位点所对应的值(Q3)

    上须:Q3+1.5(Q3-Q1)
    下须:Q1-1.5(Q3-Q1)
    其中Q3-Q1表示四分位差

    判断标准: 变量的数据值大于箱线图上须或者小于箱线图的下须,就可以认为这样的数据点为异常值点

    在这里插入图片描述在python中可使用matplotlib模块实现箱线图的制作,下面以1700-2009年太阳黑子数量为数据依据,利用箱线图法识别数据中的异常点。具体代码如下:

    # -*- coding:utf-8 -*-
    #异常值检测
    import pandas as pd
    import matplotlib.pyplot as plt
    
    sunspots = pd.read_csv('C:\Users\\19047\Desktop\heizi.csv')
    
    #绘制箱线图
    plt.boxplot(x = sunspots.counts,
                whis = 1.5,#1.5倍的四分位差
                widths = 0.7,
                patch_artist = True,#填充箱体颜色
                showmeans= True,# 显示均值
                boxprops = {'facecolor':"steelblue"},#箱体填充色
                flierprops = {'markerfacecolor':'red','markeredgecolor':'red','markersize':4},#异常点填充色、边框、大小
                meanprops = {'marker':'D','markerfacecolor':'black','marksize':4},#均值点标记符号、填充色、大小
                medianprops = {'linestyle':'--','color':'orange'},#中位数处的标记符号、填充色、大小
                labels = [''])
    plt.show()
    
    # 计算上下四分位数
    Q1 = sunspots.counts.quantile(q = 0.25)
    Q3 = sunspots.counts.quantile(q = 0.75)
    
    #异常值判断标准, 1.5倍的四分位差 计算上下须对应的值
    low_quantile = Q1 - 1.5*(Q3-Q1)
    high_quantile = Q3 + 1.5*(Q3-Q1)
    
    # 输出异常值
    value = sunspots.counts[(sunspots.counts > high_quantile) | (sunspots.counts < low_quantile)]
    
    print value

    在这里插入图片描述
    如上图所示,利用matplotlib子模块pyplot中的boxplot函数可以非常方便地绘制箱线图,从图中可知,数据集中至少存在5个异常点,它们均在上须之上,其中数据索引和值输出为;

    在这里插入图片描述

    展开全文
  • python异常值检测

    千次阅读 2020-04-01 12:56:55
    Anomaly Detection异常检测 What are Outliers ? Statistical Methods for Univariate Data Using Gaussian Mixture Models Fitting an elliptic envelope Isolation Forest Local Outlier Factor Using clustering...

    Anomaly Detection异常检测

    • What are Outliers ?
    • Statistical Methods for Univariate Data
    • Using Gaussian Mixture Models
    • Fitting an elliptic envelope
    • Isolation Forest
    • Local Outlier Factor
    • Using clustering method like DBSCAN
    • 什么是离群值?
    • 单变量数据的统计方法
    • 使用高斯混合模型
    • 安装椭圆形信封
    • 隔离森林
    • 局部离群因子
    • 使用DBSCAN之类的聚类方法

    Outliers离群值

    • New data which doesn’t belong to general trend (or distribution) of entire data are known as outliers.
    • Data belonging to general trend are known as inliners.
    • Learning models are impacted by presence of outliers.
    • Anomaly detection is another use of outlier detection in which we find out unusual behaviour.
    • Data which were detected outliers can be deleted from complete dataset.
    • Outliers can also be marked before using them in learning methods
    • 不属于整个数据的总体趋势(或分布)的新数据称为异常值。
    • 属于大趋势的数据称为线性。
    • 学习模型会受到异常值的影响。
    • 异常检测是异常检测的另一种用途,在异常检测中我们可以发现异常行为。
    • 可以从完整数据集中删除检测到的异常值的数据。
    • 在学习方法中使用异常值之前,也可以对其进行标记

    Statistical Methods for Univariate Data单变量数据的统计方法

    • Using Standard Deviation Method - zscore
    • Using Interquartile Range Method - IRQ
    • 使用标准偏差方法-zscore
    • 使用四分位间距法-IRQ

    Using Standard Deviation Method使用标准偏差法

    • If univariate data follows Gaussian Distribution, we can use standard deviation to figure out where our data lies
    • 如果单变量数据遵循高斯分布,我们可以使用标准差来找出数据所在的位置
    import numpy as np
    data = np.random.normal(size=1000)
    
    • Adding More Outliers
    data[-5:] = [3.5,3.6,4,3.56,4.2]
    
    from scipy.stats import zscore
    
    • Detecting Outliers
    data[np.abs(zscore(data)) > 3]
    
    array([3.05605991, 3.5       , 3.6       , 4.        , 3.56      ,
           4.2       ])
    

    Using Interquartile Range使用四分位间距

    • For univariate data not following Gaussian Distribution IQR is a way to detect outliers
    • 对于不遵循高斯分布的单变量数据,IQR是检测异常值的一种方法
    from scipy.stats import iqr
    
    data = np.random.normal(size=1000)
    data[-5:]=[-2,9,11,-3,-21]
    iqr_value = iqr(data)
    lower_threshold = np.percentile(data,25) - iqr_value*1.5
    upper_threshold = np.percentile(data,75) + iqr_value*1.5
    
    print(upper_threshold)
    print(lower_threshold)
    
    2.743958884560146
    -2.7240836639852306
    
    data[np.where(data < lower_threshold)]
    
    array([ -3.15722416,  -2.72563369,  -2.84349424,  -3.        ,
           -21.        ])
    
    data[np.where(data > upper_threshold)]
    
    array([ 2.83383323,  2.7536317 ,  2.98728378,  2.7889204 ,  9.        ,
           11.        ])
    

    Using Gaussian Mixture Models使用高斯混合模型

    • Data might contain more than one peaks in the distribution of data.
    • Trying to fit such multi-model data with unimodel won’t give a good fit.
    • GMM allows to fit such multi-model data.
    • Configuration involves number of components in data, n_components.
    • covariance_type controls the shape of cluster
      • full : cluster will be modeled to eclipse in arbitrary dir
      • sperical : cluster will be spherical like kmeans
      • diag : cluster will be aligned to axis
    • We will see how GMM can be used to find outliers
    • 数据分布中可能包含多个峰。
    • 试图用unimodel拟合这样的多模型数据不会很合适。
    • GMM允许拟合此类多模型数据。
    • 配置涉及数据中的组件数n_components。
    • covariance_type控制簇的形状
      • full:集群将被建模为在任意目录中蚀
      • sperical:簇将像kmeans一样呈球形
      • diag:群集将与轴对齐
    • 我们将了解如何使用GMM查找异常值
    # Number of samples per component
    n_samples = 500
    
    # Generate random sample, two components
    np.random.seed(0)
    C = np.array([[0., -0.1], [1.7, .4]])
    C2 = np.array([[1., -0.1], [2.7, .2]])
    #X = np.r_[np.dot(np.random.randn(n_samples, 2), C)]
              #.7 * np.random.randn(n_samples, 2) + np.array([-6, 3])]
    X = np.r_[np.dot(np.random.randn(n_samples, 2), C),np.dot(np.random.randn(n_samples, 2), C2)]
    
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    X[-5:] = [[4,-1],[4.1,-1.1],[3.9,-1],[4.0,-1.2],[4.0,-1.3]]
    plt.scatter(X[:,0], X[:,1],s=5)
    

    在这里插入图片描述

    from sklearn.mixture import GaussianMixture
    gmm = GaussianMixture(n_components=3)
    gmm.fit(X)
    pred = gmm.predict(X)
    pred[:50]
    plt.scatter(X[:,0], X[:,1],s=10,c=pred)
    

    在这里插入图片描述

    Fitting Elliptical Envelope拟合椭圆形信封

    • The assumption here is, regular data comes from known distribution ( Gaussion distribution )
    • Inliner location & variance will be calculated using Mahalanobis distances which is less impacted by outliers.
    • Calculate robust covariance fit of the data.
    • 这里的假设是,常规数据来自已知分布(高斯分布)
    • 内衬位置和方差将使用“马哈拉诺比斯距离”来计算,该值不受异常值的影响较小。
    • 计算数据的鲁棒协方差拟合。
    from sklearn.datasets import make_blobs
    X,_ = make_blobs(n_features=2, centers=2, cluster_std=2.5, n_samples=1000)
    plt.scatter(X[:,0], X[:,1],s=10)
    

    在这里插入图片描述

    from sklearn.covariance import EllipticEnvelope
    ev = EllipticEnvelope(contamination=.1)
    ev.fit(X)
    cluster = ev.predict(X)
    plt.scatter(X[:,0], X[:,1],s=10,c=cluster)
    

    在这里插入图片描述

    Isolation Forest隔离森林

    • Based on RandomForest
    • Useful in detecting outliers in high dimension datasets.
    • This algorithm randomly selects a feature & splits further.
    • Random partitioning produces shorter part for anomolies.
    • When a forest of random trees collectively produce shorter path lengths for particular samples, they are highly likely to be anomalies.
    • 基于RandomForest
    • 在检测高维数据集中的异常值时很有用。
    • 此算法随机选择一个特征并进一步分割。
    • 随机分区产生的部分更短。
    • 当随机树木的森林为特定样本共同产生较短的路径长度时,很可能是异常情况。
    rng = np.random.RandomState(42)
    
    # Generate train data
    X = 0.3 * rng.randn(100, 2)
    X_train = np.r_[X + 2, X - 2]
    # Generate some regular novel observations
    X = 0.3 * rng.randn(20, 2)
    X_test = np.r_[X + 2, X - 2]
    # Generate some abnormal novel observations
    X_outliers = rng.uniform(low=-4, high=4, size=(20, 2))
    
    from sklearn.ensemble import IsolationForest
    data = np.r_[X_train,X_test,X_outliers]
    iso = IsolationForest(behaviour='new', contamination='auto')
    iso.fit(data)
    pred = iso.predict(data)
    
    plt.scatter(data[:,0], data[:,1],s=10,c=pred)
    

    在这里插入图片描述

    Local Outlier Factor局部离群因子

    • Based on nearest neighbours
    • Suited for moderately high dimension datasets
    • LOF computes a score reflecting degree of abnormility of a data.
    • LOF Calculation
      • Local density is calculated from k-nearest neighbors.
      • LOF of each data is equal to the ratio of the average local density of his k-nearest neighbors, and its own local density.
      • An abnormal data is expected to have smaller local density.
    • LOF tells you not only how outlier the data is but how outlier is it with respect to all data
    • 基于最近的邻居
    • 适用于中等高维数据集
    • LOF计算反映数据异常程度的分数。
    • LOF计算
      -从k最近邻居计算局部密度。
      -每个数据的LOF等于他的k个最近邻居的平均局部密度与其自身局部密度之比。
      -异常数据的局部密度较小。
    • LOF不仅告诉您数据的异常值,而且还告诉您所有数据的异常值
    from sklearn.neighbors import LocalOutlierFactor
    lof = LocalOutlierFactor(n_neighbors=25,contamination=.1)
    pred = lof.fit_predict(data)
    s = np.abs(lof.negative_outlier_factor_)
    
    plt.scatter(data[:,0], data[:,1],s=s*10,c=pred)
    

    在这里插入图片描述

    Outlier Detection using DBSCAN使用DBSCAN进行异常值检测

    • DBSCAN is a clustering method based on density
    • Groups data which are closer to each other.
    • Doesn’t use distance vector calculation method
    • Data not close enough to any cluster is not assigned any cluster & these can be anomalies
    • eps controls the degree of considering a data part of cluster
    • DBSCAN是基于密度的聚类方法
    • 将彼此接近的数据分组。
    • 不使用距离矢量计算方法
    • 没有足够接近任何集群的数据没有被分配任何集群,这些可能是异常的
    • eps控制考虑集群数据部分的程度
    from sklearn.cluster import DBSCAN
    dbscan = DBSCAN(eps=.3)
    dbscan.fit(data)
    plt.scatter(data[:,0], data[:,1],s=s*10,c=dbscan.labels_)
    

    在这里插入图片描述

    展开全文
  • 一、概况两大异常novelty detection这些训练数据没有被异常值所污染,我们有兴趣在新的观测中发现异常。outlier detection训练数据中包含异常值,和我们需要合适的训练数据中心模式忽略的越轨的意见。机器学习(无...

    一、概况

    两大异常

    novelty detection

    这些训练数据没有被异常值所污染,我们有兴趣在新的观测中发现异常。

    outlier detection

    训练数据中包含异常值,和我们需要合适的训练数据中心模式忽略的越轨的意见。

    机器学习(无监督学习)

    学习:estimator.fit(X_train)

    预测:estimator.predict(X_test),异常值为-1

    二、novelty detection

    22500b4edf60

    Paste_Image.png

    以下为建模代码:

    import numpy as np

    from sklearn import svm

    xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))

    # Generate train data 生成训练数据

    X = 0.3 * np.random.randn(100, 2)

    X_train = np.r_[X + 2, X - 2]

    # Generate some regular novel observations 生成一些常规的新奇观察

    X = 0.3 * np.random.randn(20, 2)

    X_test = np.r_[X + 2, X - 2]

    # Generate some abnormal novel observations 产生一些异常新颖的观察

    X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))

    # fit the model 模型学习

    clf = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.1)

    clf.fit(X_train)

    y_pred_train = clf.predict(X_train)

    y_pred_test = clf.predict(X_test)

    y_pred_outliers = clf.predict(X_outliers)

    n_error_train = y_pred_train[y_pred_train == -1].size

    n_error_test = y_pred_test[y_pred_test == -1].size

    n_error_outliers = y_pred_outliers[y_pred_outliers == 1].size

    三、Outlier Detection

    covariance.EmpiricalCovariance算法

    在高斯分布数据上显示具有马氏距离的协方差估计的示例。

    22500b4edf60

    Paste_Image.png

    以下为建模代码:

    import numpy as np

    from sklearn.covariance import EmpiricalCovariance, MinCovDet

    n_samples = 125

    n_outliers = 25

    n_features = 2

    # generate data 生成数据

    gen_cov = np.eye(n_features)

    gen_cov[0, 0] = 2.

    X = np.dot(np.random.randn(n_samples, n_features), gen_cov)

    # add some outliers 添加一些异常值

    outliers_cov = np.eye(n_features)

    outliers_cov[np.arange(1, n_features), np.arange(1, n_features)] = 7.

    X[-n_outliers:] = np.dot(np.random.randn(n_outliers, n_features),outliers_cov)

    # fit a Minimum Covariance Determinant (MCD) robust estimator to data

    # 拟合最小协方差行列式(MCD)对数据的鲁棒估计

    robust_cov = MinCovDet().fit(X)

    # compare estimators learnt from the full data set with true parameters

    # 比较估计器从完整的数据集和真实参数的学习

    emp_cov = EmpiricalCovariance().fit(X)

    # Computes the squared Mahalanobis distances of given observations.

    # 计算给定观测值的平方Mahalanobis距离。

    Y = emp_cov.mahalanobis(X)

    ensemble.IsolationForest算法

    在高维数据集中执行异常值检测的一种有效方法是使用随机森林

    neighbors.LocalOutlierFactor(LOF)算法

    对中等高维数据集执行异常值检测的另一种有效方法是使用局部离群因子(LOF)算法。

    结合以上四种异常检测方法建模比较:

    sklearn.svm(支持向量机)

    sklearn.covariance.EllipticEnvelope(高斯分布的协方差估计)

    sklearn.ensemble.IsolationForest(随机森林)

    sklearn.neighbors.LocalOutlierFactor(LOF)

    22500b4edf60

    Paste_Image.png

    import numpy as np

    from scipy import stats

    from sklearn import svm

    from sklearn.covariance import EllipticEnvelope

    from sklearn.ensemble import IsolationForest

    from sklearn.neighbors import LocalOutlierFactor

    #随机数发生器

    rng = np.random.RandomState(42)

    # Example settings 示例设置

    n_samples = 200

    outliers_fraction = 0.25

    clusters_separation = [0, 1, 2]

    # define two outlier detection tools to be compared 定义两个异常的检测工具进行比较

    classifiers = {

    "One-Class SVM": svm.OneClassSVM(nu=0.95 * outliers_fraction + 0.05,

    kernel="rbf", gamma=0.1),

    "Robust covariance": EllipticEnvelope(contamination=outliers_fraction),

    "Isolation Forest": IsolationForest(max_samples=n_samples,

    contamination=outliers_fraction,

    random_state=rng),

    "Local Outlier Factor": LocalOutlierFactor.LocalOutlierFactor(n_neighbors = 35,

    contamination=outliers_fraction)

    }

    # Compare given classifiers under given settings 比较给定设置下的分类器

    xx, yy = np.meshgrid(np.linspace(-7, 7, 100), np.linspace(-7, 7, 100))

    n_inliers = int((1. - outliers_fraction) * n_samples)

    n_outliers = int(outliers_fraction * n_samples)

    ground_truth = np.ones(n_samples, dtype=int)

    ground_truth[-n_outliers:] = -1

    # Fit the problem with varying cluster separation 将不同的集群分离拟合

    for i, offset in enumerate(clusters_separation):

    np.random.seed(42)

    # Data generation 生成数据

    X1 = 0.3 * np.random.randn(n_inliers // 2, 2) - offset

    X2 = 0.3 * np.random.randn(n_inliers // 2, 2) + offset

    X = np.r_[X1, X2]

    # Add outliers 添加异常值

    X = np.r_[X, np.random.uniform(low=-6, high=6, size=(n_outliers, 2))]

    # Fit the model 模型拟合

    for i, (clf_name, clf) in enumerate(classifiers.items()):

    # fit the data and tag outliers 拟合数据和标签离群值

    if clf_name == "Local Outlier Factor":

    y_pred = clf.fit_predict(X)

    scores_pred = clf.negative_outlier_factor_

    else:

    clf.fit(X)

    scores_pred = clf.decision_function(X)

    y_pred = clf.predict(X)

    threshold = stats.scoreatpercentile(scores_pred,

    100 * outliers_fraction)

    n_errors = (y_pred != ground_truth).sum()

    print(scores_pred)

    if clf_name == "Local Outlier Factor":

    # decision_function is private for LOF 决策函数是LOF的私有函数

    Z = clf._decision_function(np.c_[xx.ravel(), yy.ravel()])

    else:

    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])

    Z = Z.reshape(xx.shape)

    print(Z)

    展开全文
  • Python实战】单变量异常值检测异常值检测是数据预处理阶段重要的环节,这篇文章介绍下对于单变量异常值检测的常用方法,通过Python代码实现。一、什么是异常值异常值是在数据集中与其他观察值有很大差距的数据点,...

    【Python实战】单变量异常值检测

    异常值检测是数据预处理阶段重要的环节,这篇文章介绍下对于单变量异常值检测的常用方法,通过Python代码实现。

    一、什么是异常值

    异常值是在数据集中与其他观察值有很大差距的数据点,它的存在,会对随后的计算结果产生不适当的影响,因此检测异常值并加以适当的处理是十分必要的。

    二、异常值的处理

    异常值并不都是坏的,了解这一点非常重要。只是简单地从数据中删除异常值,而不考虑它们如何影响结果的话,可能会导致灾难。

    “异常值不一定是坏事。这些只是与其他模式不一致的观察。但事实上异常值非常有趣。例如,如果在生物实验中,某只老鼠没有死亡而其他老鼠都死了,去了解为什么将会非常有趣。这可能会带来新的科学发现。因此,检测异常值非常重要。” —— Pierre Lafaye de Micheaux,统计师

    对于异常值,一般有如下几种处理:

    删除含有异常值的记录(是否删除根据实际情况考虑)

    将异常值视为缺失值,利用缺失值的处理方法进行处理

    平均值修正(前后两个观测值的平均值)

    不处理(直接在具有异常值的数据集上进行挖掘)

    三、异常值的类型

    异常值有两种类型:单变量和多变量(Univariate and Multivariate)。单变量异常值是仅由一个变量中的极值组成的数据点,而多变量异常值是至少两个变量的组合异常分数。假设您有三个不同的变量 - X,Y,Z。如果您在三维空间中绘制这些变量的图形,它们应该形成一种云。位于此云之外的所有数据点都将是多变量异常值。

    举个例子:做客户分析,发现客户的年平均收入是80万美元。但是,有两个客户的年收入是4美元和420万美元。这两个客户的年收入明显不同于其他人,那这两个观察结果将被视为异常值,并且是单变量异常值,当我们看到单变量的分布时,可以找到这些异常值。

    再举个例子:身高和体重之间的关系。我们对“身高”和“体重”有单变量和双变量分布,如下图所示。

    loading.gif

    看箱线图(box plot后面会介绍)没有任何异常值,再看散点图(scatter plot),有两个值在一个特定的身高和体重的平均值以下。可见多变量异常值是n维空间中的异常值,必须通过多维度的分布才能体现出来。

    如果对异常值不太了解,可以阅读这篇《数据探索指南》,上述部分解释也是从中摘录的。

    下面,我主要记录下单变量异常值检测的Python实现。

    四、常用异常检测方法

    原则上模拟数据集需要样本量足够大,这里仅是演示算法,所以就手动写了有限的样本。

    异常值的测量标准有很多,比较常见的是描述性统计法、三西格玛法(3σ法)、箱线图等:

    1. 描述性统计

    基于常识或经验,假定我们认为大于10的数值是不符合常理的。

    下面用Python代码实现用描述性统计求异常值:

    # -*- coding: utf-8 -*-

    data = [2.78, 1.79, 4.73, 3.81, 2.78, 1.80, 4.81, 2.79, 1.78, 3.32, 10.8, 100.0]

    threshold = 10

    # 定义描述性统计识别异常值函数

    def descriptive_statistics(data):

    return list(filter(lambda x: x > threshold, data))

    outliers = descriptive_statistics(data)

    print('异常值共有:{0}个,分别是:{1}'.format(len(outliers), outliers))

    # 输出:异常值共有:2个,分别是:[10.8, 100.0]

    2. 三西格玛(3σ)

    当数据服从正态分布时,99%的数值应该位于距离均值3个标准差之内的距离,P(|x−μ|>3σ)≤0.003,当数值超出这个距离,可以认为它是异常值。

    正态分布状况下,数值分布表:

    数值分布

    在数据中的占比

    (μ-σ,μ+σ)

    0.6827

    (μ-2σ,μ+2σ)

    0.9545

    (μ-3σ,μ+3σ)

    0.9973

    注:在正态分布中σ代表标准差,μ代表均值,x=μ为图形的对称轴

    下面用Python代码实现用三西格玛求异常值:

    # -*- coding: utf-8 -*-

    import pandas as pd

    import numpy as np

    data = [2.78, 1.79, 4.73, 3.81, 2.78, 1.80, 4.81, 2.79, 1.78, 3.32, 10.8, 100.0]

    # 定义3σ法则识别异常值函数

    def three_sigma(data_series):

    rule = (data_series.mean() - 3 * data_series.std() > data_series) | (data_series.mean() + 3 * data_series.std() < data_series)

    index = np.arange(data_series.shape[0])[rule]

    outliers = data_series.iloc[index]

    return outliers.tolist()

    data_series = pd.Series(data)

    outliers = three_sigma(data_series)

    print('异常值共有:{0}个,分别是:{1}'.format(len(outliers), outliers))

    # 输出:异常值共有:1个,分别是:[100.0]

    3. 箱线图(box plot)

    和3σ原则相比,箱线图依据实际数据绘制,真实、直观地表现出了数据分布的本来面貌,且没有对数据作任何限制性要求(3σ原则要求数据服从正态分布或近似服从正态分布)。

    其判断异常值的标准以四分位数和四分位距为基础。四分位数给出了数据分布的中心、散布和形状的某种指示,具有一定的鲁棒性,即25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值通常不能对这个标准施加影响。鉴于此,箱线图识别异常值的结果比较客观,因此在识别异常值方面具有一定的优越性。

    箱线图提供了识别异常值的一个标准,即:

    上界 = Q3 + 1.5IQR

    下界 = Q1 - 1.5IQR

    小于下界或大于上界的值即为异常值。

    其中,

    Q3称为上四分位数(75%),表示全部观察值中只有四分之一的数据取值比它大;

    Q1称为下四分位数(25%),表示全部观察值中只有四分之一的数据取值比它小;

    IQR称为四分位数差,这里就是 Q3-Q1;

    1.5其实是个参数λ,这个参数通常取1.5(类似于正态分布中的μ±λ)

    文字描述可能比较绕,下面用图片来解释下。

    loading.gif

    第一四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。

    第二四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。

    第三四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。

    Q3与Q1的差距又称四分位距(InterQuartile Range,IQR)。

    下面用Python代码实现用箱线图求异常值:

    # -*- coding: utf-8 -*-

    import pandas as pd

    data = [2.78, 1.79, 4.73, 3.81, 2.78, 1.80, 4.81, 2.79, 1.78, 3.32, 10.8, 100.0]

    # 定义箱线图识别异常值函数

    def box_plot(data_series):

    q_abnormal_low = data_series.quantile(0.25) - 1.5 * (data_series.quantile(0.75) - data_series.quantile(0.25))

    q_abnormal_up = data_series.quantile(0.75) + 1.5 * (data_series.quantile(0.75) - data_series.quantile(0.25))

    index = (data_series < q_abnormal_low) | (data_series > q_abnormal_up)

    outliers = data_series.loc[index]

    return outliers.tolist()

    sorted_data = sorted(data)

    data_series = pd.Series(sorted_data)

    outliers = box_plot(data_series)

    print('异常值共有:{0}个,分别是:{1}'.format(len(outliers), outliers))

    # 输出:异常值共有:2个,分别是:[10.8, 100.0]

    五、总结

    以上是最基础的几种单变量异常值检测方法,没有最好的,只有对当前数据场景最合适的。

    后期如果涉及机器学习的数据预处理,我会继续学习和研究多变量异常值的检测,相信会有更有意思的一些算法等着我去学习。

    展开全文
  • 作者: eavea 发表日期: 2020年04月14日 分类: 后端技术标签: Python , 数据处理阅读次数: 6,076评论数: 0 条【Python实战】单变量异常值检测异常值检测是数据预处理阶段重要的环节,这篇文章介绍下对于单变量异常值...
  • Python实战】单变量异常值检测异常值检测是数据预处理阶段重要的环节,这篇文章介绍下对于单变量异常值检测的常用方法,通过Python代码实现。一、什么是异常值异常值是在数据集中与其他观察值有很大差距的数据点,...
  • 原标题:Python数据分析基础: 异常值检测和处理1 什么是异常值?在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种...
  • 前言异常值是指样本中的个别值,也称为离群点,其数值明显偏离其余的观测值。常用检测方法3σ原则和箱型图。其中,3σ原则只适用服从正态分布的数据。在3σ原则下,异常值被定义为观察值和平均值的偏差超过3倍标准差...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 489
精华内容 195
关键字:

python异常值检测

python 订阅