Регрессионные тесты на произвольных числовых последовательностях

Я пытаюсь найти метод для последовательности тестовых номеров регрессии.

Моя тестируемая система производит большое количество номеров для каждой версии системы (например, высота, ширина, глубина и т.д.). Эти номера варьируются от версии к версии неизвестным образом. Учитывая последовательность "хороших" версий и одну "новую" версию, я бы хотел найти последовательности, которые являются наиболее аномальными.

Пример:

"Хорошая" версия:

version    width   height   depth
   1        123      43      302 
   2        122      44      304
   3        120      46      300
   4        124      45      301

"Новая" версия:

   5        121      60      305

В этом случае я, очевидно, хотел бы найти последовательность высот, потому что значение 60 выделяется больше, чем ширина или глубина.

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

Числа в моих последовательностях не обязательно являются гауссовыми, распределенными по среднему значению, но часто довольно постоянными и лишь иногда порождают значение выброса, которое также представляется довольно постоянным, e. г. 10, 10, 10, 10, 10, 5, 10, 10, 10, 5, 10, 10, 10. В этом случае только на основе среднего и стандартного отклонения значение 10 не будет на 100% вероятнее всего в последовательность, а значение 5 было бы маловероятным.

Я рассматривал использование подхода с гистограммой и колебался там, чтобы спросить здесь сначала. Проблема с гистограммой заключалась бы в том, что мне нужно было бы хранить довольно много информации для каждой последовательности (в отличие от среднего и стандартного отклонения).

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

Я нашел библиотеку типа PyBrain, которая, на первый взгляд, обрабатывает числовые последовательности, а затем, по-видимому, пытается проанализировать их с помощью имитируемой нейронной сети. Я не уверен, что это будет для меня подход (и снова кажется, что мне нужно было хранить большой объем данных для каждой последовательности чисел, например, в полной нейронной сети).

Итак, мой вопрос таков:

Есть ли методика, алгоритм или научная дисциплина, которая поможет мне анализировать числовые последовательности, чтобы найти аномалии (в последнем значении)? Предпочтительно, при сохранении только небольших количеств данных на последовательность; -)

Для конкретных реализаций я бы предпочел Python, но подсказки на других языках также приветствуются.

Ответ 1

Вы можете использовать метод регрессии, называемый Gaussian process (GP), чтобы изучить кривую, а затем применить гауссовский процесс к следующему примеру в вашей последовательности.

Поскольку GP не только дает вам оценку для цели, но и уверенность, вы можете порог, основанный на уверенности, чтобы определить, что такое выброс.

Чтобы реализовать это, существуют различные панели инструментов (scikits.learn, shogun,...), но наиболее вероятно, что это GPy. Пример для 1-й регрессии, которую вы можете настроить для выполнения своей задачи, хорошо описан в следующем ноутбуке:

http://nbviewer.jupyter.org/github/SheffieldML/notebook/blob/master/GPy/basic_gp.ipynb

Ответ 2

Есть ли методика, алгоритм или научная дисциплина там который поможет мне проанализировать числовые последовательности, чтобы найти отклонения (в последнее значение)?

Научная сфера, которую вы ищете, называется обнаружением/обнаружением аномалий. Существует много методов и алгоритмов, которые вы можете использовать. В качестве отправной точки, возможно, посмотрите на wikipedia здесь (обнаружение outlier) и (обнаружение аномалий). Существует также аналогичный вопрос на stats.stackexchange.com и один на datascience.stackexchange.com, который ориентирован на python.

Вы также должны подумать о том, что хуже в вашем случае, ложных срабатываний (ошибка типа 1) или ложных негативах (ошибка типа 2), так как уменьшение процента одного из этих типов ошибок увеличивает процентное соотношение другого.

РЕДАКТИРОВАТЬ: учитывая, что в некоторых случаях ваше требование с несколькими пиками, плоские распределения в других случаях, может работать такой алгоритм:

1.) подсчитайте количество вхождений каждого отдельного номера в вашей последовательности и поместите счет в ячейку, соответствующую этому номеру (начальная ширина буфера = 1)

2.) итерации через бункеры: если один бит подсчитывает больше, чем, например,. 10% (параметр a) от общего количества значений в вашей последовательности, отметьте номера этого бункера как "хорошие значения"

3.) увеличьте ширину ячейки на 1 и повторите шаги 1 и 2

4.) повторите шаг 1-3 до тех пор, пока, например, 90% (параметр b) номеров в вашей последовательности помечены как "хорошие значения"

5.), чтобы тестовые примеры для плохих значений терпят неудачу

Этот алгоритм должен работать для таких случаев, как:

  • один большой пик с некоторыми выбросами

  • несколько больших пиков и некоторые выбросы между

  • плоское распределение с концентрацией в определенной области (или в нескольких областях)

  • числовые последовательности, в которых все числа равны

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

Примечание. Чтобы проверить, к какому бину принадлежит значение, вы можете использовать оператор modulo (%), например. если размер буфера равен 3, а у вас есть значения 475,476,477,478,479, имя бункера соответствует значению, где его по модулю с размером буфера равен нулю → 477% 3 = 0 → положить 477, 478 и 479 в корзину 477.

Ответ 3

Интересно, могут ли разные столбцы в ваших данных обрабатываться по-разному? Уместно ли, например, обрабатывать ширину с помощью проверки "близко к средней"; другой столбец со значением, показанным в наборе хороших примеров; третий столбец может быть обработан "В существующем кластере из кластеризации K-примеров хороших примеров".

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

Хмм, это не ограничивается отдельными столбцами - если, например, существует некоторая связь между значениями столбцов, то это может быть проверено тоже - возможно, ширина разницы высот ограничена; или объем имеет ограничения.

Время: может быть, что последовательные значения могут лишь отклоняться каким-то определенным образом на какое-то значение. Если, например, стороны непрерывно изменялись некоторыми роботами, а время между измерениями было достаточно коротким, то это ограничивало бы значения дельта между последовательными показаниями к тому, что может создать роботизированный механизм при правильной работе.

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

Ответ 4

Я не уверен, правильно ли я вас понимаю, но я думаю, вы хотите предсказать, является ли образец, представленный вам (после того, как он прошел последовательность предыдущих примеров) аномально или нет? Следовательно, вы подразумеваете какую-то временную зависимость от нового образца?

Если у вас много учебных данных i. е. (сотни или тысячи) примеров (помеченных) хороших и плохих последовательностей, тогда вы могли бы обучить нейронную архитектуру классифицировать, если "следующий элемент в последовательности" является аномальным или нет. Вы могли бы обучить архитектуру LSTM (длинной короткой памяти), которая бы обобщала над входными последовательностями, чтобы точно классифицировать новый образец, представленный архитектуре.

LSTM будут доступны в любой хорошей библиотеке нейронной сети, и в основном вы будете запускать обычную программу под наблюдением. Учебники об этом доступны через Интернет и в любой хорошей книге машинного обучения (ML).

Как всегда в ML, позаботьтесь о несовместимости!