孤立森林(Isolation Forest)

时间:2022-07-24
本文章向大家介绍孤立森林(Isolation Forest),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

最近正好在做孤立森林的项目,写下这篇推文记录下项目进程,也给需要做这个项目的同学一点参考。

1. 什么叫异常点

图中红色的点偏离大部分的数据,可以发现这些点分布稀疏且离密度高的群体较远,这样的点称为异常点。

在统计里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而认为落在该区域中的点是异常点。异常点不一定是有问题的点,但是在各行各业中异常点都是重点关注的对象。

像支付风控中的异常点就有可能存在潜在的风险,比如卡片异常金额交易有可能发生了盗刷,商户异常时间交易有可能在干非法勾当等。

那么我们如何发现这些异常点,常见的有基于统计与数据分布(均值、方差)、箱线图、距离、密度等等,本文所讲的孤立森林是一种无监督的异常值检测算法。

2. 孤立森林算法原理

孤立森林算法类似随机森林。但是不根据信息增益或基尼指数来选择划分属性和节点,属性和节点的选择都是随机的。

在建树的过程中,如果一些样本很快到达了叶子节点,那么就被认为很有可能是异常点。为了减少随机性的影响,通过构造多颗树组成森林,再计算样本在所有树中的平均路径长度来寻找异常点。

3. 算法使用注意事项

1. 最好是连续数据

2. 孤立森林适用于维度(特征变量)不是特别多的数据。由于每次切数据空间都是随机选取一个维度,如果维度特别多,建完树后仍然有大量的维度信息没有被使用,导致算法可靠性降低。

高维空间还可能存在大量噪音维度或无关维度(irrelevant attributes),影响树的构建。对这类数据,建议使用子空间异常检测(Subspace Anomaly Detection)技术。

4. python实现代码

from sklearn.ensemble import IsolationForest  #从sklearn中引入孤立森林模块
clf = IsolationForest(n_estimators = 100, max_samples = 100*2, contamination = 0.1)
clf.fit(X_train)                   #用X_train的数据训练训练器
y_pred_test = clf.predict(X_test)  #预测test数据集中的数据是否异常,1为正常,-1为异常
#y_pred_train = clf.predict(X_train)

代码解析:

clf: 这一行是生成一个训练器,其中各个参数分别代表:

n_estimators: 森林中树的颗数,不是必有项,如缺失默认值为100

max_samples: 在每一颗树中,样本个数或比例,不是必有项,如缺失默认值 为“auto”

contamination: 用户中异常点的比例(0,0.5),不是必有项,如缺失默认值为0.1

max_features: 每颗树中特征个数或比例函数,不是必有项,默认值为1

5.数据模拟

背景介绍: 对于mcc是夜店商户进行数据分析,发现异常交易的夜店

step1:加载数据

import pandas as pd 
import numpy as np 
mcc_yd = pd.read_csv('mcc_yd.csv')

step2:挑选变量

coulmns_yd = [
'avg_tran_amt_30d',
'tran_cnt_m1w_suc_pct_30d',
'tran_cnt_nig_pct_30d',
'cred_pct',
 'tran_cnt_100int_f5_suc_pct_30d'
  ]

step3: 使用孤立森林寻找异常样本点

X_yd = mcc_yd[columns_yd]
clf = IsolationForest(n_estimators = 100, max_samples = 100*2, contamination = 0.005)
clf.fit(X_yd)
y_pred_yd = clf.predict(X_yd)

代码解析:

X_yd: 这一步是生成待入模的特征标签

clf =: 这一步是生成特定参数的训练器,注意里面的参数可以根据自己的数据调整,由于我的样本量有1万4左右,我想先生成70个左右的异常点看看数据情况,所以取contamination为0.005。

clf.fit(X_yd) : 这一步是用X_yd的数据训练训练器

y_pred_yd: 这一步是用训练好的训练器预测X_yd中的数据看是否有异常样本,如果结果为1是正常样本,结果为-1是异常样本

找出来的异常样本发现这批商户大部分没有夜间交易(不符合夜店的交易场景),且单笔交易金额较高,借记卡交易占比较高等异常现象。有可能这些商户存在一些风险,需要在后续交易中重点观测,预防有可能的风险,也说明了孤立森林现实的用处。

本文是本人使用孤立森林后的一些见解,如有不当之处恳请指正。

参考文献:

1. https://www.cnblogs.com/hapyygril/p/98025

88.html

2. https://www.jianshu.com/p/5af3c66e0410