Найшвидша реалізація SVM


16

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

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


1
SGDClassifier у scikit-learning дуже швидкий, але для лінійних SVM. Ви можете запитати хлопців, які навчаються scikit, також додайте тег scikit-learn.
деніс

Нелінійне ядро ​​SVM приречене бути повільним. Можливо, вам слід почати грати з лінійними моделями (перевірити Vowpal Wabbit), а потім перейти до нелінійних. Можна навіть отримати деяку нелінійність, створивши складніші функції з лінійними моделями. Досить часто нелінійні моделі призводять до певного збільшення продуктивності за великих обчислювальних витрат. Нічого проти нелінійного ядра SVM, але просто мати на увазі, з практичної точки зору.
Владислав Довгалець

1
Можна прискорити використання спеціалізованих бібліотек настройки для пошуку гіперпараметрів, які є більш ефективними, ніж пошук в сітці (тобто вимагають тестування набагато менших наборів гіперпараметрів). Приклади налаштування бібліотек включають Optunity та Hyperopt.
Marc Claesen

Відповіді:


16

Алгоритм Софії Google містить надзвичайно швидку реалізацію лінійного SVM. Це одна з найшвидших SVM, але я думаю, що вона підтримує лише класифікацію та підтримує лише лінійні SVM.

Є навіть пакет R !


Зараз у вашому посиланні написано, що "пакет" RSofia "був видалений із сховища CRAN." Будь-яка ідея чому?
Джеймс Гіршорн

@JamesHirschorn Розробник, ймовірно, перестав його підтримувати. Ви можете встановити його з архіву CRAN.
Зак

10

Найпростіша швидкість, яку ви збираєтеся отримати, - це паралельне виконання крос-перевірки. Особисто мені подобається пакет карети в R , який використовує foreach як резервний. Це дуже легко обробляти перехресну перевірку та пошук сітки на декілька ядер або на декількох машинах.

Caret може працювати з багатьма різними моделями, включаючи SVB-файли 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 як паралельний бекенд, у якого цих проблем немає.


Дякую Заку. Я вважаю, що в науковців є паралельний спосіб крос-валідації, який я хочу зробити. Виключаючи це, будь-які інші пропозиції щодо прискорення? Спасибі.
tomas

@danjeharry: паралельна перехресна перевірка справді є низько висячим фруктом, і я настійно пропоную вам вивчити це спочатку. Крім того, я мало знаю про прискорення роботи SVM. Якщо ви можете знайти паралельний алгоритм SVM, це також може бути хорошою ідеєю. Скільки рядків / стовпців містить набір даних, який ви використовуєте для тренування?
Зак

Дякую Заку, я загляну в паралельний cv. Я роблю близько 650 атрибутів і 5000 прикладів.
tomas

4

Я усвідомлюю, що це досить давнє запитання, але також можливо (залежно від розміру вашого набору даних це може бути більш-менш ефективно) використовувати низькі розмірні наближення карти функції ядра, а потім використовувати це в лінійному SVM. Дивіться сторінку http://scikit-learn.org/stable/modules/kernel_approximation.html



2

R має чудовий пакет GPM , прискорений графічним процесором , rpusvm , що займає ~ 20 секунд для тренінгу на 20K зразках * 100 розмірів, і я виявив, що процесор ніколи не перевантажений ним, тому він використовує GPU ефективно. Однак для цього потрібен графічний процесор NVIDIA.


1

Попередження: Це безсоромна пробка.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.