Scikit-learn SVM.SVC() чрезвычайно медленный

Я попытался использовать SVM-классификатор для обучения данных примерно с 100 тыс. выборок, но я обнаружил, что он очень медленный и даже через два часа ответа не было. Когда набор данных имеет около 1k выборок, я могу получить результат немедленно. Я также пробовал SGDClassifier и наивные заливы, что довольно быстро, и я получил результаты в течение нескольких минут. Не могли бы вы объяснить это явление?

Ответ 1

Общие замечания о SVM-обучении

SVM-обучение с нелинейными ядрами, которое по умолчанию используется в SVL-склеарне, примерно по сложности: O(n_samples^2 * n_features) ссылка на какой-то вопрос с этим приближением одним из разработчиков sklearn. Это относится к SMA-алгоритму , используемому в libsvm, который является решателем ядра в sklearn для этого типа проблем.

Это сильно меняется, когда не используются ядра, и используется sklearn.svm.LinearSVC (на основе liblinear) или sklearn.linear_model.SGDClassifier.

Итак, мы можем сделать некоторую математику для приближения временной разницы между образцами 1k и 100k:

1k = 1000^2 = 1.000.000 steps = Time X
100k = 100.000^2 = 10.000.000.000 steps = Time X * 10000 !!!

Это только приближение и может быть еще хуже или хуже (например, установить размер кеша, торговую память для повышения скорости)!

Scikit-learn специальные замечания

Ситуация также может быть намного сложнее из-за того, что славный материал scikit-learn делает для нас за решеткой. Вышеизложенное относится к классическому 2-классному SVM. Если вы случайно пытаетесь изучить некоторые данные из нескольких классов; scikit-learn автоматически будет использовать подходы OneVsRest или OneVsAll для этого (поскольку основной SVM-алгоритм не поддерживает это). Читайте scikit - изучает документы, чтобы понять эту часть.

То же предупреждение распространяется и на генерирование вероятностей: SVM естественно не порождает вероятности для окончательных предсказаний. Поэтому для использования этих параметров (активированных параметром) scikit-learn использует тяжелую процедуру перекрестной проверки, называемую масштабирование Platt, что тоже займет много времени!

Документация Scikit-learn

Поскольку у sklearn есть один из лучших документов, в этих документах часто есть хорошая часть, чтобы объяснить что-то подобное (ссылка):

введите описание изображения здесь