机器学习之异常点检测
1.iForest(独立森林)算法
样本数据过大时推荐采用这种异常值检测方法
原理分析:iForest森林也由大量的树组成。iForest中的树叫isolation tree,简称iTree。iTree树和决策树不太一样,其构建过程也比决策树简单,因为其中就是一个完全随机的过程。具体实施过程如下:第一、假设共有N条数据,构建一颗iTree时,从N条数据中均匀抽样(一般是无放回抽样)出ψ个样本出来,作为这颗树的训练样本。在样本中,随机选一个特征,并在这个特征的所有值范围内(最小值与最大值之间)随机选一个值,对样本进行二叉划分,将样本中小于该值的划分到节点的左边,大于等于该值的划分到节点的右边。这样得到了一个分裂条件和左、右两边的数据集,然后分别在左右两边的数据集上重复上面的过程,直接达到终止条件。终止条件有两个,一个是数据本身不可再分(只包括一个样本,或者全部样本相同),另外一个是树的高度达到log2(ψ)。不同于决策树,iTree在算法里面已经限制了树的高度。当然不限制也可以,只是算法为了效率考虑,只需要达到log2(ψ)深度即可。
第二、把所有的iTree树构建好了,就可以对测试数据进行预测了。预测的过程就是把测试数据在iTree树上沿对应的条件分支往下走,直到达到叶子节点,并记录这过程中经过的路径长度h(x),即从根节点,穿过中间的节点,最后到达叶子节点,所走过的边的数量(path length)。最后,将h(x)带入(具体公式参考https://www.cnblogs.com/pinard/p/9314198.html),计算每条待测数据的异常分数(Anomaly Score)如果分数越接近1,其是异常点的可能性越高;如果分数都比0.5要小,那么基本可以确定为正常数据;如果所有分数都在0.5附近,那么数据不包含明显的异常样本。
在sklearn中的使用:
算法基本上不需要配置参数就可以直接使用,通常就以下几个(参数明显比随机森林简单):
n_estimators: 默认为100,配置iTree树的多少
max_samples: 默认为265,配置采样大小
max_features: 默认为全部特征,对高维数据,可以只选取部分特征
from sklearn.ensemble import IsolationForest
ilf=IsolationForest()
ilf.fit(X)
s=ilf.predict(X)
返回的是只包含-1和1元素的数组,-1代表可能为异常值的点
2.异常点检测常用算法OneClassSVM
在样本数据较少时建议采用这种异常值检测方法
它是无监督学习的方法,这里只讲解一种特别的思路SVDD, 对于SVDD来说,我们期望所有不是异常的样本都是正类别,同时它采用一个超球体而不是一个超平面来做划分,该算法在特征空间中获得数据周围的球形边界,期望最小化这个超球体的体积,从而最小化异常点数据的影响。可以判断新的数据点z是否在类内,如果z到中心的距离小于或者等于半径r,则不是异常点,如果在超球体以外,则是异常点。在sklearn中的用法
from sklearn.svm import OneClassSVM
classer=OneClassSVM()
classer.fit(X)
yHat=classer.predict(X)
print(yHat)
注意:由于其是非监督学习方法,所以不用传入类别列表。返回数据和iForest一样是只包含1,-1的列表,-1代表可能是异常点,X是训练样本。检测完后的数据筛选