Эта тема вводит безнадзорные функции обнаружения аномалии многомерных выборочных данных, доступных в Statistics and Machine Learning Toolbox™, и описывает рабочие процессы функций определения выбросов (обнаруживающий аномалии в обучающих данных) и обнаружение новинки (обнаруживающий аномалии в новых данных с незагрязненными обучающими данными).
Для непомеченных многомерных выборочных данных можно обнаружить аномалии при помощи леса изоляции, машины опорных векторов одного класса (OCSVM) и расстояния Mahalanobis. Эти методы обнаруживают выбросы или по образованию модель или путем изучения параметров. Для обнаружения новинки вы обучаете модель или изучаете параметры с незагрязненными обучающими данными (данные без выбросов) и обнаруживаете аномалии в новых данных при помощи обученной модели или изученных параметров.
Лес изоляции — Лесной алгоритм Изоляции обнаруживает аномалии путем изоляции их от нормальных точек с помощью ансамбля деревьев изоляции. Обнаружьте выбросы при помощи iforest функция, и обнаруживает новинки при помощи объектной функции isanomaly.
Машина опорных векторов одного класса (OCSVM) — Изучение Одного класса или безнадзорный SVM, пытается разделить данные из источника на преобразованном высоко-размерном пробеле предиктора. Обучите модель OCSVM при помощи fitcsvm функция, и затем обнаруживает выбросы и новинки при помощи resubPredict и predict возразите функциям, соответственно.
Расстояние Mahalanobis — Если выборочные данные следуют за многомерным нормальным распределением, то расстояния Mahalanobis в квадрате от выборок до распределения следуют за распределением хи-квадрат. Поэтому можно использовать расстояния, чтобы обнаружить аномалии на основе критических значений распределения хи-квадрат. Для определения выбросов используйте robustcov функция, чтобы вычислить устойчивые расстояния Mahalanobis. Для обнаружения новинки можно вычислить расстояния Mahalanobis при помощи robustcov и pdist2 функции.
Этот пример иллюстрирует рабочие процессы трех безнадзорных методов обнаружения аномалии (лес изоляции, OCSVM и расстояние Mahalanobis) для определения выбросов.
Загрузка данных
Загрузите humanactivity набор данных, который содержит переменные feat и actid. Переменная feat содержит матрицу данных предиктора 60 функций 24 075 наблюдений и переменную отклика actid содержит идентификаторы действия для наблюдений как целые числа. Этот пример использует feat переменная для обнаружения аномалии.
load humanactivityНайдите размер переменной feat.
[N,D] = size(feat)
N = 24075
D = 60
Примите, что часть выбросов в данных 0.05.
contaminationFraction = 0.05;
Лес изоляции
Обнаружьте выбросы при помощи iforest функция.
Обучите лесную модель изоляции при помощи iforest функция. Задайте часть выбросов (ContaminationFraction) как 0,05.
rng("default") % For reproducibility [forest,tf_forest,s_forest] = iforest(feat, ... ContaminationFraction=contaminationFraction);
forest IsolationForest объект. iforest также возвращает индикаторы аномалии (tf_forest) и баллы аномалии (s_forest) для данных (feat). iforest определяет пороговое значение счета (forest.ScoreThreshold) так, чтобы функция обнаружила заданную часть наблюдений как выбросы.
Постройте гистограмму значений баллов. Создайте вертикальную линию в пороге счета, соответствующем заданной части.
figure histogram(s_forest,Normalization="probability") xline(forest.ScoreThreshold,"k-", ... join(["Threshold =" forest.ScoreThreshold])) title("Histogram of Anomaly Scores for Isolation Forest")

