Лесной алгоритм изоляции [1] обнаруживает аномалии путем изоляции аномалий от нормальных точек с помощью ансамбля деревьев изоляции. Каждое дерево изоляции обучено подмножеству учебных наблюдений, произведенных без замен. Алгоритм выращивает дерево изоляции путем выбора переменной разделения и положения разделения наугад, пока каждое наблюдение в подмножестве не приземляется в отдельной вершине. Аномалии - немногие и отличающийся; поэтому, аномалия приземляется в отдельной вершине ближе к корневому узлу и имеет более короткую длину пути (расстояние от корневого узла до вершины), чем нормальные точки. Алгоритм идентифицирует аномалии с помощью баллов аномалии, заданных на основе средних длин пути по всем деревьям изоляции.
Используйте iforest
функция, IsolationForest
объект, и isanomaly
возразите функции для обнаружения новинки и определения выбросов.
Определение выбросов (обнаруживающий аномалии в обучающих данных) — Обнаруживает аномалии в обучающих данных при помощи iforest
функция. iforest
создает IsolationForest
возразите и возвращает индикаторы аномалии и музыку к обучающим данным. Для примера смотрите, Обнаруживают Выбросы.
Обнаружение новинки (обнаруживающий аномалии в новых данных с незагрязненными обучающими данными) — Создает IsolationForest
объект путем передачи незагрязненных обучающих данных (данные без выбросов) к iforest
, и обнаружьте аномалии в новых данных путем передачи объекта и новых данных к объектной функции isanomaly
. Для каждого наблюдения за новыми данными функция находит, что средняя длина пути достигает вершины от корневого узла в обученном лесу изоляции и возвращает идентификатор аномалии и счет. Для примера смотрите, Обнаруживают Новинки.
Можно задать параметры для лесного алгоритма изоляции при помощи аргументов name-value iforest
:
NumObservationsPerLearner
(количество наблюдений для каждого дерева изоляции) — Каждое дерево изоляции соответствует подмножеству учебных наблюдений. Для каждого дерева, iforest
выборки min(N,256)
количество наблюдений от обучающих данных без замены, где N
количество учебных наблюдений. Лесной алгоритм изоляции выполняет хорошо с размером небольшой выборки, потому что он помогает обнаружить плотные аномалии и аномалии близко к нормальным точкам. Однако необходимо экспериментировать с объемом выборки если N
мал. Для примера смотрите, Исследуют NumObservationsPerLearner на Маленькие Данные.
NumLearners
(количество деревьев изоляции) — По умолчанию, iforest
функция выращивает 100 деревьев изоляции для леса изоляции, потому что средние длины пути обычно сходятся прежде, чем вырастить 100 деревьев изоляции [1].
Лесной алгоритм изоляции вычисляет счет аномалии s (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
идентифицируйте наблюдения с баллами аномалии выше порога счета как аномалии. Функции возвращают логический вектор, который имеет ту же длину как входные данные. Значение логической единицы (true
) указывает, что соответствующая строка входных данных является аномалией.
iforest
определяет пороговое значение (ScoreThreshold
значение свойства), чтобы обнаружить заданную часть (ContaminationFraction
аргумент значения имени) учебных наблюдений как аномалии. По умолчанию функция обрабатывает все учебные наблюдения как нормальные наблюдения.
isanomaly
обеспечивает ScoreThreshold
аргумент значения имени, который можно использовать, чтобы задать порог. Порог по умолчанию является значением, определенным, когда лес изоляции обучен.
Этот пример использует сгенерированные выборочные данные, содержащие выбросы. Обучите лесную модель изоляции и обнаружьте выбросы при помощи iforest
функция. Затем вычислите музыку аномалии к точкам вокруг выборочных данных при помощи isanomaly
функция, и создает контурный график баллов аномалии.
Сгенерируйте выборочные данные
Используйте Гауссову связку, чтобы сгенерировать случайные точки данных от двумерного распределения.
rng("default") rho = [1,0.05;0.05,1]; n = 1000; u = copularnd("Gaussian",rho,n);
Добавьте шум в 5% случайным образом выбранных наблюдений, чтобы сделать выбросы наблюдений.
noise = randperm(n,0.05*n); u(noise,1) = u(noise,1)*5;
Обучите лес изоляции и обнаружьте выбросы
Обучите лесную модель изоляции при помощи iforest
функция. Задайте часть аномалий в учебных наблюдениях как 0,05.
[f,tf,scores] = iforest(u,ContaminationFraction=0.05);
f
IsolationForest
объект. iforest
также возвращает индикаторы аномалии (tf
) и баллы аномалии (scores
) для обучающих данных.
Постройте гистограмму значений баллов. Создайте вертикальную линию в пороге счета, соответствующем заданной части.
histogram(scores) xline(f.ScoreThreshold,"r-",join(["Threshold" 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
plot(X,Y) xlabel("False positive rate") ylabel("True positive rate") title("ROC for Anomaly Detection")
Постройте контуры баллов аномалии
Используйте обученную лесную модель изоляции и isanomaly
функция, чтобы вычислить музыку аномалии к 2D декартовым координатам вокруг учебных наблюдений.
l1 = linspace(min(u(:,1),[],1),max(u(:,1),[],1)); l2 = linspace(min(u(:,2),[],1),max(u(:,2),[],1)); [X1,X2] = meshgrid(l1,l2); [~,scores_grid] = isanomaly(f,[X1(:),X2(:)]); scores_grid = reshape(scores_grid,size(X1,1),size(X2,2));
Создайте график рассеивания учебных наблюдений и контурный график баллов аномалии. Отметьте истинные выбросы и выбросы, обнаруженные iforest
.
idx = setdiff(1:1000,noise); scatter(u(idx,1),u(idx,2),[],[0.5 0.5 0.5],".") hold on scatter(u(noise,1),u(noise,2),"ro","filled") scatter(u(tf,1),u(tf,2),60,"ko") contour(X1,X2,scores_grid,"ShowText","on") legend(["Normal Points" "Outliers" "Detected Outliers"],Location="best") colorbar hold off
NumObservationsPerLearner
для маленьких данныхДля каждого дерева изоляции, iforest
выборки min(N,256)
количество наблюдений от обучающих данных без замены, где N
количество учебных наблюдений. Хранение маленького объема выборки помогает обнаружить плотные аномалии и аномалии близко к нормальным точкам. Однако необходимо экспериментировать с объемом выборки если N
мал.
В этом примере показано, как обучить лесные модели изоляции маленьким данным с различными объемами выборки, создайте графики значений баллов аномалии по сравнению с объемами выборки и визуализируйте идентифицированные аномалии.
Загрузка демонстрационных данных
Загрузите ирисовый набор данных Фишера.
load fisheriris
Данные содержат четыре измерения (длина чашелистика, ширина чашелистика, лепестковая длина и лепестковая ширина) от трех разновидностей ирисовых цветов. Матричный meas
содержит все четыре измерения для 150 цветов.
Обучите лес изоляции с различными объемами выборки
Обучите лесные модели изоляции с различными объемами выборки и получите музыку аномалии к учебным наблюдениям.
s = NaN(150,150); rng("default") for i = 3: 150 [~,~,s(:,i)] = iforest(meas,NumObservationsPerLearner=i); end
Разделите наблюдения на три группы на основе средних оценок и создайте графики баллов аномалии по сравнению с объемами выборки.
score_threshold1 = 0.5; score_threshold2 = 0.55; m = mean(s,2,"omitnan"); ind1 = find(m < score_threshold1); ind2 = find(m <= score_threshold2 & m >= score_threshold1); ind3 = find(m > score_threshold2); figure t = tiledlayout(3,1); nexttile plot(s(ind1,:)') title(join(["Observations with average score < " score_threshold1])) nexttile plot(s(ind2,:)') title(join(["Observations with average score in [" ... score_threshold1 " " score_threshold2 "]"])) nexttile plot(s(ind3,:)') title(join(["Observations with average score > " score_threshold2])) xlabel(t,"Number of Observations for Each Tree") ylabel(t,"Anomaly Score")
Уменьшения счета аномалии как объем выборки увеличиваются для наблюдений, значения средней оценки которых меньше 0.5. Для наблюдений, значения средней оценки которых больше 0.55, увеличения счета аномалии, когда увеличивается объем выборки, и затем счет сходится примерно, когда объем выборки достигает 50.
Обнаружьте аномалии в учебных наблюдениях при помощи лесных моделей изоляции с объемами выборки 50 и 100. Задайте часть аномалий в учебных наблюдениях как 0,05.
[f1,tf1,scores1] = iforest(meas,NumObservationsPerLearner=50, ... ContaminationFraction=0.05); [f2,tf2,scores2] = iforest(meas,NumObservationsPerLearner=100, ... ContaminationFraction=0.05);
Отобразите индексы наблюдения аномалий.
find(tf1)
ans = 7×1
14
42
110
118
119
123
132
find(tf2)
ans = 7×1
14
15
16
110
118
119
132
У двух лесных моделей изоляции есть пять общих аномалий.
Визуализируйте аномалии
Для лесной модели изоляции с объемом выборки 50, визуально сравните значения наблюдения между нормальными точками и аномалиями. Создайте матрицу сгруппированных гистограмм и сгруппированных графиков рассеивания для каждой комбинации переменных при помощи gplotmatrix
функция.
tf1 = categorical(tf1,[0 1],["Normal Points" "Anomalies"]); predictorNames = ["Sepal Length" "Sepal Width" ... "Petal Length" "Petal Width"]; gplotmatrix(meas,[],tf1,"kr",".x",[],[],[],predictorNames)
Для высоко-размерных данных можно визуализировать данные только при помощи важных функций. Можно также визуализировать данные после сокращения размерности при помощи t-SNE (t-Distributed стохастическое вложение соседей).
Визуализируйте значения наблюдения, использующие две самых важных функции, выбранные fsulaplacian
функция.
idx = fsulaplacian(meas)
idx = 1×4
3 4 1 2
gscatter(meas(:,idx(1)),meas(:,idx(2)),tf1,"kr",".x",[],"on", ... predictorNames(idx(1)),predictorNames(idx(2)))
Визуализируйте значения наблюдения после сокращения размерности при помощи tsne
функция.
Y = tsne(meas); gscatter(Y(:,1),Y(:,2),tf1,"kr",".x")
[1] Лю, F. T. К. М. Тинг и Цз. Чжоу. "Лес изоляции", 2 008 Восьмых Международных конференций IEEE по вопросам Анализа данных. Пиза, Италия, 2008, стр 413-422.
iforest
| IsolationForest
| isanomaly