孤立森林探究

孤立森林

异常的两个特点:异常数据只占很少量,异常数据特征值和正常数据差别很大。

孤立森林,不再是描述正常的样本点,而是要孤立异常点,由周志华教授等人于2008年在第八届IEEE数据挖掘国际会议上提出。

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

在图 ( a ) (a) (a)和图 ( b ) (b) (b)中,可以看到,正常点 x i x_i xi需要更多次的分割才能被孤立,而异常点 x o x_o xo需要较少的分割次数就能被孤立。这里的分割方式采用的是,随机选择一个特征以及拆分的值(这个值位于该特征的最小值和最大值之间)。图 ( c ) (c) (c)展示了异常点的平均路径长度小于正常点的路径长度。

孤立森林(Isolation Forest)

import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.ensemble import IsolationForest

一维特征孤立森林

plt.figure(figsize=(8,6))
a1 = 5*np.random.rand(200) + 25
a2 = 10*np.random.rand(200) + 75
plt.hist(a1)
plt.hist(a2)
plt.show();

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SxwXi5QJ-1602842461118)(output_5_0.png)]

clf_isof = IsolationForest(n_estimators=100,
                          max_samples=200,
                          contamination=0.05,
                          max_features=1,
                          bootstrap=False,
                          n_jobs=2)

x_train = np.hstack([a1,a2,40,41,42]).reshape(-1,1)
clf_isof.fit(x_train)
df_temp = pd.DataFrame()
y_pred_train = clf_isof.predict(x_train)

df_temp['x_train'] = x_train.flatten()
df_temp['predict'] = y_pred_train
display (df_temp[df_temp['predict']==-1])
x_trainpredict
7825.038350-1
9329.980410-1
19029.986068-1
19929.987751-1
21375.239520-1
22084.803419-1
23975.016752-1
24875.323643-1
25684.971489-1
27384.593383-1
29384.987898-1
30084.428831-1
30275.223079-1
30484.886895-1
31484.637187-1
31575.191834-1
34984.409206-1
35084.899408-1
40040.000000-1
40141.000000-1
40242.000000-1
plt.rcParams['xtick.labelsize'] = 10
plt.rcParams['ytick.labelsize'] = 10
plt.figure(figsize=(8,6))

df_after_ok = df_temp[df_temp['predict']==1]
plt.scatter(df_after_ok['x_train'],[1]*len(df_after_ok),c='green')
df_after_nok = df_temp[df_temp['predict']==-1]
plt.scatter(df_after_nok['x_train'],[1]*len(df_after_nok),c='red')
plt.show();

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1oaMdbH4-1602842461123)(output_7_0.png)]

二维特征孤立森林

plt.figure(figsize=(8,6))
df1 = pd.DataFrame(np.random.normal(0,1,(200,2)))
display (df1.head())
plt.scatter(df1[0],df1[1],c='green')
plt.show()
01
0-0.115543-1.533842
10.7709550.633411
2-1.3007840.453213
31.564788-0.652716
40.4779091.460001

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qL3j8BTN-1602842461128)(output_9_1.png)]

clf_isof = IsolationForest(n_estimators=100,
                          max_samples=200,
                          contamination=0.05,
                          max_features=2,
                          bootstrap=False,
                          n_jobs=2)

x_train = df1
clf_isof.fit(x_train)
df_temp = pd.DataFrame()
y_pred_train = clf_isof.predict(x_train)

# df_temp['x_train'] = x_train.flatten()
df1['predict'] = y_pred_train
display (df1[df1['predict']==-1])
01predict
14-2.1352641.688260-1
341.428155-2.271243-1
61-0.020421-2.974580-1
78-0.899695-3.043032-1
82-1.8072342.248468-1
104-2.432991-0.286251-1
1142.2094620.152440-1
125-0.698056-2.247866-1
1452.2359771.122833-1
148-2.0733141.010237-1
plt.figure(figsize=(8,6))
df_after_ok = df1[df1['predict']==1]
plt.scatter(df_after_ok[0],df_after_ok[1],c='green')
df_after_nok = df1[df1['predict']==-1]
plt.scatter(df_after_nok[0],df_after_nok[1],c='red')
plt.show();

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MUhnoUEh-1602842461133)(output_11_0.png)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值