Проверяйте часть обнаруженных аномалий в данных.
OF_forest = sum(tf_forest)/N
OF_forest = 0.0496
Часть выброса может быть меньшей, чем заданная часть (0.05), когда баллы могли связать значения в пороге.
Машина опорных векторов одного класса (OCSVM)
Обучите модель OCSVM при помощи fitcsvm функция, и затем обнаруживает выбросы при помощи resubPredict функция.
Обучите модель машины опорных векторов изучению одного класса при помощи fitcsvm функция. Функция обучает модель изучению одного класса, если переменная метки класса является вектором из единиц. Задайте часть выбросов (OutlierFraction) как 0,05.
Mdl = fitcsvm(feat,ones(size(feat,1),1), ... OutlierFraction=contaminationFraction, ... KernelScale="auto",Standardize=true);
Mdl ClassificationSVM объект.
Вычислите музыку выброса к feat при помощи resubPredict функция.
[~,s_OCSVM] = resubPredict(Mdl);
Отрицательные значения баллов указывают, что соответствующие наблюдения являются выбросами. Получите индикаторы аномалии.
tf_OCSVM = s_OCSVM < 0;
Постройте гистограмму значений баллов.
figure histogram(s_OCSVM,Normalization="probability"); xline(0,"k-","Threshold = 0") title("Histogram of Anomaly Scores for OCSVM")

Проверяйте часть обнаруженных аномалий в данных.
OF_OCSVM = sum(tf_OCSVM)/N
OF_OCSVM = 0.0500
fitcsvm обучает термин смещения модели SVM так, чтобы заданная часть учебных наблюдений имела отрицательные баллы. Поэтому OF_OCSVM близко к заданному дробному значению.
Расстояние Mahalanobis
Используйте robustcov функция, чтобы вычислить устойчивые расстояния Mahalanobis и устойчивые оценки для среднего значения и ковариации данных.
Вычислите расстояние Mahalanobis от feat к распределению feat при помощи robustcov функция. Задайте часть выбросов (OutlierFraction) как 0,05. robustcov минимизирует определитель ковариации более чем 95% наблюдений.
[sigma,mu,s_robustcov,tf_robustcov_default] = robustcov(feat, ...
OutlierFraction=contaminationFraction);robustcov находит устойчивую оценку ковариационной матрицы (sigma) и устойчивая средняя оценка (mu), которые менее чувствительны к выбросам, чем оценки от cov и mean функции. robustcov функция также вычисляет расстояния Mahalanobis (s_robustcov) и индикаторы выброса (tf_robustcov_default). По умолчанию функция принимает, что набор данных следует за многомерным нормальным распределением и идентифицирует 2,5% входных наблюдений как выбросы на основе критических значений распределения хи-квадрат.
Если набор данных удовлетворяет предположению нормальности, то расстояние Mahalanobis в квадрате следует за распределением хи-квадрат с D степени свободы, где D размерность данных. В этом случае можно найти новый порог при помощи chi2inv функция, чтобы обнаружить заданную часть наблюдений как выбросы.
s_robustcov_threshold = sqrt(chi2inv(1-contaminationFraction,D)); tf_robustcov = s_robustcov > s_robustcov_threshold;
Создайте график расстояния расстояния (график DD), чтобы проверять многомерную нормальность данных.
figure d_classical = pdist2(feat,mean(feat),"mahalanobis"); gscatter(d_classical,s_robustcov,tf_robustcov,"kr",".x") xline(s_robustcov_threshold,"k-") yline(s_robustcov_threshold,"k-", ... join(["Threshold = " s_robustcov_threshold])); l = refline([1 0]); l.Color = "k"; xlabel("Mahalanobis Distance") ylabel("Robust Distance") legend("Normal Points","Outliers",Location="northwest") title("Distance-Distance Plot")

Увеличение осей, чтобы видеть нормальные точки.
xlim([0 10]) ylim([0 10])

