2012-02-15 4 views
32

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

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

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

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

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

ответ

26

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

+0

Спасибо ogrisel. Я посмотрю на это. Определенно выглядит интересно. Sklearn может экспортировать в формат svm light? Это определенно будет полезно. В ответ на ваш предыдущий ответ, к сожалению, я имею дело с таймингами, поэтому случайная выборка + плющение в поезд/тест становится довольно сложной. Не уверен, что подвыборка для моей модели будет такой простой. Благодаря! – tomas

+0

Извините, скоро добавьте ogrisel, знаете ли вы, какая функция утилиты в sklearn может экспортировать в формате SVM? – tomas

+0

Действительно, он отсутствует в документе, но он есть: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/datasets/svmlight_format.py#L142 – ogrisel

2

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

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

+0

Благодаря bavaza я буду смотреть в него. Предполагая, что я использую мой многоядерный компьютер, любые другие предложения по ускорению моей программы? Я собирался выяснить способ перекрестного проверки на несколько потоков в любом случае. Тем не менее, я думаю, мне все еще нужна скорость. – tomas

+0

@bavaza, я много лет запускаю Python в нескольких ядрах, он работает очень хорошо. Пожалуйста, изучите многопроцессорную библиотеку стандартного CPython. –

+0

@ V3ss0n, спасибо. Похож на хороший lib. Поскольку он использует процессы, а не потоки, знакомы ли вы с любыми штрафами за переключение контекста (например, при использовании большого рабочего пула)? – bavaza

22

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

8

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

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

В качестве альтернативы, вы посмотрите на Shogun Machine Learning Library here

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

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

4

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

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

+4

Вообще говоря, LibSVM - хорошая зрелая библиотека, но я думаю, что это не самый быстрый и 7000 x 500 - очень маленькая проблема для тестирования. – mrgloom

-1

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

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

0

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

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