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-модели, чтобы пройти путь от обучения к использованию результата.
Продолжить на практике
- Машинное обучение с нуля на Python: первая модель ↗
Бесплатный курс машинного обучения на Python: обучите первую модель в scikit-learn, проверьте её качество и решите 106 задач в браузере.
