主要内容

使用隔离林进行异常检测

隔离森林简介

隔离森林算法[1]通过使用隔离树集合从正常点隔离异常来检测异常。每个隔离树针对训练观察的一个子集进行训练,采样时不进行替换。该算法通过随机选择分裂变量和分裂位置来生长隔离树,直到子集中的每个观察都落在单独的叶节点上。异常很少,而且各不相同;因此,异常点落在离根节点更近的单独叶节点上,路径长度(根节点到叶节点的距离)比正常点短。该算法使用基于所有隔离树的平均路径长度定义的异常分数来识别异常。

使用iforest函数,IsolationForest对象,isanomaly用于异常值检测和新颖性检测的对象函数。

  • 异常值检测(检测训练数据中的异常)-通过使用iforest函数。iforest构建一个IsolationForest对象,并返回训练数据的异常指标和分数。有关示例,请参见检测异常值

  • 新颖性检测(用未受污染的训练数据检测新数据中的异常情况)-创建一个IsolationForest对象通过将未受污染的训练数据(没有异常值的数据)传递给iforest,并通过将对象和新数据传递给对象函数来检测新数据中的异常isanomaly.对于新数据的每次观察,该函数查找从训练的隔离林中的根节点到达叶节点的平均路径长度,并返回异常标识符和分数。有关示例,请参见发现新奇事物

隔离林参数

的名称-值参数可以指定隔离林算法的参数iforest

  • NumObservationsPerLearner(每个隔离树的观察数)-每个隔离树对应于训练观察的一个子集。对于每棵树,iforest样品分钟(N, 256)未经替换的训练数据的观察数,其中N是训练观察的数量。隔离森林算法在样本量小的情况下表现良好,因为它有助于检测密集异常和接近正常点的异常。然而,如果你需要对样本大小进行实验N很小。有关示例,请参见检查NumObservationsPerLearner的小数据

  • NumLearners(隔离树数)-默认情况下,iforest函数为隔离森林生长100棵隔离树,因为平均路径长度通常在生长100棵隔离树之前很好地收敛[1]

异常分数

隔离森林算法计算异常评分年代x观察到的x通过标准化路径长度hx

年代 x 2 E h x c n

在哪里Ehx)]隔离森林中所有隔离树的平均路径长度,和cn二叉搜索树中不成功搜索的平均路径长度是n观察。

  • 当分数接近1时Ehx)]接近0。当评分值接近1时表示异常。

  • 分数趋于0时Ehx)]方法n- 1.此外,分数接近0.5时Ehx)]方法cn.因此,小于0.5且接近0的分数为正常分。

异常指标

iforest而且isanomaly将异常分数高于分数阈值的观测结果识别为异常。函数返回与输入数据长度相同的逻辑向量。逻辑1的值(真正的)表示输入数据对应行异常。

  • iforest确定阈值(ScoreThreshold属性值)来检测指定的分数(ContaminationFraction名称-值参数)的训练观察作为异常。默认情况下,该函数将所有训练观测值视为正常观测值。

  • isanomaly提供了ScoreThreshold名称-值参数,可用于指定阈值。默认阈值是训练隔离林时确定的值。

检测异常值并绘制异常分数等高线

本例使用生成的包含异常值的样例数据。方法训练隔离森林模型并检测异常值iforest函数。然后,计算样本数据周围点的异常值isanomaly函数,并创建异常分数的等高线图。

生成样本数据

使用高斯联结从二元分布生成随机数据点。

rng (“默认”) rho = [1,0.05;0.05,1];N = 1000;U =共生(“高斯”ρ,n);

在随机选择的观测值中添加5%的噪声,使观测值离群。

噪声= randperm(n,0.05*n);U(噪声,1)= U(噪声,1)*5;

训练隔离林并检测异常值

控件来训练隔离林模型iforest函数。指定训练观察中异常的比例为0.05。

[f,tf,scores] =森林(u,污染分数=0.05);

f是一个IsolationForest对象。iforest还返回异常指示符(特遣部队)和异常分数(分数)为训练数据。

绘制分数值的直方图。在分数阈值处创建一条对应于指定分数的垂直线。

直方图(分数)参照线(f。ScoreThreshold,“r -”,加入([“阈值”f.ScoreThreshold]))

图中包含一个轴对象。坐标轴对象包含直方图和常量线类型的2个对象。

检查设备的性能iforest通过绘制受试者工作特征(ROC)曲线并计算曲线下面积(AUC)值。

True_tf = false(n,1);True_tf (noise) = true;[X,Y,T,AUC] = perfcurve(true_tf,scores,true);AUC
Auc = 0.8384
情节(X, Y)包含(“假阳性率”) ylabel (“真阳性率”)标题(“异常检测ROC”

图中包含一个轴对象。标题为ROC用于异常检测的坐标轴对象包含一个类型为line的对象。

异常分数的等值线图

使用训练过的隔离森林模型和isanomaly函数来计算围绕训练观测的二维网格坐标的异常分数。

l1 = linspace (min (u(: 1),[], 1)、马克斯(u (: 1), [], 1));l2 = linspace (min (u(:, 2),[], 1)、马克斯(u (:, 2), [], 1));[X1,X2] =网格(l1,l2);[~,scores_grid] = isanomaly(f,[X1(:)),X2(:)]);scores_grid =重塑(scores_grid,size(X1,1),size(X2,2));

创建训练观察的散点图和异常分数的等高线图。标记真实异常值和被检测到的异常值iforest

