Содержание
python. Почему scikit-learn SVM.SVC() работает очень медленно?
Я пытался использовать классификатор SVM для обучения данных с примерно 100 000 выборок, но обнаружил, что он работает очень медленно, и даже через два часа ответа не последовало. Когда в наборе данных около 1 тыс. выборок, я могу сразу получить результат. Я также попробовал SGDClassifier и наивный байес, который довольно быстр, и я получил результаты в течение нескольких минут. Не могли бы вы объяснить это явление?
- питон
- научное обучение
92 = 10.000.000.000 шагов = Время Х * 10000!!!
Это только приблизительное значение, и оно может быть даже хуже или меньше (например, установка размера кеша, обмен памяти на увеличение скорости)!
Особые замечания Scikit-learn
Ситуация может быть намного сложнее из-за всего того, что scikit-learn делает для нас за решеткой. Вышеизложенное справедливо для классического SVM 2-го класса. Если вы случайно пытаетесь изучить некоторые данные нескольких классов; scikit-learn будет автоматически использовать для этого подходы OneVsRest или OneVsAll (поскольку основной алгоритм SVM этого не поддерживает). Прочтите документацию scikit-learns, чтобы понять эту часть.
То же самое предупреждение относится к генерации вероятностей: SVM естественным образом не создает вероятности для окончательных прогнозов. Таким образом, чтобы использовать их (активируемые параметром), scikit-learn использует тяжелую процедуру перекрестной проверки, называемую масштабированием Платта, которая также займет много времени!
Документация Scikit-learn
Поскольку sklearn имеет одну из лучших документов, в этих документах часто есть хорошая часть, объясняющая что-то вроде этого (ссылка):
5
Если вы используете процессор Intel, корпорация Intel предоставила для него решение.
Расширение Intel для Scikit-learn предлагает вам способ ускорить существующий код scikit-learn. Ускорение достигается за счет исправления: замены стандартных алгоритмов scikit-learn их оптимизированными версиями, предоставляемыми расширением.
Вы должны выполнить следующие шаги:
Сначала установите пакет intelex для sklearn
pip install scikit-learn-intelex
Теперь просто добавьте следующую строку вверху программы
из импорта sklearnex patch_sklearn patch_sklearn()
Теперь запускать программу будет гораздо быстрее, чем раньше.
Подробнее об этом можно прочитать по следующей ссылке:
https://intel.github.io/scikit-learn-intelex/
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
машинное обучение — классификатор SVC требует слишком много времени для обучения
спросил
Изменено
8 месяцев назад
Просмотрено
13 тысяч раз
Я использую классификатор SVC с линейным ядром для обучения своей модели.
Данные поезда: 42000 записей
модель = SVC(вероятность=истина) model.fit(self.features_train, self.labels_train) y_pred = model.predict (self.features_test) train_accuracy = model.score (self.features_train, self.labels_train) test_accuracy = model.score (self.features_test, self.labels_test)
Обучение моей модели занимает более 2 часов.
Я делаю что-то неправильно?
Кроме того, что можно сделать, чтобы улучшить время
Заранее спасибо
- машинное обучение
- глубокое обучение
- наука о данных
4
Существует несколько способов ускорить обучение SVM. Пусть n
— количество записей, а d
— размерность вложения. Я предполагаю, что вы используете 92) Сложность , скорее всего, будет доминировать над другими факторами. Таким образом, выборка меньшего количества записей для обучения окажет наибольшее влияние на время. Помимо случайной выборки, вы также можете попробовать методы выбора экземпляра. Например, недавно был предложен анализ основной выборки.
Уменьшение размерности . Как намекают другие в своих комментариях, встраивание измерения также влияет на время выполнения. Вычисление внутренних продуктов для линейного ядра находится в O(d)
. Таким образом, уменьшение размерности также может сократить время выполнения. В другом вопросе скрытая семантическая индексация была предложена специально для представлений TF-IDF.
SVC(вероятность=ложь)
, если вам не нужны вероятности, потому что они « замедлят этот метод. » (из документации). Другой классификатор . Вы можете попробовать sklearn.svm.LinearSVC
, что…
[s] подобен SVC с параметром kernel=’linear’, но реализован в терминах liblinear, а не libsvm, поэтому он более гибок в выборе штрафов и функций потерь и должен лучше масштабироваться для большого количества выборок.
Более того, разработчик scikit-learn в аналогичном вопросе предложил модуль kernel_apprimation
.
1
У меня была такая же проблема, но масштабирование данных решило проблему
# Масштабирование функций из sklearn.preprocessing импортировать StandardScaler sc = Стандартный масштаб() X_train = sc.fit_transform (X_train) X_test = sc.transform(X_test)
Вы можете попробовать использовать ускоренные реализации алгоритмов, такие как scikit-learn-intelex — https://github.com/intel/scikit-learn-intelex
Для SVM вы наверняка сможете получить более высокую эффективность вычислений.