在进行机器学习建模之前,首先要对数据中存在的异常点样本进行过滤,异常点,也叫做离群点,对数据的归一化,以及后续建模的准确性都会造成影响。因此,必须先去除异常点,常用的有以下3种策略

1. 基于统计学的方法

最简单的方法是箱线图的方式,基于百分位数来筛选异常值点。箱线图示例如下

异常点检测算法_数据

其中大于上限和小于下限的点都看做是离群值点。上限和下限的求解公式如下图所示

异常点检测算法_数据分析_02

下四分位数称之为Q1, 上四分卫数称之为Q3, Q1和Q3的差值称之为IOR, 下限的值为Q1-1.5*IQR, 上限的值为Q3+1.5*IOR。这种方法适合在单一维度上识别异常值点。

除了箱体图外,还可以基于总体分来来计算概率的方法,比如基于正态分布,图示如下

异常点检测算法_聚类_03

当取值偏离均值3个标准差的时候,概率较小,认为是异常值点。基于分布算概率的方法要求数据符合特定分布,有一点的局限性。

2. 基于聚类的方法

异常点在聚类中表现为单个聚类簇,明显与正常样本区分开。在聚类时同时考虑了多个维度的信息,更适用高纬度的数据。经典的BIRCH和DBSCAN算法都可以在聚类的同时,来识别异常点。DNSCAN算法中异常点示例如下

异常点检测算法_聚类_04

3. 专用的异常点检测算法

对于异常点检测而言,其本质是一个分类问题,将所有样本划分为正常样本和异常样本两类,但是不同于监督学习中的分类算法,这里的输入数据是没有标签的,所以是一种无监督学习的策略。经典的算法有以下两种

1. one class SVM

2. isolation Forest

one class SVM, 从命名就可以看出,属于SVM家族。和经典的二分类SVM不同,这里采用了超球体来分隔数据,示意如下

异常点检测算法_数据分析_05

isolation Forest, 属于随机森林家族,称之为孤立森林算法,算法过程示意如下

异常点检测算法_聚类_06

第一步是构建多颗独立的决策树,在该算法中每颗决策树所用样本数目不等,分裂时采用随机特征分裂,当只剩一个样本或者深度达到阈值时停止迭代;

第二步计算每颗决策树中样本点的高度平均值,离根节点越近,高度越小,离根节点越远,高度越大;

第三步判断是否为异常点,根据高度值构建一个打分系统,取值范围0-1,靠近1被认为是异常点;

sickit-learn中提供了多种异常点检测算法,上述两种异常点检测算法的用法如下

>>> from sklearn.svm import OneClassSVM
>>> X = [[0], [0.44], [0.45], [0.46], [1]]
>>> clf = OneClassSVM(gamma='auto').fit(X)
>>> clf.predict(X)
array([-1, 1, 1, 1, -1], dtype=int32)
>>>
>>> from sklearn.ensemble import IsolationForest
>>> X = [[-1.1], [0.3], [0.5], [100]]
>>> clf = IsolationForest(random_state=0).fit(X)
>>> clf.predict([[0.1], [0], [90]])
array([ 1, 1, -1])

isolation Forest算法复杂度低,适用于大样本量的数据,但是对于特别高维的数据,算法可靠性会降低,此时可以考虑使用one class SVM。

·end·

异常点检测算法_数据_07

一个只分享干货的

生信公众号