异常检测 | 使用孤立森林 sklearn.ensemble.IsolationForest 分析异常流量

摘要:
与随机森林类似,都是高效的集成算法,相较于LOF,K-means等传统算法,该算法鲁棒性高且对数据集的分布无假设。
孤立森林

Isolation Forest(sklearn.ensemble.IsolationForest):一种适用于连续数据无监督异常检测方法。与随机森林类似,都是高效的集成算法,相较于LOF,K-means等传统算法,该算法鲁棒性高且对数据集的分布无假设。

Isolation Forest算法做非监督式的异常点检测分析,对数据特征的要求宽松:

  • 该算法对特征的要求低,不需要做离散化,不需要数值标准化

  • 不需要考虑特征间的关系(例如共线性)等,不需要额外做特征过滤和筛选

附:SKlearn 中其他用于异常检测的方法

  • one-class SVM(svm.OneClassSVM)

  • LocalOutlierFactor(sklearn.neighbors.LocalOutlierFactor)

  • EllipticEnvelope(covariance.EllipticEnvelope)

本案例中

需求:分析一下通过不同渠道来到网站的访客里面是否有异常流量

数据特点:(综合数据特点,选择Isolation Forest算法做非监督式的异常点检测分析

数据是不带标记的数据,只能用无监督式分析方法

特征维度较高,有的特征是分类型变量,有的特征是数值型变量

代码示例

1 数据预处理

1.1 填充缺失值、去除无关项(如 用户id,可能影响结果)

【此处,处理好的数据集是df

不是主要代码,略

异常检测 | 使用孤立森林 sklearn.ensemble.IsolationForest 分析异常流量第1张

1.2 将 分类特征 转换为 数值型

【此处,处理好的数据集是feature_merge

方法请移步https://www.cnblogs.com/ykit/p/12440945.html

2 异常诊断

2.1 异常点检测

from sklearn.ensemble importIsolationForest

#创建模型,n_estimators:int,可选(默认值= 100),集合中的基本估计量的数量
model_isof = IsolationForest(n_estimators=20)
#计算有无异常的标签分布
outlier_label = model_isof.fit_predict(feature_merge)

得到 array 类型的 标签数据

异常检测 | 使用孤立森林 sklearn.ensemble.IsolationForest 分析异常流量第2张

2.2 异常结果汇总

#将array 类型的标签数据转成 DataFrame
outlier_pd = pd.DataFrame(outlier_label, columns=['outlier_label'])

#将标签数据与原来的数据合并
data_merge = pd.concat((df, outlier_pd), axis=1)

查看一下异常流量和正常流量的数量

异常检测 | 使用孤立森林 sklearn.ensemble.IsolationForest 分析异常流量第3张

2.3 统计每个渠道的异常情况

#创建用于返回数据集的函数
defcal_sample(df):
    return df.groupby(['source'], as_index=False)['visitNumber'].count().sort_values(['source'], ascending=False)

#取出异常样本
outlier_source = data_merge[data_merge['outlier_label']==-1]
outlier_source_sort =cal_sample(outlier_source)

#取出正常样本
normal_source = data_merge[data_merge['outlier_label']==1]
normal_source_sort = cal_sample(normal_source)

异常检测 | 使用孤立森林 sklearn.ensemble.IsolationForest 分析异常流量第4张

2.4 计算异常比例

#将并异常流量与正常流量为一个 DataFrame
source_merge =pd.merge(outlier_source_sort,
                        normal_source_sort, on='source', how='outer')

#修改列名
source_merge =source_merge.rename(
    columns={'visitNumber_x': 'outlier_count', 'visitNumber_y': 'normal_count'})

#计算异常比例
source_merge['total_count'] = source_merge['outlier_count'] +source_merge['normal_count']
source_merge['outlier_rate'] = source_merge['outlier_count'] /source_merge['total_count']

异常检测 | 使用孤立森林 sklearn.ensemble.IsolationForest 分析异常流量第5张

bingo~

本文仅用于学习

免责声明:文章转载自《异常检测 | 使用孤立森林 sklearn.ensemble.IsolationForest 分析异常流量》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇golang channel 用法总结利用OpenXml生成Word2007文档下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

k-means 算法

1. scikit-learn中的K-Means类     在scikit-learn中,包括两个K-Means的算法,:                 (1)传统的K-Means算法,对应的类是KMeans。            (2)基于采样的Mini Batch K-Means算法,对应的类是MiniBatchKMeans。     一般来说,K...

OpenCV学习笔记(30)KAZE 算法原理与源码分析(四)KAZE特征的性能分析与比较

KAZE系列笔记:1.OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 2.OpenCV学习笔记(28)KAZE 算法原理与源码分析(二)非线性尺度空间构建 3.OpenCV学习笔记(29)KAZE 算法原理与源码分析(三)特征检测与描述 4.OpenCV学习笔记(30)KAZE 算法原理与源码分析(四)KAZE特征的性能分...

从BF算法到kmp算法详解

正文索引 一、KMP介绍 二、例子:子串匹配母串 1.BF算法的解决方法 三、kmp算法的实现 (1)为什么已经有BF算法了还要有KMP算法呢? (2)发明的算法基本思想 (3)具体实现 一、KMP介绍 KMP算法是一种改进的字符串匹配算法(有BF算法改进而来,BF算法是暴利搜索匹配的方式,而KMP则是对BF算法的回溯过程进行改进,从而大幅度降低了时间复...

[转载]注册机破解法的原理以及应对方法

[--- 资料是从免费网站上获取的,上载在这里,只为交流学习目的,文章原作者保留所有权力,如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除。同时本人深表歉意,并致以崇高的谢意!erwin_609#msn.com---] 顾名思义,写注册机来破解软件注册的方法,就是模仿你的注册码生成算法或者逆向注 册码验证算法而写出来的和你一模一样的注册...

机器学习 —— 概率图模型(推理:消息传递算法)

  概率图模型G(V,E)由节点V和边E构成。在之前马尔科夫模型相关的博客中,我谈到马尔科夫模型的本质是当两个人交流后,其意见(两个随机变量)同意0与不同意1的概率组合。而势函数表达的是两个意见相同或者相左的程度。   我们搞的那么麻烦,最后想要得到的不就是每个意见正确与否(随机变量取不同值的概率)吗?与其采用解析的方法去算,去把所有其他的变量边际掉,那干...

使用c语言和GMP库实现伪随机算法笔记

步骤一:安装GMP库,两种方法选其一既可 1.使用源码安装方式: 2.使用在线安装的方式: 步骤二:使用GMP库随机生成一个大数,样本代码如下: 步骤三:使用GMP库随机生成一个大数,并判断生成的大数是不是素数,样本代码如下: 步骤四:根据生成的大素数,产生下一个大素数,样本代码如下: 步骤五:根据随机产生的大素数和随机数,使用BlumBlumShus算...