Какова степень сходства между обучающими данными и данными о доходах?

Вопрос или проблема

Я пытаюсь использовать методы кластеризации и классификации, такие как SVM, с использованием scikit-learn. Я также изучаю детекцию выбросов/новизны.

Мне нужна что-то вроде полуподконтрольной модели. Я хочу предсказать некоторые метки классов, однако не могу обучить свою модель на некоторых аномалиях/новых поведениях, которые в конечном итоге будут происходить.

Я работаю с вибрацией моторов, я буду обучать свою модель на вибрации, когда они “ВКЛЮЧЕНЫ”, и на вибрации, когда они “ВЫКЛЮЧЕНЫ”.

Со временем вибрация в состоянии “ВКЛЮЧЕН” начнет немного отличаться из-за некоторых дефектов, однако, если я просто обучу на “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН”, то, конечно, он продолжит определять, что мой мотор “ВКЛЮЧЕН”, потому что вибрация с дефектами ближе к модели “ВКЛЮЧЕН”.

Поэтому я хотел бы определить, насколько далеко мои новые данные от данных, на которых я уже обучил свою модель.

Например, 1 – мой predict_prob возвращает “ВКЛЮЧЕН” потому что имеет $98$% шансов быть “ВКЛЮЧЕННЫМ” и $2$% шансов быть “ВЫКЛЮЧЕННЫМ”. Пока что все хорошо, однако мои ДАННЫЕ немного отличаются от режима “ВКЛЮЧЕН” в обучающих данных, так что я хотел бы измерить эту разницу, например, чтобы было $98$% вероятности быть “ВКЛЮЧЕННЫМ” в диапазоне от “ВКЛЮЧЕН” до “ВЫКЛЮЧЕН” и $95$% схожести с оригинальной моделью, и со временем это число будет уменьшаться. Например:

1 день: $98$% быть “ВКЛЮЧЕННЫМ” $2$% быть “ВЫКЛЮЧЕННЫМ” и $95$% схожести с обучающими данными

2 день: $98$% быть “ВКЛЮЧЕННЫМ” $2$% быть “ВЫКЛЮЧЕННЫМ” и $93$% схожести с обучающими данными

3 день: $99$% быть “ВКЛЮЧЕННЫМ” $1$% быть “ВЫКЛЮЧЕННЫМ” и $90$% схожести с обучающими данными

4 день: $95$% быть “ВКЛЮЧЕННЫМ” $5$% быть “ВЫКЛЮЧЕННЫМ” и $85$% схожести с обучающими данными

Кто-нибудь может помочь мне с этой частью “и $85$% схожести с обучающими данными“?

Я думаю, что понял вашу трудность. Вы пытаетесь обнаружить дефектные моторы, в то время как есть более чем одно состояние, в котором они не дефектные. Я предполагаю, что даже когда мотор выключен, датчики всё равно захватывают “шумовые” вибрации. У вас есть две разные известные модели: “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН”, т.е. “ВЫКЛЮЧЕН” – это не просто отсутствие вибрации. Я вижу два варианта для этой классификации (ниже), но сначала давайте сделаем небольшое отклонение:

и 85% схожести с обучающими данными

Большинство техник машинного обучения основаны на мерах расстояния: обучающие данные используются для определения облаков (например, распределений) в (возможно, очень высокоразмерном) пространстве, по одному для каждого класса. Классы новых образцов предсказываются путем сравнения их расстояния до облаков класса – ближайшее облако является предсказанным классом.

Теперь это значит, что вероятность классификации является схожестью с обучающими данными. Вероятности в диапазонах (0.9, 0.1) или (0.8, 0.2) очень схожи с обучающими данными, в то время как вероятности в диапазонах (0.6, 0.4) или (0.5, 0.5) наиболее вероятно отличаются от обучающих данных. Это приводит нас к одному решению, которое вы можете попробовать:


Понимание вероятностей как расстояний

Вероятности (.predict_proba) моделей, таких как SVM в sklearn, являются буквально расстояниями, в случае SVM расстояния находятся внутри опорных векторов. Другими словами, мы можем понимать их как расстояния между центральными точками двух облаков: “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН”. Например:

classification

Это означает, что при условии двух вещей:

  1. Что классы “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН” хорошо разделены (между ними есть разумное расстояние), и,
  2. Дефектные моторы будут производить меньше вибраций, чем моторы “ВКЛЮЧЕН”, но больше вибраций, чем моторы “ВЫКЛЮЧЕН” (меня это немного беспокоит, но держитесь со мной).

Мы можем сказать, что:

  1. Любая пара вероятностей, похожая на (0.8, 0.2), означает, что у нас есть мотор “ВКЛЮЧЕН” или “ВЫКЛЮЧЕН”. Другими словами, если у нас есть хотя бы один из классов с вероятностью выше, скажем, 80%, мы достаточно близки к облакам обучающих данных.
  2. Если вероятность “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН” где-то около 50%, то у нас очень вероятно дефектный мотор.

Каждый может выбрать порог вероятности по своему усмотрению (будь то 80%, 70% или 90%), как способ регулировки для ложных срабатываний или пропуска.

