异常值检测

数据处理过程中,通常需要对数据进行预处理,包括缺失值填充,异常值检测等。异常值处理对于后续数据分析,建模具有非常很重要的影响。

基于描述统计

1.基于常识判断

针对数据进行简单的描述统计,查看数据的极大值和极小值。判断数据是否处于合理的范围。进行数据筛选,筛选掉明显不符范围的数据。

2.基于3倍标准差进行筛选

如果数据整体成正态分布,可以根据常识的3σ原则进行异常值筛选。对于标准正态分布来说,(μ-3σ,μ+3σ)之间的面积为99.730020%。统计学中小概率事件为5%,则可以初略的认为处于数据3σ之外的数据为异常数据。不过在具体场景中还需要具体的讨论。


正态分布.jpg(图片来源于网络,侵删)

3.box-cox数据转化+3σ准则

3σ准则假设是数据整体呈正态分布。但是如果数据是有偏数据,则需要转化后再进行筛选,box-cox数据转化在前文已有描述box-cox数据转化。不再赘述。

4.基于四分位进行筛选

我们在进行箱线图描述时,通常都会绘制出上下四分位线以及处于四分位线外的离群点。通常认为位于4分位线外的点为异常值。位于上下四分位外的为异常值。


boxplot.png

基于机器学习的异常值检测方法

1.孤立森林算法

对于孤立森林的个人理解。孤立森林算法是基于决策树的算法。在我们的一堆数据中,如果以散点图的形式,可以将每个点进行分类。对于数据中大多数点来说,大多密集的数据区分要达到的树的深度基本都是相近的,而对于异常点,应该是处于密集点之外的离群点,则区分该数据的深度应该是小于平均的树的深度。以下为我个人数据处理的代码

    def Anomaly_detect(self):
        '''
        :param self:
        :param datamatrix:
        '''
        rng = np.random.RandomState(42)
        clf = IsolationForest(max_samples=len(self.data.columns), random_state=rng, behaviour="new",contamination='auto')
        X_train = np.array(self.data).T
        clf.fit(X_train)
        y_pred = clf.predict(X_train)
        x_left = X_train[y_pred == 1]
        x_sample = []
        for x in range(len(y_pred)):
            if y_pred[x] == 1:
                x_sample.append(self.data.columns[x])
        self.data = pd.DataFrame(x_left.T,columns = x_sample ,index = self.data.index)

最终结果大致如图


IsolationForest.jpg(来源于网络,侵删)

2.one-class svm

未完待续

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容