Самая быстрая реализация SVM

16

Больше общего вопроса. Я использую rbf SVM для прогнозного моделирования. Я думаю, что моя текущая программа определенно нуждается в ускорении. Я использую Scikit Learn с грубым, чтобы точный поиск сетки + перекрестная проверка.

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

томас
источник
1
SGDClassifier в scikit-learn очень быстрый, но для линейных SVM. Вы могли бы попросить парней, изучающих scikit, также добавить тег scikit-learn.
Денис
Нелинейное ядро ​​SVM обречено быть медленным. Возможно, вам следует начать играть с линейными моделями (посмотрите Vowpal Wabbit), а затем перейти к нелинейным. Вы даже можете получить некоторую нелинейность, создав более сложные функции с линейными моделями. Нередко нелинейные модели приводят к некоторому увеличению производительности при больших вычислительных затратах. Ничего не имею против нелинейного ядра SVM, но просто имейте в виду, с практической точки зрения.
Владислав Довгальец
1
Вы можете ускорить работу, используя специализированные библиотеки настройки для поиска гиперпараметров, которые более эффективны, чем поиск по сетке (т. Е. Требуют гораздо меньшего количества наборов гиперпараметров). Примеры библиотек настройки включают Optunity и Hyperopt.
Марк Клазен

Ответы:

16

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

Там даже пакет R !

Zach
источник
Ваша ссылка теперь говорит, что «пакет« RSofia »был удален из репозитория CRAN». Есть идеи почему?
Джеймс Хиршорн
@JamesHirschorn Разработчик, вероятно, прекратил поддерживать его. Вы можете установить его из архива CRAN.
Зак
10

Самое простое ускорение, которое вы получите, - это параллельная проверка. Лично мне нравится карета пакет в R , который использует foreach в качестве бэкэнда. Это позволяет очень легко распределять перекрестную проверку и поиск по сетке на несколько ядер или несколько компьютеров.

Caret может работать со многими различными моделями, включая SVM rbf:

library(caret)
library(doMC)
registerDoMC()
model <-  train(Species ~ ., data = iris, method="svmRadial", 
    trControl=trainControl(method='cv', number=10))
> confusionMatrix(model)
Cross-Validated (10 fold) Confusion Matrix 

(entries are percentages of table totals)

            Reference
Prediction   setosa versicolor virginica
  setosa       32.4        0.0       0.0
  versicolor    0.0       30.9       2.0
  virginica     0.9        2.4      31.3

Обратите внимание, что библиотека doMC () доступна только для Mac и Linux, ее следует запускать из командной строки, а не из графического интерфейса, и она ломает любые модели из RWeka. Также легко использовать кластеры MPI или SNOW в качестве параллельного бэкэнда, у которого нет этих проблем.

Zach
источник
Спасибо Зак. Я считаю, что у scikits также есть возможность проходить перекрестную проверку параллельно, что я и планирую делать. Исключая это, любые другие предложения по ускорению? Благодарю.
Томас
@danjeharry: параллельная перекрестная проверка на самом деле является очень слабым результатом, и я настоятельно рекомендую вам сначала изучить это. Кроме того, я не знаю много о том, как конкретно ускорить SVM. Если вы можете найти параллельный алгоритм SVM, это тоже может быть хорошей идеей. Сколько строк / столбцов содержит набор данных, который вы используете для обучения?
Зак
Спасибо Зак я посмотрю в параллельном резюме. Я делаю около 650 атрибутов и 5000 примеров.
Томас
4

Я понимаю, что это довольно старый вопрос, но также возможно (в зависимости от размера вашего набора данных он может быть более или менее эффективным) использовать низкоразмерные аппроксимации карты характеристик ядра, а затем использовать ее в линейном SVM. См. Http://scikit-learn.org/stable/modules/kernel_approximation.html.

Мэтью Зальц
источник
2

Взгляните на многопроцессорный модуль Python . Это делает распараллеливание действительно простым и идеально подходит для перекрестной проверки.

bayerj
источник
2

R имеет большой GPU-ускорение SVM пакет rpusvm , она занимает ~ 20 секунд , чтобы тренироваться на 20K образцов * 100 размеров, и я обнаружил , что процессор никогда не перегружать его, поэтому он эффективно использует GPU. Однако для этого требуется графический процессор NVIDIA.

Лео
источник
1

Оповещение: Это бесстыдная вилка.

Рассмотрим DynaML библиотеку ML на базе Scala, над которой я работаю. Я реализовал LS-SVM на основе ядра (векторные машины поддержки наименьших квадратов) вместе с автоматической настройкой ядра, используя поиск по сетке или сопряженный имитированный отжиг.

http://mandar2812.github.io/DynaML/

mandar2812
источник