2.7. Обнаружение новизны и выбросов
Во многих приложениях необходимо определять, принадлежит ли новое наблюдение тому же распределению, что и существующие наблюдения (то есть является ли оно нормальным наблюдением) или его следует считать отличающимся (то есть является ли оно выбросом). Часто эта возможность используется для очистки реальных наборов данных. Следует различать два важных понятия:
- обнаружение выбросов:
-
Обучающие данные содержат выбросы — наблюдения, которые значительно отличаются от остальных. Поэтому алгоритмы обнаружения выбросов пытаются аппроксимировать области наибольшей концентрации обучающих данных, игнорируя отклоняющиеся наблюдения.
- обнаружение новизны:
-
Обучающие данные не содержат выбросов, и нас интересует, является ли новое наблюдение выбросом. В этом контексте выброс также называют новым наблюдением.
Обнаружение выбросов и обнаружение новизны используются для обнаружения аномалий — задачи, в которой необходимо выявлять ненормальные или необычные наблюдения. Обнаружение выбросов в этом случае также называют неконтролируемым обнаружением аномалий, а обнаружение новизны — полу-контролируемым обнаружением аномалий. При обнаружении выбросов выбросы/аномалии не могут образовывать плотный кластер, поскольку имеющиеся алгоритмы предполагают, что выбросы/аномалии расположены в областях с низкой плотностью. Напротив, при обнаружении новизны новые наблюдения/аномалии могут образовывать плотный кластер, если они находятся в области низкой плотности обучающих данных, которая в этом контексте считается нормальной.
Проект scikit-learn предоставляет набор инструментов машинного обучения, которые можно использовать как для обнаружения новизны, так и для обнаружения выбросов. Эта стратегия реализуется с помощью объектов, которые обучаются на данных без учителя:
estimator.fit(X_train)
затем новые наблюдения можно классифицировать как нормальные или выбросы с помощью метода predict:
estimator.predict(X_test)
Нормальным наблюдениям присваивается метка 1, а выбросам — -1. Метод predict использует пороговое значение для исходной функции оценки, вычисленной оценщиком. Эта функция оценки доступна через метод score_samples, а пороговое значение можно задать с помощью параметра contamination.
Метод decision_function также определяется на основе функции оценки таким образом, что отрицательные значения соответствуют выбросам, а неотрицательные — нормальным наблюдениям:
estimator.decision_function(X_test)
Обратите внимание, что neighbors.LocalOutlierFactor по умолчанию не поддерживает методы predict, decision_function и score_samples, а только метод fit_predict, поскольку этот оценщик изначально предназначался для обнаружения выбросов. Оценки аномальности обучающих образцов доступны через атрибут negative_outlier_factor_.
Если вы всё же хотите использовать neighbors.LocalOutlierFactor для обнаружения новизны, то есть предсказывать метки или вычислять оценку аномальности новых, ранее не встречавшихся данных, перед обучением оценщика создайте его экземпляр, задав параметру novelty значение True. В этом случае fit_predict недоступен.
Предупреждение
Обнаружение новизны с помощью Local Outlier Factor
Если параметру novelty задано значение True, имейте в виду, что методы predict, decision_function и score_samples следует применять только к новым, ранее не встречавшимся данным, а не к обучающим образцам, иначе результаты будут неверными. Иными словами, результат predict не будет совпадать с fit_predict. Оценки аномальности обучающих образцов всегда доступны через атрибут negative_outlier_factor_.
Поведение neighbors.LocalOutlierFactor обобщено в следующей таблице.
Метод | Обнаружение выбросов | Обнаружение новизны |
|---|---|---|
| ОК | Недоступно |
| Недоступно | Использовать только для новых данных |
| Недоступно | Использовать только для новых данных |
| Использовать | Использовать только для новых данных |
| ОК | ОК |
2.7.1. Обзор методов обнаружения выбросов
Сравнение алгоритмов обнаружения выбросов в scikit-learn. Для Local Outlier Factor (LOF) чёрная граница принятия решений не отображается, поскольку при использовании для обнаружения выбросов у него нет метода predict, который можно было бы применить к новым данным.
ensemble.IsolationForest и neighbors.LocalOutlierFactor показывают достаточно хорошие результаты на рассматриваемых здесь наборах данных. Известно, что svm.OneClassSVM чувствителен к выбросам, поэтому для их обнаружения он работает не слишком хорошо. При этом обнаружение выбросов в данных высокой размерности или без каких-либо предположений о распределении нормальных данных представляет собой очень сложную задачу. svm.OneClassSVM всё же можно использовать для обнаружения выбросов, но для обработки выбросов и предотвращения переобучения требуется тщательно настроить гиперпараметр nu. linear_model.SGDOneClassSVM реализует линейный One-Class SVM со сложностью, линейно зависящей от количества образцов. В данном случае эта реализация используется вместе с методом приближения ядра, чтобы получить результаты, аналогичные svm.OneClassSVM, в котором по умолчанию используется гауссово ядро. Наконец, covariance.EllipticEnvelope предполагает, что данные имеют гауссово распределение, и обучает эллипс. Дополнительные сведения о различных оценщиках см. в примере Сравнение алгоритмов обнаружения аномалий для выявления выбросов в искусственных наборах данных и в разделах ниже.
Примеры
- См. Сравнение алгоритмов обнаружения аномалий для выявления выбросов в искусственных наборах данных, где сравниваются
svm.OneClassSVM,ensemble.IsolationForest,neighbors.LocalOutlierFactorиcovariance.EllipticEnvelope. - См. Оценка оценщиков для обнаружения выбросов: в примере показано, как оценивать алгоритмы обнаружения выбросов, в частности
neighbors.LocalOutlierFactorиensemble.IsolationForest, с помощью ROC-кривых, построенных методомmetrics.RocCurveDisplay.
2.7.2. Обнаружение новизны
Рассмотрим набор данных из \(n\) наблюдений, принадлежащих одному распределению и описываемых \(p\) признаками. Добавим к этому набору ещё одно наблюдение. Настолько ли оно отличается от остальных, что можно усомниться в его нормальности? (То есть принадлежит ли оно тому же распределению?) Или, напротив, оно настолько похоже на остальные, что его невозможно отличить от исходных наблюдений? Именно на этот вопрос отвечают инструменты и методы обнаружения новизны.
В общем случае задача заключается в том, чтобы обучить приблизительную, близкую к наблюдениям границу, ограничивающую контур распределения исходных наблюдений, представленных в пространстве признаков размерности \(p\). Если новые наблюдения окажутся внутри ограниченной этой границей области, их считают принадлежащими той же совокупности, что и исходные наблюдения. Если же они окажутся за границей, их можно считать аномальными с определённой степенью уверенности.
Метод One-Class SVM был предложен Schölkopf et al. для решения этой задачи и реализован в модуле Машины опорных векторов в виде объекта svm.OneClassSVM. Для определения границы необходимо выбрать ядро и скалярный параметр. Обычно выбирают RBF-ядро, хотя не существует точной формулы или алгоритма для задания параметра ширины полосы. Это значение используется по умолчанию в реализации scikit-learn. Параметр nu, также известный как отступ One-Class SVM, соответствует вероятности того, что новое, но нормальное наблюдение окажется за границей.
Ссылки
- Оценка носителя многомерного распределения Schölkopf, Bernhard и др. Neural computation 13.7 (2001): 1443–1471.
Примеры
- См. Одноклассовый SVM с нелинейным ядром (RBF): здесь показана визуализация границы, которую объект
svm.OneClassSVMобучил вокруг данных. - Моделирование распространения видов
2.7.2.1. Масштабирование One-Class SVM
Онлайн-версия линейного One-Class SVM реализована в linear_model.SGDOneClassSVM. Её сложность линейно зависит от количества образцов; с помощью приближения ядра её можно использовать для аппроксимации решения ядрового svm.OneClassSVM, сложность которого в лучшем случае квадратична по количеству образцов. Дополнительные сведения см. в разделе Онлайн-версия One-Class SVM.
Примеры
- См. Сравнение One-Class SVM и One-Class SVM со стохастическим градиентным спуском: в примере показана аппроксимация ядрового One-Class SVM с помощью
linear_model.SGDOneClassSVMв сочетании с приближением ядра.
2.7.3. Обнаружение выбросов
Обнаружение выбросов похоже на обнаружение новизны: цель состоит в том, чтобы отделить основную массу нормальных наблюдений от загрязняющих её наблюдений, называемых выбросами. Однако при обнаружении выбросов у нас нет чистого набора данных, представляющего совокупность нормальных наблюдений, на котором можно было бы обучить алгоритм.
2.7.3.1. Подгонка эллиптической оболочки
Один из распространённых способов обнаружения выбросов — предположить, что нормальные данные принадлежат известному распределению (например, имеют гауссово распределение). Исходя из этого предположения, обычно пытаются определить «форму» данных и считать выбросами наблюдения, достаточно далеко отстоящие от подобранной формы.
В scikit-learn есть объект covariance.EllipticEnvelope, который подбирает устойчивую оценку ковариации данных, а затем строит эллипс вокруг центральных точек данных, игнорируя точки за пределами центральной моды.
Например, если предположить, что нормальные данные имеют гауссово распределение, объект устойчивым образом оценит положение и ковариацию нормальных наблюдений (то есть без влияния выбросов). Расстояния Махаланобиса, полученные на основе этой оценки, используются для определения степени отклонения от нормы. Эта стратегия показана ниже.
Примеры
- См. Устойчивая оценка ковариации и значимость расстояний Махаланобиса: в примере показана разница между стандартной (
covariance.EmpiricalCovariance) и устойчивой (covariance.MinCovDet) оценками положения и ковариации при определении степени отклонения наблюдения от нормы. - См. Обнаружение выбросов в реальном наборе данных: в примере показана устойчивая оценка ковариации на реальном наборе данных.
Ссылки
- Rousseeuw, P.J., Van Driessen, K. «Быстрый алгоритм для оценщика минимального определителя ковариации» Technometrics 41(3), 212 (1999)
2.7.3.2. Isolation Forest
Один из эффективных способов обнаружения выбросов в наборах данных высокой размерности — использование случайных лесов. ensemble.IsolationForest «изолирует» наблюдения, случайным образом выбирая признак, а затем случайное значение разделения между минимальным и максимальным значениями выбранного признака.
Поскольку рекурсивное разбиение можно представить в виде дерева, количество разбиений, необходимых для изоляции образца, соответствует длине пути от корневого узла до конечного.
Длина этого пути, усреднённая по ансамблю таких случайных деревьев, служит мерой нормальности и функцией принятия решения.
Случайное разбиение приводит к заметно более коротким путям для аномалий. Поэтому, если ансамбль случайных деревьев в совокупности создаёт более короткие пути для некоторых образцов, весьма вероятно, что они являются аномалиями.
Реализация ensemble.IsolationForest основана на ансамбле tree.ExtraTreeRegressor. В соответствии с оригинальной статьёй об Isolation Forest максимальная глубина каждого дерева равна \(\lceil \log_2(n) \rceil\), где \(n\) — количество образцов, использованных для построения дерева (подробности см. в [1]).
Работа алгоритма показана ниже.
ensemble.IsolationForest поддерживает warm_start=True, позволяющий добавлять деревья к уже обученной модели:
>>> from sklearn.ensemble import IsolationForest >>> import numpy as np >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [0, 0], [-20, 50], [3, 5]]) >>> clf = IsolationForest(n_estimators=10, warm_start=True) >>> clf.fit(X) # fit 10 trees >>> clf.set_params(n_estimators=20) # add 10 more trees >>> clf.fit(X) # fit the added trees
Примеры
- См. Пример IsolationForest, где показано использование IsolationForest.
- См. Сравнение алгоритмов обнаружения аномалий для выявления выбросов в искусственных наборах данных: здесь
ensemble.IsolationForestсравнивается сneighbors.LocalOutlierFactor,svm.OneClassSVM(настроенным для работы в качестве метода обнаружения выбросов),linear_model.SGDOneClassSVMи методом обнаружения выбросов на основе ковариации с помощьюcovariance.EllipticEnvelope.
Ссылки
2.7.3.3. Локальный коэффициент выброса
Ещё один эффективный способ обнаружения выбросов в наборах данных умеренно высокой размерности — алгоритм Local Outlier Factor (LOF).
Алгоритм neighbors.LocalOutlierFactor (LOF) вычисляет оценку (называемую локальным коэффициентом выброса), отражающую степень аномальности наблюдений. Он измеряет отклонение локальной плотности заданной точки данных от плотности её соседей. Идея состоит в том, чтобы обнаружить образцы, плотность которых значительно ниже, чем у их соседей.
На практике локальная плотность определяется по k ближайшим соседям. Оценка LOF для наблюдения равна отношению средней локальной плотности его k ближайших соседей к его собственной локальной плотности: ожидается, что плотность нормального экземпляра будет похожа на плотность его соседей, тогда как плотность аномальных данных будет значительно ниже.
Число учитываемых соседей k (также называемое параметром n_neighbors) обычно выбирают так, чтобы оно 1) превышало минимальное количество объектов в кластере, позволяя считать другие объекты локальными выбросами относительно этого кластера, и 2) было меньше максимального количества близких объектов, которые потенциально могут быть локальными выбросами. На практике такая информация обычно недоступна, и в целом хорошо работает значение n_neighbors=20. Если доля выбросов велика (то есть превышает 10 %, как в примере ниже), значение n_neighbors следует увеличить (в примере ниже оно равно n_neighbors=35).
Преимущество алгоритма LOF в том, что он учитывает как локальные, так и глобальные свойства наборов данных: он может хорошо работать даже с наборами данных, в которых аномальные образцы имеют разную плотность. Вопрос заключается не в том, насколько изолирован образец, а в том, насколько он изолирован относительно окружающего его соседства.
При использовании LOF для обнаружения выбросов методы predict, decision_function и score_samples недоступны, есть только метод fit_predict. Оценки аномальности обучающих образцов доступны через атрибут negative_outlier_factor_. Обратите внимание, что predict, decision_function и score_samples можно применять к новым, ранее не встречавшимся данным при использовании LOF для обнаружения новизны, то есть если параметру novelty задано значение True, однако результат predict может отличаться от результата fit_predict. См. раздел Обнаружение новизны с помощью Local Outlier Factor.
Если задан параметр contamination, пороговое значение (называемое offset_) определяется как соответствующий процентиль оценок negative_outlier_factor_ на обучающих данных. Образцы с оценками строго ниже этого порога классифицируются как выбросы.
Эта стратегия показана ниже.
Примеры
- См. Обнаружение выбросов с помощью Local Outlier Factor (LOF), где показано использование
neighbors.LocalOutlierFactor. - См. Сравнение алгоритмов обнаружения аномалий для выявления выбросов в искусственных наборах данных, где метод сравнивается с другими методами обнаружения аномалий.
Ссылки
- Breunig, Kriegel, Ng и Sander (2000) LOF: обнаружение локальных выбросов на основе плотности. Proc. ACM SIGMOD
2.7.4. Обнаружение новизны с помощью Local Outlier Factor
Чтобы использовать neighbors.LocalOutlierFactor для обнаружения новизны, то есть предсказывать метки или вычислять оценку аномальности новых, ранее не встречавшихся данных, перед обучением оценщика необходимо создать его экземпляр, задав параметру novelty значение True:
lof = LocalOutlierFactor(novelty=True) lof.fit(X_train)
Обратите внимание, что в этом случае метод fit_predict недоступен, чтобы избежать несогласованных результатов.
Предупреждение
Обнаружение новизны с помощью Local Outlier Factor
Если параметру novelty задано значение True, имейте в виду, что методы predict, decision_function и score_samples следует применять только к новым, ранее не встречавшимся данным, а не к обучающим образцам, иначе результаты будут неверными. Иными словами, результат predict не будет совпадать с fit_predict. Оценки аномальности обучающих образцов всегда доступны через атрибут negative_outlier_factor_.
Обнаружение новизны с помощью neighbors.LocalOutlierFactor показано ниже (см. Обнаружение новизны с помощью Local Outlier Factor (LOF)).
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/modules/outlier_detection.html