异常值检验

异常点检测的目的是找到数据集中和大多数数据不同的数据,常用的异常点检测算法一般分为三类。

  第一类是基于统计学的方法来处理异常数据,这种方法一般会构建一个概率分布模型,并计算对象符合该模型的概率,把具有低概率的对象视为异常点。比如特征工程中的RobustScaler方法,在做数据特征值缩放的时候,它会利用数据特征的分位数分布,将数据根据分位数划分为多段,只取中间段来做缩放,比如只取25%分位数到75%分位数的数据做缩放,这样减少了异常数据的影响。

  第二类是基于聚类的方法来做异常点检测。这个很好理解,由于大部分聚类算法是基于数据特征的分布来做的,通常我们聚类后发现某些聚类簇的数据样本量比其他簇少很多,而且这个簇里的数据特征均值分布之类的值和其他簇也差异很大,这些簇里的样本点大部分时候都是异常点。比如BIRCH聚类算法原理和DBSCAN密度聚类算法都可以在聚类的同时做异常点的检测。

  第三类是基于专门的异常点检测算法来做。这些算法不像聚类算法,检测异常点只是一个赠品,他们的目的就是专门检测异常点的,这类算法的代表是One Class SVM 和Isolation Forest。

  第一类代表方法有箱形图与3sigma原则,倾向于一维数据。运用3sigma原则时,需要保证数据符合正态分布或近似正态分布。在这个过程中运用的方法大致可分为两类,检验正态性与数据转化。正态性检验包括频率或频数直方图、QQ图、t检验等,kaggle等比赛中常用的数据转化有box_cox。

  Box-Cox变换是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。在做线性回归的过程中,不可观测的误差可能是和预测变量相关,于是给线性回归的最小二乘法估计系数的结果带来误差,为了解决这样的方差齐性问题,所以考虑对相应因变量做Box-Cox变换,变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。

正态性检验

    def draw_distribute1(self,data):
        fig = plt.figure(figsize = (10,6))
        ax2 = fig.add_subplot(2,1,2)  # 创建子图2
        data.hist(bins=30,alpha = 0.5,ax = ax2)
        data.plot(kind = 'kde', secondary_y=True,ax = ax2)
        plt.title("%s库存比频数直方图"%(self.comp[0]))
        plt.savefig(r'%s\%s2.png'%(root,self.comp[0]), bbox_inches='tight')
        plt.grid()
        plt.show()
        # 绘制直方图
        # 呈现较明显的正太性
    def draw_distribute3(self,data):
        sm.qqplot(data.values,line='s')
        plt.title("%s库存比转化QQ图"%(self.comp[0]))
        #stats.probplot(data.values, dist="norm", plot=plt)
        plt.savefig(r'%s\%s1.png'%(root,self.comp[0]), bbox_inches='tight')
        plt.show()
##BOX_COX转化       
x = stats.boxcox(new_data['RATIO'].values,stats.boxcox_normmax(new_data['RATIO'].values))
df = pd.DataFrame(data)
df.plot.box(title="hua tu")
plt.grid(linestyle="--", alpha=0.3)
plt.show()

  

原文地址:https://www.cnblogs.com/xxupup/p/13274129.html