Классификатор SVC отнимает слишком много времени на обучение - PullRequest
0 голосов
/ 27 декабря 2018

Я использую классификатор SVC с линейным ядром для обучения моей модели.Данные поезда: 42000 записей

    model = SVC(probability=True)
    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 часов.Я делаю что-то неправильно?Кроме того, что можно сделать, чтобы улучшить время

Заранее спасибо

1 Ответ

0 голосов
/ 02 января 2019

Есть несколько возможностей ускорить ваше обучение SVM.Пусть n будет количеством записей, а d размерностью вложения.Я предполагаю, что вы используете scikit-learn.

  • Уменьшение размера тренировочного набора .Цитируя docs :

    Сложность времени подбора более чем квадратичная с количеством выборок, что затрудняет масштабирование для набора данных с более чем парой 10000 выборок.

    O(n^2) сложность, скорее всего, будет доминировать над другими факторами.Таким образом, выборка меньшего количества записей для обучения окажет наибольшее влияние на время.Помимо случайной выборки, вы также можете попробовать методы выбора экземпляра .Например, недавно был предложен анализ основной выборки .

  • Уменьшение размерности .Как намекают другие в своих комментариях, встраивание измерения также влияет на время выполнения.Вычисление внутренних произведений для линейного ядра происходит в O(d). Уменьшение размерности может, следовательно, также сократить время выполнения.В другой вопрос , скрытое семантическое индексирование было предложено специально для представлений TF-IDF.

  • Параметры .Используйте SVC(probability=False), если вам не нужны вероятности, потому что они " замедляют этот метод. " (из документации).
  • Реализация .Насколько мне известно, Scikit-Learn просто охватывает LIBSVM и LIBLINEAR.Я размышляю здесь, но вы можете ускорить это, используя эффективные библиотеки BLAS, такие как MKL от Intel.
  • Другой классификатор .Вы можете попробовать sklearn.svm.LinearSVC, то есть ...

    [s], схожий с SVC с параметром kernel = 'linear', но реализованный в терминах liblinear, а не libsvm, поэтому он обладает большей гибкостьюв выборе штрафов и функций потерь и должны лучше масштабироваться для большого количества выборок.

    Более того, разработчик scikit-learn предложил модуль kernel_approximation в аналогичный вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...