2012-04-24 1 views
6

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

Быстрый обзор проблемы:

  • Около 5 миллионов примеров обучения
  • Добавление примеров обучения в размере 2-4 млн в год
  • примеры обучения в настоящее время содержат 10 функций каждый
  • Примерно 400 тыс. Населенных пунктов (из гораздо большего общего пространства)
  • Дополнительные функции, добавленные с течением времени
  • Переподготовка или адаптации модели (по крайней мере) ежедневно включать новые примеры
  • критерии оптимизации: минимальный квадрат процент ошибки
  • Выход: один вещественный номер

У меня есть некоторый опыт обучения протоколирование линейные модели по задачам классификации по одинаковому размеру (с использованием SVM, усредненные и голосовые перцептроны и т. д.). Возможность добавлять произвольные функции важна, но в этом случае также полезно время обучения.

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

Я успешно обучил усредненную модель Перцептрона (и быстро). Однако, насколько мне известно, AP обычно не применяется к регрессии. Предоставляет ли AP какие-либо гарантии конвергенции для модели регрессии? Есть ли другая формальная причина, которая не должна применяться? Или это разумное соответствие моим требованиям?

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

Потенциальные плюсы:

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

Спасибо за ваш вклад.

+0

Для классификации у меня был большой успех со стохастическими SVM с уменьшением градиента (http://leon.bottou.org/projects/sgd#) - возможно, вы захотите приспособить его для регрессии. – etarion

ответ

7

Это классическая проблема с крупномасштабным SVM. Модель SVM нужно будет переучивать, если новые функции будут добавлены, и если новые данные будут добавлены, если вы не используете онлайн-svm. Некоторые опции:

Практические варианты (с полкой):

LIBLINEAR - Если вы можете сделать Linear SVM есть некоторые алгоритмы, которые используют преимущество линейного ядра, чтобы обеспечить лучше, чем квадратичное время обучения.Проверьте LIBLINEAR, который находится в той же исследовательской группе, что и libsvm. Они просто добавили регрессию в версии 1.91, выпущенной вчера. http://www.csie.ntu.edu.tw/~cjlin/liblinear/

Oracle ODM - У Oracle есть SVM, доступный в их пакете ODM. Они применяют практический подход, чтобы в основном обеспечить «достаточно хороший» SVM, не заплатив вычислительных затрат на поиск действительно оптимального решения. Они используют несколько методов отбора проб и выбора модели - вы можете найти информацию о том, что здесь: http://www.oracle.com/technetwork/database/options/advanced-analytics/odm/overview/support-vector-machines-paper-1205-129825.pdf

SHOGUN - сегуна Machine Learning Toolbox предназначена для широкомасштабного обучения, они взаимодействуют с рядом реализаций SVM, а также другие методы. Я никогда не использовал его, но это может быть стоит посмотреть: http://www.shogun-toolbox.org

Kernel-machines.org имеет список программных пакетов: http://www.kernel-machines.org/software

Другого SVM исследование

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

Инструменты для изучения алгоритмов

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

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

WEKA - Weka - это прекрасный инструмент для изучения ваших возможностей. Я бы использовал WEKA, чтобы попробовать подмножества ваших данных в разных алгоритмах. Исходный код открыт и в java, если вы выбрали что-то, что вы могли бы приспособить к вашим потребностям. http://www.cs.waikato.ac.nz/ml/weka/

R - Язык программирования R также реализует множество алгоритмов и аналогичен программированию в Matlab. http://www.r-project.org/

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

+0

Спасибо за редактирование vitalik :) – karenu

+0

Спасибо за подробный ответ. Я бы проголосовал более одного раза, если мог. ;-) Я думаю, что некоторое время назад я смотрел на LibLinear, когда работал над связанной проблемой, но передавал ее из-за времени обучения. Я не понимал, что он поддерживает линейное обучение. Похоже, это может быть очень хорошим вариантом. – AaronD

+0

Извините, я не сказал, что это было линейное время, лучше, чем квадратичное. Он использует линейное ядро. Он обеспечивает точное eps-решение в O (log (1/eps)) итерациях по стоимости O (ln) итераций, где l - количество точек тренировки, а n - среднее количество ненулевых элементов на экземпляр. Таким образом, чем реже ваши данные, тем ближе вы приближаетесь к линейному времени. – karenu

Смежные вопросы