Если набор данных следует за многомерным нормальным распределением, то кластер точек данных плотно вокруг 45 линий ссылки степени. График DD показывает, что набор данных не следует за многомерным нормальным распределением.
Поскольку набор данных не удовлетворяет предположению нормальности, используйте квантиль значений расстояния для интегральной вероятности (1 — contaminationFraction) найти порог.
s_robustcov_threshold = quantile(s_robustcov,1-contaminationFraction);
Получите индикаторы аномалии для feat использование нового порога s_robustcov_threshold.
tf_robustcov = s_robustcov > s_robustcov_threshold;
Проверяйте часть обнаруженных аномалий в данных.
OF_robustcov = sum(tf_robustcov)/N
OF_robustcov = 0.0500
Сравните обнаруженные выбросы
Чтобы визуализировать обнаруженные выбросы, уменьшайте размерность данных при помощи tsne функция.
rng("default") % For reproducibility T = tsne(feat,Standardize=true,Perplexity=100,Exaggeration=20);
Постройте нормальные точки и выбросы в уменьшаемой размерности. Сравните результаты этих трех методов: лесной алгоритм изоляции, модель OCSVM и устойчивое расстояние Mahalanobis от robustcov.
figure tiledlayout(2,2) nexttile gscatter(T(:,1),T(:,2),tf_forest,"kr",".x",[],"off") title("Isolation Forest") nexttile(3) gscatter(T(:,1),T(:,2),tf_OCSVM,"kr",".x",[],"off") title("OCSVM") nexttile(4) gscatter(T(:,1),T(:,2),tf_robustcov,"kr",".x",[],"off") title("Robust Mahalanobis Distance") l = legend("Normal Points","Novelties"); l.Layout.Tile = 2;

Новинки, идентифицированные этими тремя методами, расположены друг около друга в уменьшаемой размерности. Вычислите часть выбросов, которые имеют общего эти три метода.
sum(tf_forest.*tf_OCSVM.*tf_robustcov)/N
ans = 0.0298
Эти три метода идентифицируют приблизительно 3% данных (feat) как выбросы.
Можно также визуализировать значения наблюдения, использующие две самых важных функции, выбранные fsulaplacian функция.
idx = fsulaplacian(feat); figure t = tiledlayout(2,2); nexttile gscatter(feat(:,idx(1)),feat(:,idx(2)),tf_forest,"kr",".x",[],"off") title("Isolation Forest") nexttile(3) gscatter(feat(:,idx(1)),feat(:,idx(2)),tf_OCSVM,"kr",".x",[],"off") title("OCSVM") nexttile(4) gscatter(feat(:,idx(1)),feat(:,idx(2)),tf_robustcov,"kr",".x",[],"off") title("Mahalanobis Distance") l = legend("Normal Points","Novelties"); l.Layout.Tile = 2; xlabel(t,join(["Column" idx(1)])) ylabel(t,join(["Column" idx(2)]))

Этот пример иллюстрирует рабочие процессы трех безнадзорных методов обнаружения аномалии (лес изоляции, OCSVM и расстояние Mahalanobis) для обнаружения новинки.
Загрузка данных
Загрузите humanactivity набор данных, который содержит переменные feat и actid. Переменная feat содержит матрицу данных предиктора 60 функций 24 075 наблюдений и переменную отклика actid содержит идентификаторы действия для наблюдений как целые числа. Этот пример использует feat переменная для обнаружения аномалии.
load humanactivityРазделите данные в наборы обучающих данных и наборы тестов при помощи cvpartition функция. Используйте 50% наблюдений как обучающие данные и 50% наблюдений как тестовые данные для обнаружения новинки.
rng("default") % For reproducibility c = cvpartition(actid,Holdout=0.50); trainingIndices = training(c); % Indices for the training set testIndices = test(c); % Indices for the test set XTrain = feat(trainingIndices,:); XTest = feat(testIndices,:);
Примите, что обучающие данные не загрязнены (никакие выбросы).
Найдите размер наборов обучающих данных и наборов тестов.
[N,D] = size(XTrain)
N = 12038
D = 60
NTest = size(XTest,1)
NTest = 12037
Лес изоляции
Обнаружьте новинки с помощью объектного функционального isanomaly после обучения лесная модель изоляции при помощи iforest функция.
Обучите лесную модель изоляции.
[forest,tf_forest,s_forest] = iforest(XTrain);
forest IsolationForest объект. iforest также возвращает индикаторы аномалии (tf_forest) и баллы аномалии (s_forest) для обучающих данных (XTrain). По умолчанию, iforest обработки все учебные наблюдения как нормальные наблюдения, и устанавливают порог счета (forest.ScoreThreshold) к максимальному значению баллов.
Используйте обученную лесную модель изоляции и объектный функциональный isanomaly найти новинки в XTest. isanomaly функция идентифицирует наблюдения с баллами выше порога (forest.ScoreThreshold) как новинки.
[tfTest_forest,sTest_forest] = isanomaly(forest,XTest);
isanomaly функция возвращает индикаторы аномалии (tfTest_forest) и баллы аномалии (sTest_forest) для новых данных.
Постройте гистограммы значений баллов. Создайте вертикальную линию в пороге счета.
figure histogram(s_forest,Normalization="probability") hold on histogram(sTest_forest,Normalization="probability") xline(forest.ScoreThreshold,"k-", ... join(["Threshold =" forest.ScoreThreshold])) legend("Training data","New data",Location="southeast") title("Histograms of Anomaly Scores for Isolation Forest") hold off