Idx = setdiff(1:1000,噪音);散射(u(idx,1),u(idx,2),[],[0.5 0.5 0.5],,“。”)举行散射(u(噪音,1),u(噪音,2),“罗”“填充”)散射(u (tf, 1), u (tf, 2), 60岁,“柯”)轮廓(X1, X2, scores_grid“ShowText”“上”)传说([“正常点”“局外人”“检测到异常值”),位置=“最佳”)色条保持

图中包含一个轴对象。坐标轴对象包含散点、轮廓等4个对象。这些对象表示正常点、异常值和检测到的异常值。

检查NumObservationsPerLearner小数据

对于每个隔离树,iforest样品分钟(N, 256)未经替换的训练数据的观察数,其中N是训练观察的数量。保持样本量小有助于检测密集异常和接近正常点的异常。然而,如果你需要对样本大小进行实验N很小。

此示例演示如何为具有不同样本量的小数据训练隔离森林模型,创建异常分值与样本量的关系图,以及可视化已识别的异常。

加载样例数据

加载费雪的虹膜数据集。

负载fisheriris

数据包含四个测量值(萼片长度,萼片宽度,花瓣长度和花瓣宽度)从三种鸢尾花。矩阵包含150朵花的所有四个尺寸。

具有不同样本量的列车隔离森林

训练不同样本量的隔离森林模型,获得训练观测的异常分数。

s = NaN(150,150);rng (“默认”i = 3: 150 [~,~,s(:,i)] = forest(meas,NumObservationsPerLearner=i);结束

根据平均分数将观察结果分为三组,并创建异常分数与样本量的关系图。

Score_threshold1 = 0.5;Score_threshold2 = 0.55;M = mean(s,2,“omitnan”);Ind1 = find(m < score_threshold1);Ind2 = find(m <= score_threshold1 & m >= score_threshold1);Ind3 = find(m > score_threshold2);图t = tiledlayout(3,1);Nexttile plot(s(ind1,:)') title(join([“平均分数<的观察结果”Score_threshold1])) nexttile plot(s(ind2,:)') title(join([“[平均得分的观察结果”...score_threshold1”“score_threshold2“]”)) nexttile plot(s(ind3,:)') title(join([“平均分数>的观察结果”score_threshold2]))包含(t)“每棵树的观测数”) ylabel (t)“异常分数”

图中包含3个轴对象。平均分数< 0.5的坐标轴对象1包含101个类型为line的对象。标题为[0.5 0.55]的观测值的坐标轴对象2包含33个类型行对象。轴对象3标题为观测值,平均分数为> 0.55,包含16个类型为line的对象。

对于平均分值小于0.5的观测值,异常值随样本量的增加而减小。对于平均分值大于0.55的观测值,异常分值随着样本量的增加而增加,当样本量达到50时异常分值大致收敛。

通过使用样本大小为50和100的隔离森林模型来检测训练观测中的异常。指定训练观察中异常的比例为0.05。

[f1,tf1,scores1] =森林(meas,NumObservationsPerLearner=50,...ContaminationFraction = 0.05);[f2,tf2,scores2] =森林(meas,NumObservationsPerLearner=100,...ContaminationFraction = 0.05);

显示异常观测指标。

找到(tf1)
ans =7×114 42 110 118 119 123 132
找到(tf2)
ans =7×114 15 16 110 118 119 132

这两个隔离林模型有五个共同的异常。

可视化异常

对于样本量为50的隔离森林模型,可视地比较正常点与异常点之间的观测值。方法为每个变量组合创建分组直方图和分组散点图的矩阵gplotmatrix函数。

Tf1 = categorical(Tf1,[0 1],[“正常点”“异常”]);predictorNames = [“花萼长度”“花萼宽”...“花瓣长度”“花瓣宽度”];tf1 gplotmatrix(量,[],“kr”“方式”,[],[],[], predictorNames)

图中包含16个轴对象。坐标轴对象1包含2个line类型的对象。坐标轴对象2包含2个line类型的对象。坐标轴对象3包含2个line类型的对象。Axes对象4包含2个line类型的对象。坐标轴对象5包含2个line类型的对象。坐标轴对象6包含2个line类型的对象。Axes对象7包含2个line类型的对象。Axes对象8包含2个line类型的对象。Axes对象9包含2个line类型的对象。 Axes object 10 contains 2 objects of type line. Axes object 11 contains 2 objects of type line. Axes object 12 contains 2 objects of type line. Axes object 13 contains 2 objects of type line. Axes object 14 contains 2 objects of type line. Axes object 15 contains 2 objects of type line. Axes object 16 contains 2 objects of type line. These objects represent Normal Points, Anomalies.

对于高维数据,可以只使用重要的特征来可视化数据。您还可以通过使用t-SNE (t-分布式随机邻居嵌入)降低维数后可视化数据。

可视化观测值使用两个最重要的特征选择fsulaplacian函数。

Idx = fsulaplacian(meas)
idx =1×43 4 1 2
gscatter(量(:,idx (1)), (:, idx (2)), tf1,“kr”“方式”[],“上”...predictorNames (idx (1)), predictorNames (idx (2)))

图中包含一个轴对象。axis对象包含2个line类型的对象。这些对象代表正常点,异常点。

方法将维数降低后的观测值可视化tsne函数。

Y = tsne(meas);gscatter (Y (: 1), Y (:, 2), tf1,“kr”“方式”

图中包含一个轴对象。axis对象包含2个line类型的对象。这些对象代表正常点,异常点。

参考文献

[1]刘富田,丁坤明,周震。“隔离森林”,2008第八届IEEE数据挖掘国际会议.比萨,意大利,2008,第413-422页。

另请参阅

||

相关的话题