Эта тема вводит безнадзорные функции обнаружения аномалии многомерных выборочных данных, доступных в 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