2012-02-06 4 views
4

Я работаю с scikit-learn по созданию некоторых интеллектуальных моделей с SVM. У меня есть набор данных с около 5000 примерами и около 700 функций. Я в 5 раз перекрестно проверяю с помощью сеттинга 18x17 на моем тренировочном наборе, а затем используя оптимальные параметры для своего тестового набора. пробежки идут намного дольше, чем я ожидал, и я заметил следующее:Внедрение SVM, scikits учит сокращению времени работы, быстрее svm

1) Некоторые отдельные итерации по обработке SVM, кажется, занимают всего одну минуту, в то время как другие могут занимать до 15 минут. Ожидается ли это с использованием разных данных и параметров (C и гамма, я использую ядро ​​rbf)?

2) Я пытаюсь использовать 64-битный python для Windows, чтобы воспользоваться дополнительной памятью, но все мои процессы на python, похоже, находятся на 1 гиге в моем диспетчере задач, я не знаю, имеет ли это что-либо делать с временем выполнения.

3) Я использовал 32bit до и работал примерно на одном наборе данных, и я помню (хотя я не сэкономил результаты), это было довольно быстро. Я использовал стороннюю сборку scikit-learn для 64-битных окон, поэтому я не знаю, лучше ли попробовать это на 32-битном питоне? (источник http://www.lfd.uci.edu/~gohlke/pythonlibs/)

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

Приложение: Я вернулся и снова попытался запустить 32-битную версию. По какой-то причине это намного быстрее. Потребовалось около 3 часов, чтобы добраться до 64-битной версии до 16 часов. Почему такая разница?

ответ

6

1) Ожидается: небольшая гамма и малая регуляризация будут выбирать больше векторов поддержки, поэтому модель будет более сложной и дольше подходящей.

2) Существует аргумент cache_size, который будет передан в базовую библиотеку libsvm. Однако, в зависимости от ваших данных, libsvm может использовать или не использовать весь доступный кэш.

3) Не знаю. Я запускаю более длительные эксперименты на обеих платформах, пожалуйста, сообщите о своих выводах в списках рассылки проекта. Это может заслуживать дальнейшего изучения.

Сначала проверьте, что вы нормализировали свои функции (например, удалите среднюю и масштабную функции по отклонениям, если ваши данные представляют собой плотный массив numpy). Для разреженных данных просто масштабируйте функции (или используйте преобразование TF-IDF для текстовых данных, например). См. Документ preprocessing section документа.

Затем вы должны начать с грубой сетки (с большими логарифмическими шагами), скажем, сетки 3x3, а затем сосредоточиться на интересных областях, переназначив сетку 3x3 на этой области. В общем случае сетка параметров SVM с параметрами C x равна quite smooth.

+0

Спасибо за ответы ogrisel. Они имеют большой смысл. Я не уверен в 32-битной и 64-разрядной проблемах, но если у меня будет шанс, я постараюсь сделать еще несколько таймингов. Мои данные предварительно обработаны (нормированы на 0-1), и я увеличил cache_size до 4000 для scikits (возможно, overkill). Я определенно займусь модификацией моего кода, чтобы он перешел от грубой сетки к меньшей области, что определенно поможет ускорить мой код. Еще раз спасибо. – tomas

+0

@OGrisel, как насчет общего грубо-точного искателя сетки? – denis

+0

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

3

SGD очень быстро, но 1) линейный только не RBF, 2) параметры альфа eta0 ... что я понятия не имею, как изменять: к специалисту, О. Грисель.

На 32 против 64 бит питона (?, Какое оборудование, какая версия ру), я понятия не имею, но это может быть стоит общий вопрос о SO - должны быть эталонные наборы. Можете ли вы видеть использование ЦП> 90%, подсчет сборок?

+0

Можно масштабировать нелинейное ядро ​​RBF с помощью [явной функции карты] (http://scikit-learn.org/dev/auto_examples/plot_kernel_approximation.html#example-plot-kernel-approximation-py) и линейный классификатор, такой как SGDClassifier. – ogrisel

+0

О, право. Любые комментарии о том, как изменить альфа и eta0? – denis

+0

Я никогда не пытаюсь настроить 'eta0' (может быть, я должен). Для 'alpha' я просто использую' GridSearchCV', как и для 'C' в' LinearSVC'. – ogrisel

4

Если вы можете себе это позволить, рассмотреть вопрос об использовании LinearSVC: libsvm основе СТК имеют сложность обучения между O(n_features * n_samples^2) и O(n_features * n_samples^3), а LinearSVC (на основе liblinear) имеет O(n_features*n_samples) обучения сложности и O(n_features) тест сложности.

+0

На практике «SGDClassifier» еще быстрее подходит для линейных моделей SVM в scikit-learn. И мы еще не реализовали усреднения :) – ogrisel

+0

Полезно знать, спасибо! –

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