Распределение счета аномалии тестовых данных похоже на те из обучающих данных, таким образом, isanomaly обнаруживает небольшое количество аномалий в тестовых данных.
Проверяйте часть обнаруженных аномалий в тестовых данных.
NF_forest = sum(tfTest_forest)/NTest
NF_forest = 8.3077e-05
Отобразите индекс наблюдения аномалий в тестовых данных.
idx_forest = find(tfTest_forest)
idx_forest = 3422
Машина опорных векторов одного класса (OCSVM)
Обучите модель OCSVM при помощи fitcsvm функция, и затем обнаруживает аномалии в новых данных при помощи predict объектная функция.
Обучите модель машины опорных векторов изучению одного класса при помощи fitcsvm функция. Функция обучает модель изучению одного класса, если переменная метки класса является вектором из единиц. Задайте часть выбросов (OutlierFraction) как 0.
Mdl = fitcsvm(XTrain,ones(size(XTrain,1),1),OutlierFraction=0, ... KernelScale="auto",Standardize=true);
Mdl ClassificationSVM объект.
Вычислите музыку выброса к XTrain при помощи resubPredict функция.
[~,s_OCSVM] = resubPredict(Mdl);
Вычислите музыку новинки к XTest при помощи predict функция.
[~,sTest_OCSVM] = predict(Mdl,XTest);
Отрицательные значения баллов указывают, что соответствующие наблюдения являются аномалиями. Получите индикаторы аномалии.
tfTest_OCSVM = sTest_OCSVM < 0;
Постройте гистограммы значений баллов.
figure histogram(s_OCSVM,Normalization="probability"); hold on histogram(sTest_OCSVM,Normalization="probability"); xline(0,"k-","Threshold = 0") legend("Training data","New Data",Location="best") title("Histograms of Anomaly Scores for OCSVM") hold off

