异常检测算法:Isolation Forest

news/2024/7/7 19:37:32

iForest (Isolation Forest)是由Liu et al. [1] 提出来的基于二叉树的ensemble异常检测算法,具有效果好、训练快(线性复杂度)等特点。

1. 前言

iForest为聚类算法,不需要标记数据训练。首先给出几个定义:

  • 划分(partition)指样本空间一分为二,相当于决策树中节点分裂;
  • isolation指将某个样本点与其他样本点区分开。

iForest的基本思想非常简单:完成异常点的isolation所需的划分数大于正常样本点(非异常)。如下图所示:

399159-20170809220532464-1204439901.png

\(x_i\)样本点的isolation需要大概12次划分,而异常点\(x_0\)指需要4次左右。因此,我们可以根据划分次数来区分是否为异常点。但是,如何建模呢?我们容易想到:划分对应于决策树中节点分裂,那么划分次数即为从决策树的根节点到叶子节点所经历的边数,称之为路径长度(path length)。假设样本集合共有\(n\)个样本点,对于二叉查找树(Binary Search Tree, BST),则查找失败的平均路径长度为
\[ c(n) = 2H(n-1) -(2(n-1)/n) \]
其中,\(H(i)\)为harmonic number,可估计为\(\ln (i) + 0.5772156649\)。那么,可建模anomaly score:

\[ s(x,n) = 2^{-\frac{E(h(x))}{c(n)}} \]

其中,\(h(x)\)为样本点\(x\)的路径长度,\(E(h(x))\)为iForest的多棵树中样本点\(x\)的路径长度的期望。特别地,

399159-20170809220544839-380213602.png

\(s\)值越高(接近于1),则表明该点越可能为异常点。若所有的样本点的\(s\)值都在0.5左右,则说明该样本集合没有异常点。

2. 详解

iForest采用二叉决策树来划分样本空间,每一次划分都是随机选取一个属性值来做,具体流程如下:
399159-20170809220558699-1531874726.png

停止分裂条件:

  • 树达到了最大高度;
  • 落在孩子节点的样本数只有一个,或者所有样本点的值均相同;

为了避免错检(swamping)与漏检(masking),在训练每棵树的时候,为了更好地区分,不会拿全量样本,而会sub-sampling样本集合。iForest的训练流程如下:

399159-20170809220609636-293635641.png

sklearn给出了iForest与其他异常检测算法的比较。

3. 参考资料

[1] Liu, Fei Tony, Kai Ming Ting, and Zhi-Hua Zhou. "Isolation forest." Data Mining, 2008. ICDM'08. Eighth IEEE International Conference on. IEEE, 2008.

转载于:https://www.cnblogs.com/en-heng/p/7327946.html


http://lihuaxi.xjx100.cn/news/250374.html

相关文章

电子学会青少年编程等级考试Python二级题目解析04

Python二级题目解析 1、题目 下列代码的执行结果是?( )【2020.12】 s1 "abcde" s2 "fgh" s3 s1 s2 s3[4:7]A. efgB. efghC. defD. defg 2、讲解 关注:青少年编程竞赛交流公众号 3、答案 标准答案&am…

循环for语句 if语句

if语句&#xff1a; if(表达式){ 代码 }else if(表达式){ 代码 } for循环&#xff1a; for(var i0; i<10; i){ alert(1); (弹窗&#xff09; } if语句&#xff1a; if(表达式){ 代码 }else if(表达式){ 代码 } for循环&#xff1a; for(var i0; i<10; i){ alert(1); (弹窗…

SQL:EXISTS的用法理解(转)

摘自&#xff1a;http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHERE EXISTS( SELECT OrderID FROM Orders o WHERE o.CustomerIDc.CustomerID) 这里面的EXISTS…

keras Regressor 回归

import numpy as np np.random.seed(1337) # for reproducibility from keras.models import Sequential from keras.layers import Dense import matplotlib.pyplot as plt # 可视化模块import tensorflow as tf import keras.backend.tensorflow_backend as KTF# create som…

centos下安装apache + subversion(转)

目录&#xff1a; 一.安装apr跟apr-util 二.安装apache服务器 三. 安装subversion 四. 配置subversion 五. 配置apache的httpd.conf 六. 验证安装 七.导入数据到资料库八.版本库服务器的同步&#xff08;新加入的&#xff09; 附&#xff1a;安装过程中遇到的问题 一.安装apr、…

BootStrap 模态框禁用空白处点击关闭

转自&#xff08;http://www.cnblogs.com/DayDreamEveryWhere/p/4550320.html&#xff09; 模态框为信息编辑窗口,涉及好多内容,填了半天,若一不小心点了空白处..... $(#myModal).modal({backdrop: static, keyboard: false}); backdrop:static时,空白处不关闭. keyboard:false…

全国中小学信息技术创新与实践大赛:Coding创意编程赛道

“全国中小学信息技术创新与实践大赛”是一项运用信息技术&#xff0c;培养广大师生的创新精神和实践能力&#xff0c;面向青少年学生开展人工智能科学普及、引领科技创新的素质教育实践平台&#xff0c;简称NOC大赛&#xff08;NOC为Novelty, Originality, Creativity的缩写&a…

#pragma once与#ifndef

在C/C中&#xff0c;在使用预编译指令#include的时候&#xff0c;为了防止重复引用造成二义性的两种方法。 #ifndef 它不光可以保证同一份文件不会被包含两次&#xff0c;也能够保证不同文件完全相同的内容不会被包含两次。但&#xff0c;同样的&#xff0c;如果自定义的宏名不…