Я попытался использовать SVM-классификатор для обучения данных примерно с 100 тыс. выборок, но я обнаружил, что он очень медленный и даже через два часа ответа не было. Когда набор данных имеет около 1k выборок, я могу получить результат немедленно. Я также пробовал SGDClassifier и наивные заливы, что довольно быстро, и я получил результаты в течение нескольких минут. Не могли бы вы объяснить это явление?
Scikit-learn SVM.SVC() чрезвычайно медленный
Ответ 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 есть один из лучших документов, в этих документах часто есть хорошая часть, чтобы объяснить что-то подобное (ссылка):