Проблемы с этим решением

  • Предположение, что дефектный мотор будет иметь вибрации между классами “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН”. То есть, если дефект заставит мотор вибрировать больше, чем обычный “ВКЛЮЧЕН”, это будет недоступно для обнаружения с помощью этого решения.
  • Предполагает линейность и одинаковый масштаб расстояний от “ВКЛЮЧЕН” и от “ВЫКЛЮЧЕН” для дефектных моторов. То есть, классы имеют одинаковый размер и равномерно распределены. Такое решение будет проверять расстояния от каждого класса, используя один и тот же линейный масштаб (порог), оно может не обнаруживать дефекты, которые происходят близко к меньшему классу.

Используйте детекцию новизны

У вас есть два известных класса: “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН”. Но что вы пытаетесь найти, так это является ли мотор дефектным или нет, где мы понимаем не дефектный как то, что мотор очень похож на большинство моторов “ВКЛЮЧЕН” или очень похож на большинство моторов “ВЫКЛЮЧЕН”.

Забудьте о классах “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН” и объедините оба набора образцов не дефектных моторов в один единственный (не дефектный) класс и используйте алгоритм детекции новизны. Другими словами, не различайте моторы “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН”. Скажите, что оба случая (ВКЛЮЧЕН и ВЫКЛЮЧЕН) в порядке, просто всё, что довольно далеко от любых известных случаев, не в порядке. Это будет выглядеть как кучка облаков в пространстве, и всё, что далеко от этих облаков, является дефектным мотором.

Я предложу начать с One Class SVM, потому что у него есть параметр nu=, который довольно легко интерпретировать. Он варьируется от 0 до 1, и чем ближе он к нулю, тем более алгоритм позволяет аномалиям (дефектам) находиться вдали от облаков.

novelty

Обратите внимание, что у нас есть точно те же точки на этой картинке, что и на предыдущей. Единственное отличие в том, что на этот раз все они красные.

Это решение справится с дефектами, которые находятся в любом месте, не только между состояниями “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН”.

Проблемы с этим решением

  • One Class SVM не имеет .predict_proba. Чтобы получить оценку того, насколько далеко от облака находится аномалия, помеченная как аномалия, необходимо оценить .decision_function модели и отслеживать расстояния самостоятельно.
  • Даже если классы “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН” хорошо разделены, будут ложные срабатывания и пропуски. Очень низкий параметр nu= все равно не сможет выйти за пределы облаков. Использование Isolation Forest может позволить лучшую настройку, но функция решения будет еще более сложной для получения расстояний. Другой вариант – добавить маргинальные версии “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН” в обучающие данные, но найти их может быть непросто.

П.С. Если нужно классифицировать как “ВКЛЮЧЕН” и “ВЫКЛЮЧЕН”, И классифицировать дефектные и не дефектные моторы, то следует построить две отдельные модели.

Ответ или решение

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

1. Понимание вероятностей как меры сходства

Ваша модель, основанная на методах кластеризации и классификации, таких как SVM (поддерживающие векторные машины), предоставляет вероятностные оценки классов (например, "ВКЛ" и "ВЫКЛ"). Эти вероятности можно интерпретировать как расстояние до центров классов в многомерном пространстве, где классы представлены "блыбами" (или кластерами).

  • Сходство и расстояние: чем выше вероятность, тем ближе новая вибрация к обучающим данным. Например:
    • Значения вероятностей (0.9, 0.1) указывают на то, что новые данные очень близки к классу "ВКЛ", что говорит о высоком уровне сходства.
    • Значения (0.5, 0.5) указывают на неопределенность и, вероятно, на наличие аномалии.

2. Вычисление степени сходства

Предлагаемое вами измерение, например "85% сходства с обучающими данными", можно реализовать с использованием различных метрик расстояния между векторами характеристик новых данных и центрами классов. Вот несколько шагов:

  • Нормализация данных: Убедитесь, что ваши данные нормализованы (например, с помощью метода MinMaxScaler или StandardScaler из scikit-learn) для корректного вычисления расстояний.
  • Метрики расстояния: Используйте дополнительные метрики, такие как Евклидово расстояние или Косинусное сходство, чтобы измерить, насколько далеко новые данные находятся от кластеров ON и OFF.
  • Определение порогов сходства: Установите пороги, при превышении которых вы бы считали данные "сходными" с уже известными классовыми центрами. Например, если расстояние до класса "ВКЛ" меньше опорной величины, вы можете принять это как признак нормального состояния.

3. Нанесение новых данных на модель

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

import numpy as np
from sklearn.metrics import pairwise_distances

# Примерный алгоритм для оценки сходства
threshold_distance = 0.2  # Определите значимый уровень
new_data = [...]  # ваши новые данные
# centre_of_ON и centre_of_OFF должны быть заранее рассчитаны
probs = model.predict_proba(new_data)
distances = pairwise_distances(new_data, [centre_of_ON, centre_of_OFF])

for i, prob in enumerate(probs):
    # Проверка вероятности и расстояния
    if distances[i][0] < threshold_distance and prob[0] > 0.8:  # класс ON
        print(f"Данные {i}: ВКЛ, 100% схожести")
    elif distances[i][1] < threshold_distance and prob[1] > 0.8:  # класс OFF
        print(f"Данные {i}: ВЫКЛ, 100% схожести")
    else:
        print(f"Данные {i}: Аномалия, схожесть менее 80%")

4. Использование методов детекции аномалий

Вы можете рассмотреть применение алгоритмов детекции аномалий, таких как One-Class SVM, если предположить, что все ваши данные должны быть похожи на известные классы (ON и OFF). Это позволит вам выявлять данные, которые значительно удалены от "блыб", что может указывать на дефект.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...