OneClassSVM: проверяем новые объекты на необычность

Для оборудования накоплены примеры нормального режима, но достоверных поломок мало. Обычный классификатор требует размеченные классы. Можно начать с другой задачи: найти новые объекты, которые отличаются от изученного нормального режима.

Задать смысл обучающего набора

OneClassSVM оценивает область, в которой находятся типичные обучающие объекты. В задаче обнаружения новизны fit получает подготовленные нормальные наблюдения. Новый объект вне изученной области получает метку −1, внутри — 1. Это обозначения решения алгоритма, а не привычные классы 0 и 1 из бинарной классификации.

Метка −1 означает основание для проверки, но не доказанную поломку. Причиной может быть новый допустимый режим, другой масштаб измерения или ошибка датчика. Поэтому выход полезно назвать requires_review, сохранив числовой результат отдельно. Так система не выдаёт необычность за известный диагноз.

Проверить знак числового выхода

decision_function даёт подписанное значение относительно границы. Положительное соответствует стороне inlier, отрицательное — стороне outlier. Это не вероятность поломки. Не преобразуйте его в проценты просто умножением на сто.

В примере нормальные наблюдения лежат около нуля. Новая точка в центре и точка далеко снаружи получают разные решения. Признаки имеют одну заранее определённую шкалу, поэтому различие видно без дополнительных преобразований. В многомерной задаче относительный масштаб признаков особенно важен для ядра и расстояний.

from sklearn.svm import OneClassSVM

normal = [[-0.2], [-0.15], [-0.1], [-0.05], [0.0],
          [0.05], [0.1], [0.15], [0.2]]
model = OneClassSVM(kernel="rbf", gamma=1.0, nu=0.2).fit(normal)
new_objects = [[0.0], [5.0]]
labels = model.predict(new_objects).tolist()
scores = model.decision_function(new_objects).tolist()
assert labels == [1, -1]
assert scores[0] > 0 and scores[1] < 0
records = [{"label": label, "score": score,
            "requires_review": label == -1}
           for label, score in zip(labels, scores)]
assert not records[0]["requires_review"]
assert records[1]["requires_review"]
print(records)

Что делать с новыми режимами

Проверьте подозрительные объекты с владельцем процесса. Если новый режим допустим, он может стать частью следующего нормального обучающего снимка. Не добавляйте все отклонённые точки автоматически: тогда реальные неисправности постепенно сформируют новую норму.

Параметры nu и gamma влияют на форму границы и число отмеченных объектов. nu не задаёт гарантированную долю поломок в будущем потоке. Подбирайте режим по задаче проверки и доступным подтверждённым случаям. При изменении шкалы измерения сначала восстановите правильный контракт входа, затем решайте вопрос переобучения.

Закрепить базовую операцию

В первом открытом уроке fit и predict вы отработаете сам цикл обучения и применения модели. После этого сравните его с OneClassSVM: fit здесь использует нормальные наблюдения без целевого столбца, а смысл меток требует отдельного объяснения. Откройте урок «Первый fit и predict на своих данных». Затем вернитесь к сценарию статьи и проверьте его на своём небольшом наборе. Посмотрите программу курса первой ML-модели, чтобы пройти путь от обучения к использованию результата.

Продолжить на практике