Учитывая временной ряд интервалов состояния датчика, как мне реализовать классификатор, который учится на основе контролируемых обучающих данных для обнаружения инцидента на основе последовательности интервалов состояния? Чтобы упростить проблему, состояния датчиков уменьшены до true
или false
.
Обновление: Я нашел этот документ (PDF) на Последовательности добычи временных интервалов , который решает аналогичную проблему. Другой документ (Google Docs) on Анализ иерархических временных шаблонов в многомерных временных рядах использует новый подход, но имеет дело с иерархическими данными.
Пример данных обучения
Следующие данные являются примером обучения для инцидента, представленного в виде графика во времени, где /¯¯¯\
представляет интервал состояния true
и \___/
интервал состояния false
для датчика.
Sensor | Sensor State over time
| 0....5....10...15...20...25... // timestamp
---------|--------------------------------
A | ¯¯¯¯¯¯¯¯¯¯¯¯\________/¯¯¯¯¯¯¯¯
B | ¯¯¯¯¯\___________________/¯¯¯¯
C | ______________________________ // no state change
D | /¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯\_/¯
E | _________________/¯¯¯¯¯¯¯¯\___
Обнаружение инцидентов, маркировка последовательностей и классификация
Сначала я обобщил свою проблему как проблему маркировки последовательностей из двух категорий, но мои категории действительно представляли «нормальную работу» и редкое «аварийное событие», поэтому я перефразировал свой вопрос как обнаружение инцидента. Доступны данные обучения для «нормальной работы» и «аварийной ситуации».
Чтобы уменьшить сложность проблемы, я дискретизировал сенсорные события для логических значений, но это не обязательно так.
Возможные алгоритмы
Скрытая модель Маркова представляется возможным решением, но сможет ли она использовать интервалы состояний? Если метка последовательности не лучший подход к этой проблеме, альтернативные предложения будут оценены.
Байесовский вероятностный подход
Активность сенсора будет значительно различаться в зависимости от времени суток (утром по утрам, ночью тихо). Мой первоначальный подход состоял в том, чтобы измерить нормальное состояние датчика в течение нескольких дней и вычислить вероятность состояния по времени суток (час). Суммарная вероятность состояний датчиков в неподходящий час, превышающий «порог вероятности», будет указывать на инцидент. Но казалось, что это вызвало бы ложную тревогу, если бы датчики были шумными. Я еще не реализовал это, но я считаю, что этот подход имеет свои преимущества.
Функция извлечения
Векторные состояния могут быть представлены как изменения интервала состояний, происходящие в определенное время и продолжающиеся определенную продолжительность.
struct StateInterval
{
int sensorID;
bool state;
DateTime timeStamp;
TimeSpan duration;
}
например. Некоторые государственные интервалы из таблицы процессов:
[ {D, true, 0, 3} ]; [ {D, false, 4, 1} ]; ...
[ {A, true, 0, 12} ]; [ {B, true, 0, 6} ]; [ {D, true, 0, 3} ]; etc.
Хороший классификатор будет учитывать интервалы значений состояния и недавние изменения состояния, чтобы определить, соответствует ли комбинация изменений состояния точным данным обучения для категории.
Редактировать: Некоторые идеи после сна о том, как извлечь элементы из данных тревоги нескольких датчиков и как сравнить их с предыдущими данными ...
Начните с вычисления следующих данных для каждого датчика для каждого часа дня:
- Средняя длина интервала состояний (для
true
и false
состояний)
- Среднее время между изменениями состояния
- Количество изменений состояния с течением времени
Затем каждый датчик можно сравнить с любым другим датчиком в матрице с данными, подобными следующим:
- Среднее время, за которое датчик B перешел в истинное состояние после того, как датчик A сделал. Если среднее значение составляет 60 секунд, то ожидание в 1 секунду будет более интересным, чем ожидание в 120 секунд.
- Среднее число изменений состояния датчика B, в течение которых датчик A находился в одном состоянии
Учитывая два набора обучающих данных, классификатор должен иметь возможность определять из этих наборов признаков, которая является наиболее вероятной категорией для классификации.
Является ли это разумным подходом и каким будет хороший алгоритм для сравнения этих функций?
Редактировать: направление изменения состояния (false->true
против true-false
) является значительным, поэтому любые функции должны учитывать это.