12

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

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

Пример:

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

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

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

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

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

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

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

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

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

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

+0

Да, я знаю, я прошу библиотеку ;-) Но, пожалуйста, сражайтесь с рефлектором, чтобы быстро отметить это как не по теме, потому что это вопрос для библиотеки. Если вы внимательно прочитаете весь вопрос, вы обнаружите, что я описываю много того, что я пробовал и рассматривал, и проблемы этих подходов. Вопрос, который у меня есть, заключается не в том, «какая библиотека лучше всего подходит для этого» (что не по сути тема направлена ​​на выход), но «есть ли какая-либо технология, решающая эту проблему».Я не думаю, что это вне темы. – Alfe

+0

Я обновил свой ответ, посмотрю на него, если он выполнит ваши требования. – user7291698

+0

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

ответ

1

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

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

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

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

+0

Установка была PITA, но результаты, которые я получил с этим, я ожидал :-) Увы, он только прогнозирует значения с одним единственным пиком на гистограмме (колючий или плоский, в зависимости от входных данных), поэтому ввод такие как (5, 2, 5, 2, 5, 5, 2, 2, 2, 5, 2, 5, 5, 2, 2, 5) с удовольствием принимают 3 или 4, хотя я бы назвал это явной новинкой/outlier. Если кто-то может предложить аналогичную простую в использовании библиотеку, которая также изучает такие вещи, вы избиты; в противном случае вы получите щедрость :) – Alfe

0

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

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

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

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

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

+0

Я ищу полностью автоматический подход к решению случаев, когда у меня есть произвольное и очень большое количество таких последовательностей. На самом деле в моем случае использования у меня есть сотни таких последовательностей, и в моих тестах регрессии я все время получаю ложные срабатывания из-за небольших изменений значений. Поэтому любой подход, связанный с проверкой последовательностей вручную, мне не подходит. Я хочу что-то, что я могу подпитывать значения, а затем «вычисляет», что значения могут выглядеть так, что для нового значения он дает вероятность того, что он является хорошим значением или нет. – Alfe

1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0

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

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

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

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

+0

Нейронные архитектуры обучения «feedforward» сложны, но достаточно хорошо поняты (по сравнению с 10 лет назад). Обучение повторяющихся архитектур (например, LSTM) еще более сложное. По моему собственному опыту, вы не получите немедленного решения нервной системы. Вместо этого вам нужно будет обмануть руки во всей дисциплине обучения этим сетям. – rnoodle