Datawhale 异常检测学习之Task05----高维度异常检测


前言

本章主要介绍高维数据异常检测的内容,主要包括feature bagging 和孤立森林。这两种方法都属于集成的方法。集成方法就是将多个算法或多个基检测器的输出结合起来。


一、Feature Bagging

1. 基本理论

主要步骤:

  1. 选择基检测器
  2. 分数标准化和组合方法:将来自各种检测器的不同标准的分数转换成可以有意义的组合的归一化值。分数标准化之后,还要选择一个组合函数将不同基本检测器的得分进行组合,最常见的选择包括平均最大化组合函数

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

2. 代码演示

  1. 生成数据如下:
    在这里插入图片描述
    2.预测结果如下:
    蓝色是正常数据点,红色是异常数据点
    点是预测正确的点,星号*是预测错误的点
    在这里插入图片描述
    3.代码如下:
import pyod.utils.data as data
from pyod.models.feature_bagging import FeatureBagging
import matplotlib.pyplot as plt
import numpy as np

x,y= data.generate_data(n_train=100,n_features=2,contamination=0.1,train_only=True,behaviour='new')
xn=[]
xa=[]
for i in range(100):
    if(y[i]==0):
        xn.append(x[i])
    else:
        xa.append(x[i])
xn=np.array(xn)
xa = np.array(xa)
plt.figure()
plt.scatter(xn[:,0],xn[:,1])
plt.scatter(xa[:,0],xa[:,1], color = 'red')
plt.show()

clf = FeatureBagging()
clf.fit(x)
y_pred = clf.labels_

nr_pred = []  #预测正常正确
ar_pred = []  #预测异常正确
ne_pred = []  #预测正常错误
ae_pred = []  #预测异常错误
for i in range(100):
    if(y_pred[i]==0 and y[i]==0):
        nr_pred.append(x[i])
    if(y_pred[i]==1 and y[i]==1):
        ar_pred.append(x[i])
    if(y_pred[i]==0 and y[i]==1):
        ne_pred.append(x[i])
    if y_pred[i]==1 and y[i]==0:
        ae_pred.append(x[i])

ne_pred=np.array(ne_pred).reshape(-1,2)
nr_pred = np.array(nr_pred).reshape(-1,2)
ae_pred = np.array(ae_pred).reshape(-1,2)
ar_pred = np.array(ar_pred).reshape(-1,2)
plt.figure()
plt.scatter(nr_pred[:,0],nr_pred[:,1],marker='.',c='blue')
plt.scatter(ar_pred[:,0],ar_pred[:,1], marker='.',c = 'red')
plt.scatter(ne_pred[:,0],ne_pred[:,1],marker='*',c='blue')
plt.scatter(ae_pred[:,0],ae_pred[:,1], marker='*',c = 'red')
plt.show()

二、Isolation Forest

1. 基本原理

在这里插入图片描述
每次随机地选择一个超平面切分数据,最先被分离出来的,就被认为是异常点。因为切割是随机的,为了结果的可靠性,要用集成(ensemble)的方法来得到一个收敛值。

孤立森林由 t t t 棵孤立的数组成,每棵树都是一个随机二叉树,也就是说对于树中的每个节点,要么有两个孩子节点,要么一个孩子节点都没有。

孤立森林的构造:

  1. 从训练数据中随机选择一个样本子集,放入树的根节点;
  2. 随机指定一个属性,随机产生一个切割点V,即属性A的最大值和最小值之间的某个数;
  3. 根据属性A对每个样本分类,把A小于V的样本放在当前节点的左孩子中,大于等于V的样本放在右孩子中,这样就形成了2个子空间;
  4. 在孩子节点中递归步骤2和3,不断地构造左孩子和右孩子,直到孩子节点中只有一个数据,或树的高度达到了限定高度。

获得t棵树之后,孤立森林的训练就结束,就可以用生成的孤立森林来评估测试数据。

孤立森林采用构造好的所有树的平均结果形成最终结果的。在训练时,每棵树的训练样本是随机抽样的。

异常点的路径比较短,正常点的路径比较长,孤立森林根据路径长度来估计每个样本点的异常程度。

路径长度的计算
在这里插入图片描述
孤立森林不适用于超高维数据,因为鼓励森林每次都是随机选取维度,如果维度过高,则会存在过多噪音。

2. 代码实现

1.生成的数据如下:
在这里插入图片描述
2.检测结果为:
蓝色是正常数据点,红色是异常数据点
点是预测正确的点,星号*是预测错误的点
在这里插入图片描述
3.代码如下:

import pyod.utils.data as data
from pyod.models.iforest import IForest
import matplotlib.pyplot as plt
import numpy as np
'''生成同样example'''
x,y= data.generate_data(n_train=100,n_features=2,contamination=0.1,train_only=True,behaviour='new')
xn=[]
xa=[]
for i in range(100):
    if(y[i]==0):
        xn.append(x[i])
    else:
        xa.append(x[i])
xn=np.array(xn)
xa = np.array(xa)
plt.figure()
plt.scatter(xn[:,0],xn[:,1])
plt.scatter(xa[:,0],xa[:,1], color = 'red')
plt.show()


clf = IForest()
clf.fit(x)
y_pred = clf.labels_
nr_pred = []  #预测正常正确
ar_pred = []  #预测异常正确
ne_pred = []  #预测正常错误
ae_pred = []  #预测异常错误
for i in range(100):
    if(y_pred[i]==0 and y[i]==0):
        nr_pred.append(x[i])
    if(y_pred[i]==1 and y[i]==1):
        ar_pred.append(x[i])
    if(y_pred[i]==0 and y[i]==1):
        ne_pred.append(x[i])
    if y_pred[i]==1 and y[i]==0:
        ae_pred.append(x[i])

ne_pred=np.array(ne_pred).reshape(-1,2)
nr_pred = np.array(nr_pred).reshape(-1,2)
ae_pred = np.array(ae_pred).reshape(-1,2)
ar_pred = np.array(ar_pred).reshape(-1,2)
plt.figure()
plt.scatter(nr_pred[:,0],nr_pred[:,1],marker='.',c='blue')
plt.scatter(ar_pred[:,0],ar_pred[:,1], marker='.',c = 'red')
plt.scatter(ne_pred[:,0],ne_pred[:,1],marker='*',c='blue')
plt.scatter(ae_pred[:,0],ae_pred[:,1], marker='*',c = 'red')
plt.show()


思考

1. feature bagging为什么可以降低方差?

在集成学习中,通常认为Bagging的主要作用是降低方差,而Boosting的主要作用是降低偏差。为什么将多个强学习器组合起来方差就会降低呢?
我们知道Bagging对样本重采样,对每一重采样得到的子样本集训练一个模型,最后取平均。

  1. 另一方面,若各子模型独立,则:
    在这里插入图片描述
    此时可以显著降低variance。
  2. 若各子模型完全相同,则有
    在这里插入图片描述
    此时不会降低variance。
    而 bagging方法得到的各子模型是有一定相关性的,属于上面两个极端状况的中间态,因此可以一定程度降低variance。

2. feature bagging存在哪些缺陷,有什么可以优化的idea ?

要训练多个弱学习器,计算开销大。优化:在随机采样训练若学习器前,对样本训练集进行KNN聚类,筛选明显存在异常值的样本集,再进行弱学习器的训练。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值