Самая быстрая реализация SVM, используемая в Python - PullRequest
34 голосов
/ 15 февраля 2012

Я строю некоторые прогностические модели в Python и использую SVM-реализацию scikits learn. Это было действительно здорово, просто в использовании и относительно быстро.

К сожалению, я начинаю стесняться своей средой выполнения. Я запускаю rbf SVM на полном наборе данных около 4 - 5000 с 650 функциями. Каждый прогон занимает около минуты. Но с 5-кратной перекрестной проверкой + поиском по сетке (используя грубый для точного поиска) это становится немного неосуществимым для моей задачи. Итак, вообще, есть ли у людей какие-либо рекомендации относительно самой быстрой реализации SVM, которую можно использовать в Python? Это или какие-то способы ускорить моё моделирование?

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

Я также слышал, что существуют способы аппроксимации rbf SVM с использованием линейной карты характеристик SVM + в scikits. Не уверен, что люди думают об этом подходе. Опять же, кто-нибудь использует этот подход, это значительное увеличение времени выполнения?

Все идеи по увеличению скорости программы приветствуются.

Ответы [ 9 ]

29 голосов
/ 16 февраля 2012

Самая масштабируемая реализация ядра SVM, о которой я знаю, это LaSVM . Он написан на C, поэтому может быть использован в Python, если вы знаете Cython , ctypes или cffi . В качестве альтернативы вы можете использовать его из командной строки. Вы можете использовать утилиты из sklearn.datasets для загрузки конвертируемых данных из формата NumPy или CSR в файлы в формате svmlight, которые LaSVM может использовать в качестве обучающего / тестового набора.

23 голосов
/ 16 февраля 2012

В качестве альтернативы вы можете запустить поиск по сетке по 1000 случайным выборкам вместо полного набора данных:

>>> from sklearn.cross_validation import ShuffleSplit
>>> cv = ShuffleSplit(3, test_fraction=0.2, train_fraction=0.2, random_state=0)
>>> gs = GridSeachCV(clf, params_grid, cv=cv, n_jobs=-1, verbose=2)
>>> gs.fit(X, y)

Очень вероятно, что оптимальные параметры для 5000 выборок будут очень близки к оптимальным параметрам для 1000 выборок,Так что это хороший способ начать грубый поиск по сетке.

n_jobs=-1 позволяет использовать все ваши процессоры для параллельного выполнения отдельных подгонок CV.Он использует многозадачность, поэтому Python GIL не проблема.

8 голосов
/ 27 сентября 2012

Во-первых, согласно тесту scikit-learn ( здесь ), scikit-learn уже является одним из самых быстрых, если не самых быстрых пакетов SVM. Следовательно, вы можете рассмотреть другие способы ускорения обучения.

Как предполагает bavaza, вы можете попробовать многопоточность процесса обучения. Если вы используете класс Scridit-learn GridSearchCV, вы можете легко установить аргумент n_jobs больше значения по умолчанию, равного 1, чтобы выполнять обучение параллельно за счет использования большего количества памяти. Вы можете найти его документацию здесь Пример использования класса можно найти здесь

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

Shogun предназначен для крупномасштабного машинного обучения с оболочками для многих распространенных svm-пакетов и реализован на C / C ++ с привязками для python. Согласно приведенному выше тесту Scikit-learn, его скорость сопоставима с Scikit-learn. На других задачах (кроме тех, которые они демонстрировали), это может быть быстрее, поэтому стоит попробовать.

Наконец, вы можете попытаться выполнить уменьшение размера, например, используя PCA или рандомизированный PCA, чтобы уменьшить размерность ваших векторов признаков. Это ускорит процесс обучения. Документацию по соответствующим классам можно найти по следующим 2 ссылкам: PCA , Randomized PCA . Вы можете найти примеры их использования в разделе примеров Scikit-learn.

4 голосов
/ 25 октября 2012

Если вы заинтересованы только в использовании ядра RBF (или любого другого квадратичного ядра в этом отношении), тогда я предлагаю использовать LIBSVM на MATLAB или Octave . Я тренирую модель из 7000 наблюдений и 500 функций за 6 секунд.

Хитрость заключается в том, чтобы использовать предварительно вычисленные ядра, которые предоставляет LIBSVM, и использовать некоторую матричную алгебру, чтобы вычислить ядро ​​за один шаг, вместо того, чтобы перепрыгивать через данные дважды. Сборка ядра занимает около двух секунд, в отличие от гораздо большего, используя собственное ядро ​​RBF LIBSVM. Я предполагаю, что вы сможете сделать это в Python, используя NumPy , но я не уверен, так как я не пробовал.

2 голосов
/ 15 февраля 2012

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

. Вы можете попробовать другие реализацииPython, который не имеет этого ограничения.См. PyPy или IronPython , если вы хотите перейти на .NET.

1 голос
/ 28 апреля 2015

Если ваша проблема в двух классах, эта упаковка SVM на основе CUDA и scikit-learn полезна:

https://github.com/niitsuma/gpusvm/tree/master/python

1 голос
/ 29 апреля 2013

Попробуйте svm_light !

Это невероятно быстрая реализация C из печально известного Торстена Йоахима из Корнелла , с хорошими привязками Python, и вы можете установить егос pip install pysvmlight.

0 голосов
/ 13 ноября 2014

Я предлагаю взглянуть на реализацию Стохастического градиентного спуска Scikit-Learn . Потеря шарнира по умолчанию - линейный SVM. Я обнаружил, что это невероятно быстро.

0 голосов
/ 31 мая 2013

Я бы хотел использовать случайный лес , чтобы уменьшить количество вводимых вами функций.

Существует опция с ExtraTreesRegressor и ExtraTreesClassifier для генерации значений функций. Затем вы можете использовать эту информацию для ввода подмножества функций в SVM.

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