异常检测-高维数据-datawhale-task5


集成是⼦空间思想中常⽤的⽅法之⼀,可以有效提⾼数据挖掘算法精度。集成⽅法将多个算法或多个基
检测器的输出结合起来。其基本思想是⼀些算法在某些⼦集上表现很好,⼀些算法在其他⼦集上表现很
好,然后集成起来使得输出更加鲁棒。集成⽅法与基于⼦空间⽅法有着天然的相似性,⼦空间与不同的
点集相关,而集成⽅法使⽤基检测器来探索不同维度的⼦集,将这些基学习器集合起来。

feature bagging

总体思路

feature bagging与分类问题中的随机森林(random forest)很像,先将训练数据随机划分
(每次选取所有样本的(d/2)~(d-1)个特征,d代表特征数),得到多个子训练集,再在每个训练集上训练一个独立的模型(默认为LOF)并最终合并所有的模型结果(如通过平均)。
在这里插入图片描述

分数标准化和组合⽅法

需要将来⾃各种检测器的分数转换成可以有意义的组合的归⼀化值。分数标准化之后,还要选择⼀个组合函数将不同基本检测器的得分进⾏组合,最常⻅的选择包括平均最⼤化组合函数

孤立森林

参考
目前学术界对异常(anomaly detection)的定义有很多种,在孤立森林(iForest)中,异常被定义为“容易被孤立的离群点 (more likely to be separated)”,可以将其理解为分布稀疏且离密度高的群体较远的点。 在特征空间里,分布稀疏的区域表示事件发生在该区域的概率很低,因而可以认为落在这些区域里的数据是异常的。孤立森林是一种适用于连续数据(Continuous numerical data)的无监督异常检测方法,即不需要有标记的样本来训练,但特征需要是连续的。对于如何查找哪些点容易被孤立(isolated),iForest使用了一套非常高效的策略。在孤立森林中,递归地随机分割数据集,直到所有的样本点都是孤立的。在这种随机分割的策略下,异常点通常具有较短的路径。
在这里插入图片描述
上图 x i x_i xi是正常点, x o x_o xo是异常点,很明显的可以看出异常点只需要少数几次分割就被孤立出来了。这里的分割方式采用的是,随机选择一个特征以及拆分的值(这个值位于该特征的最小值和最大值之间)

孤⽴森林根据路径⻓度来估计每个样本点的异常程度。

在孤立森林中,小数据集往往能取得更好的效果。样本数较多会降低孤立森林孤立异常点的能力,因为正常样本会干扰隔离的过程,降低隔离异常的能力。子采样就是在这种情况下被提出的。孤立树的独有特点使得孤立森林能够通过子采样建立局部模型,减小对模型效果的影响。
在这里插入图片描述
在这里插入图片描述

练习

使⽤PyOD库⽣成toy example并调⽤feature bagging

使⽤PyOD库⽣成toy example并调⽤Isolation Forests

# -*- coding: utf-8 -*-
from __future__ import print_function
import os
import sys


from pyod.models.iforest import IForest
from pyod.utils.data import generate_data

from pyod.utils.data import evaluate_print
from pyod.utils.example import visualize


contamination = 0.1  # percentage of outliers
n_train = 200  # number of training points
n_test = 100  # number of testing points

# Generate sample data
X_train, y_train, X_test, y_test = \
    generate_data(n_train=n_train,
                  n_test=n_test,
                  n_features=2,
                  contamination=contamination,
                  random_state=42)

# train IForest detector
clf_name = 'IForest'
clf = IForest()
clf.fit(X_train)

# get the prediction labels and outlier scores of the training data
y_train_pred = clf.labels_  # binary labels (0: inliers, 1: outliers)
y_train_scores = clf.decision_scores_  # raw outlier scores

# get the prediction on the test data
y_test_pred = clf.predict(X_test)  # outlier labels (0 or 1)
y_test_scores = clf.decision_function(X_test)  # outlier scores

# evaluate and print the results
print("\nOn Training Data:")
evaluate_print(clf_name, y_train, y_train_scores)
print("\nOn Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)
# visualize the results
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
          y_test_pred, show_figure=True, save_figure=False)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值