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

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

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

Пример:

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

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 выделяется больше, чем ширина или глубина.

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

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

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

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

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

Итак, мой вопрос заключается в следующем:

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

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

4 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам