Машина опорных векторов для Java?

Я хотел бы написать «умный монитор» на Java, который отправляет предупреждение каждый раз, когда он обнаруживает возникающие проблемы с производительностью. Мое приложение Java записывает данные в структурированном формате в файл журнала:

<datetime> | <java-method> | <seconds-to-execute>

Так, например, если бы у меня был метод Widget#doSomething(String), выполнение которого заняло 812 мс, он был бы зарегистрирован как:

2013-03-24 11:39:21 | Widget#doSomething(String) | 812

Когда производительность начинает снижаться (например, во время крупного сбора данных, во время пиковых нагрузок или если система просто замедляется до обхода), время выполнения метода начинает замедляться; поэтому самый правый столбец начинает видеть огромные числа (иногда 20-40 секунд для выполнения одного метода).

В колледже — для упражнения по машинному обучению — я написал то, что мой профессор назвал линейным дихотомизатором, который брал простые тестовые данные (рост, вес и пол человека) и «узнавал», как категоризировать человека. как мужчина или женщина в зависимости от их роста/веса. Затем, когда у него были все данные для обучения, мы снабдили его новыми данными, чтобы увидеть, насколько точно он может определить пол.

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

  • Run in a "test mode" where I feed it the structured log file from my main Java app (the one I wish to monitor) and it takes each log entry (as shown above) and uses it for test data
    • Only the java-method and seconds-to-execute columns are important as inputs/test data; I don't care about the datetime
  • Запуск в «режиме мониторинга», где он активно считывает новые данные журнала из файла журнала и использует аналогичные методы «машинного обучения», чтобы определить, не надвигается ли снижение производительности.

Важно отметить, что столбец seconds-to-execute — не единственный важный фактор здесь, так как я видел ужасные тайминги для определенных методов в периоды потрясающей производительности и действительно отличные тайминги для других методов в периоды, когда казалось, что сервер вот-вот выйдет из строя. умереть и толкнуть маргаритки. Таким образом, очевидно, что некоторые методы являются "взвешенными"/более важными для производительности, чем другие.

Мой вопрос

  • Поиск в Google «линейного дихотомизатора» или «машины опорных векторов» выдает несколько действительно страшных, высоко академических, ультрамозговых официальных документов, которые у меня просто нет ни умственной энергии (ни времени), чтобы их прочесть — если они действительно не являются моими единственными. опции; поэтому я спрашиваю есть ли введение в этот материал для непрофессионалов или отличный сайт/статья/руководство по созданию такой системы на Java?
  • Существуют ли надежные/стабильные библиотеки Java с открытым исходным кодом? Мне удалось найти только jlibsvm и svmlearn, но первый, похоже, находится в чистом бета-состоянии, а второй, похоже, поддерживает только бинарные решения (как мой старый линейный дихотомизатор). Я знаю, что есть Mahout, но он находится поверх Hadoop, и я не думаю, что у меня достаточно данных чтобы гарантировать время и умственную энергию для настройки моего собственного кластера Hadoop.

Заранее спасибо!


person IAmYourFaja    schedule 25.03.2013    source источник
comment
Это не имеет прямого отношения к вашему вопросу, но ... страшные академические статьи являются нормой для таких областей, как и приличное количество математики. Например, я давно интересовался нейронными сетями. Для финального проекта в одном из моих мастер-классов я решил реализовать распознавание рукописных цифр. Мне потребовалось 3 полных дня беглого просмотра документов (чтения основных разделов), чтения кода и написания кода, прежде чем я получил приличное представление о предмете. Мой совет: выберите самый вводный материал и начните с него. В общем, ожидайте, что придется читать! Удачи!   -  person Vivin Paliath    schedule 26.03.2013
comment
Хороший вопрос @VivinPaliath (+1) - я думаю, я не против закатать рукава, я просто знаю, что если есть что-то с открытым исходным кодом, это будет написано более умными (и более информированными) людьми, чем я !   -  person IAmYourFaja    schedule 26.03.2013
comment
Я предпочитаю Java для разработки, но когда я сталкиваюсь с проблемами машинного обучения, я обращаюсь к R. Пакеты обычно очень зрелые и хорошо документированы. Здесь представлена ​​документация с примерами использования SVM. в R. Я использую мост, который называется JRI, чтобы встроить R в мой код Java.   -  person Felix Dobslaw    schedule 26.03.2013
comment
Я не уверен, что SVM — лучший инструмент, но мне нравится, как это объясняется в этом видео Эндрю Нг: youtube.com/watch?v=dzuuNPmGAVU   -  person bendaizer    schedule 26.03.2013


Ответы (4)


«Умный монитор», который вы описываете, является классификацией временных рядов.

Существует множество алгоритмов классификации. Все они в основном берут матрицу, где строки — это наблюдения, а столбцы — это «функции», которые каким-то образом описывают наблюдение, и вектор меток строк длины, который имеет значение либо 0, либо 1. В вашей задаче наблюдение может быть мельчайшей выборкой. , и ваш вектор меток будет иметь значение 1 для периодов времени, когда возникают проблемы с производительностью, и 0 в противном случае.

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

Генерация функций является важной частью. Я бы, вероятно, начал с двух признаков: необработанных значений и (один раз) различных значений между наблюдениями x_i и x_i-1. Мы определим их для задержки 2. Технически это 4 функции. Каждая функция не может смотреть в будущее. Каждая функция должна представлять одно и то же для каждого наблюдения.

Например, рассмотрим временной ряд длиной 10:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

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

Необработанные значения из 8 строк по 2 столбца будут

[[ 1.,  0.]
 [ 2.,  1.],
 [ 3.,  2.],
 [ 4.,  3.],
 [ 5.,  4.],
 [ 6.,  5.],
 [ 7.,  6.],
 [ 8.,  7.]]

различные значения

[[ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.],
 [ 1.,  1.]])

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

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

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

Сопоставьте свой классификатор с некоторой ранней частью данных, а затем оцените его точность по более поздней части данных. Существует множество метрик для классификаторов, которые вы можете использовать. Если вы решите использовать классификатор, который выводит вероятности вместо жесткого 1/0, ваши возможности даже расширятся. (Как и использование вашего классификатора.)

Точность и полнота — это интуитивно понятные показатели эффективности классификаторов.

Тренируйтесь на первой (ранней) половине ваших данных и тестируйте вторую половину (позже).

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

Mallet кажется хорошей библиотекой для этой задачи. см. эту часть документации.

Недавно я обнаружил JSAT, который выглядит многообещающе.

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

person Jessica Collins    schedule 25.03.2013
comment
В этом контексте стоит упомянуть логистическую регрессию. - person afrischke; 26.03.2013
comment
Ях. Линейным моделям следует отдавать предпочтение, а не нелинейным, если нет данных, позволяющих предположить повышение производительности. Логистическая регрессия также имеет дополнительный бонус в виде идеальной интерпретируемости. - person Jessica Collins; 26.03.2013

Если вы заинтересованы в использовании машин опорных векторов, есть руководство, которое очень ориентировано на новичков и может оказаться полезным (http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf)

Это руководство создано теми же ребятами из libsvm, которая является очень зрелой библиотекой для машин опорных векторов (http://www.csie.ntu.edu.tw/~cjlin/libsvm/), и у них есть привязка для Java (http://www.csie.ntu.edu.tw/~cjlin/libsvm/#java)

person Pedrom    schedule 26.03.2013

Weka — популярный пакет машинного обучения/интеллектуального анализа данных на Java. Эта книга http://guidetodatamining.com/ может оказаться полезной. На самом деле он не обращается к SVM, но у него определенно есть хорошие алгоритмы классификации, и он, конечно, совсем не эзотерический.

person archipelago_creature    schedule 26.03.2013

Возможно, Apache Spark MLlib Вам поможет:

Линейный SVM — это стандартный метод для крупномасштабных задач классификации. Это линейный метод, описанный выше в уравнении (1), с функцией потерь в формулировке, определяемой потерями на шарнире:

L(w;x,y):=max{0,1−ywTx}.

По умолчанию линейные SVM обучаются с регуляризацией L2. Мы также поддерживаем альтернативную регуляризацию L1. В этом случае задача становится линейной программой.

Алгоритм линейных SVM выводит модель SVM. Учитывая новую точку данных, обозначенную x, модель делает прогнозы на основе значения wTx. По умолчанию, если wTx≥0, результат положительный, в противном случае отрицательный.

person Hendy Irawan    schedule 05.03.2015