Подтвердить что ты не робот

Самая быстрая реализация SVM, используемая в Python

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

В качестве альтернативы вы можете запускать поиск сетки по 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. Он использует mulitprocessing, поэтому python GIL не является проблемой.

Ответ 3

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 8

Я предлагаю взглянуть на реализацию Scikit-Learn Stochastic Gradient Descent. По умолчанию погрешность петли представляет собой линейный SVM. Я нашел его невероятно быстрым.

Ответ 9

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

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