隔离森林算法[1]通过使用隔离树集合从正常点隔离异常来检测异常。每个隔离树针对训练观察的一个子集进行训练,采样时不进行替换。该算法通过随机选择分裂变量和分裂位置来生长隔离树,直到子集中的每个观察都落在单独的叶节点上。异常很少,而且各不相同;因此,异常点落在离根节点更近的单独叶节点上,路径长度(根节点到叶节点的距离)比正常点短。该算法使用基于所有隔离树的平均路径长度定义的异常分数来识别异常。
使用iforest
函数,IsolationForest
对象,isanomaly
用于异常值检测和新颖性检测的对象函数。
的名称-值参数可以指定隔离林算法的参数iforest
:
NumObservationsPerLearner
(每个隔离树的观察数)-每个隔离树对应于训练观察的一个子集。对于每棵树,iforest
样品分钟(N, 256)
未经替换的训练数据的观察数,其中N
是训练观察的数量。隔离森林算法在样本量小的情况下表现良好,因为它有助于检测密集异常和接近正常点的异常。然而,如果你需要对样本大小进行实验N
很小。有关示例,请参见检查NumObservationsPerLearner的小数据.
NumLearners
(隔离树数)-默认情况下,iforest
函数为隔离森林生长100棵隔离树,因为平均路径长度通常在生长100棵隔离树之前很好地收敛[1].
隔离森林算法计算异常评分年代(x)观察到的x通过标准化路径长度h(x):
在哪里E[h(x)]隔离森林中所有隔离树的平均路径长度,和c(n)二叉搜索树中不成功搜索的平均路径长度是n观察。
当分数接近1时E[h(x)]接近0。当评分值接近1时表示异常。
分数趋于0时E[h(x)]方法n- 1.此外,分数接近0.5时E[h(x)]方法c(n).因此,小于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]))
检查设备的性能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”)
异常分数的等值线图
使用训练过的隔离森林模型和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”,“上”)传说([“正常点”“局外人”“检测到异常值”),位置=“最佳”)色条保持从
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)“异常分数”)
对于平均分值小于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)
对于高维数据,可以只使用重要的特征来可视化数据。您还可以通过使用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)))
方法将维数降低后的观测值可视化tsne
函数。
Y = tsne(meas);gscatter (Y (: 1), Y (:, 2), tf1,“kr”,“方式”)
[1]刘富田,丁坤明,周震。“隔离森林”,2008第八届IEEE数据挖掘国际会议.比萨,意大利,2008,第413-422页。
iforest
|IsolationForest
|isanomaly