Внедрение SVM, scikits учатся сокращать время выполнения, быстрый svm - PullRequest
5 голосов
/ 06 февраля 2012

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

1) Кажется, что некоторые отдельные итерации SVM занимают всего минуту, в то время как другие могут занимать до 15 минут. Это ожидается с другими данными и параметрами (C и гамма, я использую rbf ядро)?

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 07 февраля 2012

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

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

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

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

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

4 голосов
/ 08 февраля 2012

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

3 голосов
/ 08 февраля 2012

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

На 32 и 64-битном питоне (какое оборудование, какая версия py?), Я понятия не имею, но это может стоить общего вопроса о SO - там должны быть бенчмарки. Вы видите загрузку процессора> 90%, подсчет сборок мусора?

...