Проверяйте часть обнаруженных аномалий в тестовых данных.
NF_OCSVM = sum(tfTest_OCSVM)/NTest
NF_OCSVM = 0.0707
Отобразите индекс наблюдения аномалий в тестовых данных.
idx_OCSVM = find(tfTest_OCSVM)
idx_OCSVM = 851×1
1061
1443
1444
1445
1447
1448
1449
1450
1451
1453
⋮
Расстояние Mahalanobis
Используйте robustcov функция, чтобы вычислить расстояния Mahalanobis обучающих данных и использовать pdist2 функция, чтобы вычислить расстояния Mahalanobis новых данных.
Вычислите расстояние Mahalanobis от XTrain к распределению XTrain при помощи robustcov функция. Задайте часть выбросов (OutlierFraction) как 0.
[sigma,mu,s_mahal] = robustcov(XTrain,OutlierFraction=0);
robustcov также возвращает оценки ковариационной матрицы (sigma) и среднее значение (mu), который можно использоваться для расчета расстояний новых данных.
Используйте максимальное значение s_mahal как порог счета для обнаружения новинки.
s_mahal_threshold = max(s_mahal);
Вычислите расстояние Mahalanobis от XTest к распределению XTrain при помощи pdist2 функция.
sTest_mahal = pdist2(XTest,mu,"mahalanobis",sigma);Получите индикаторы аномалии для XTest.
tfTest_mahal = sTest_mahal > s_mahal_threshold;
Постройте гистограммы значений баллов.
figure histogram(s_mahal,Normalization="probability"); hold on histogram(sTest_mahal,Normalization="probability"); xline(s_mahal_threshold,"k-", ... join(["Threshold =" s_mahal_threshold])) legend("Training data","New Data",Location="southeast") title("Histograms of Mahalanobis Distances") hold off

Проверяйте часть обнаруженных аномалий в тестовых данных.
NF_mahal = sum(tfTest_mahal)/NTest
NF_mahal = 8.3077e-05
Отобразите индекс наблюдения аномалий в тестовых данных.
idx_mahal = find(tfTest_mahal)
idx_mahal = 3654
Сравните обнаруженные аномалии
Чтобы визуализировать обнаруженные аномалии, уменьшайте размерность данных при помощи tsne функция.
rng("default") % For reproducibility T = tsne(feat,Standardize=true,Perplexity=100,Exaggeration=20); XTest2D = T(testIndices,:);
Постройте нормальные точки и новинки в уменьшаемой размерности. Сравните результаты этих трех методов: лесной алгоритм изоляции, модель OCSVM и расстояние Mahalanobis от mahal.
figure tiledlayout(2,2) nexttile gscatter(XTest2D(:,1),XTest2D(:,2),tfTest_forest,"kr",".x",[],"off") title("Isolation Forest") nexttile(3) gscatter(XTest2D(:,1),XTest2D(:,2),tfTest_OCSVM,"kr",".x",[],"off") title("OCSVM") nexttile(4) gscatter(XTest2D(:,1),XTest2D(:,2),tfTest_mahal,"kr",".x",[],"off") title("Mahalanobis Distance") l = legend("Normal Points","Novelties"); l.Layout.Tile = 2;

Новинка идентифицирована лесным алгоритмом изоляции (idx_forest) и новинка, идентифицированная расстоянием Mahalanobis (idx_mahal) отличаются, но они расположены друг около друга в уменьшаемой размерности.
Проверяйте, содержат ли новинки, идентифицированные OCSVM, новинки, идентифицированные лесным алгоритмом изоляции и расстоянием Mahalanobis.
ismember(idx_forest,idx_OCSVM)
ans = logical
1
ismember(idx_mahal,idx_OCSVM)
ans = logical
1
Можно также визуализировать значения наблюдения, использующие две самых важных функции, выбранные fsulaplacian функция.
idx = fsulaplacian([XTrain; XTest]); figure t = tiledlayout(2,2); nexttile gscatter(XTest(:,idx(1)),XTest(:,idx(2)),tfTest_forest,"kr",".x",[],"off") title("Isolation Forest") nexttile(3) gscatter(XTest(:,idx(1)),XTest(:,idx(2)),tfTest_OCSVM,"kr",".x",[],"off") title("OCSVM") nexttile(4) gscatter(XTest(:,idx(1)),XTest(:,idx(2)),tfTest_mahal,"kr",".x",[],"off") title("Mahalanobis Distance") l = legend("Normal Points","Novelties"); l.Layout.Tile = 2; xlabel(t,join(["Column" idx(1)])) ylabel(t,join(["Column" idx(2)]))

iforest | isanomaly | fitcsvm | resubPredict | predict | robustcov | pdist2