scikit-изучите SVM.SVC () чрезвычайно медленный

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

1 ответов


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

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

это сильно меняется, когда ядра не используются и используется sklearn.svm.LinearSVC (исходя из liblinear) или sklearn.линейная модель.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-узнать конкретные замечания

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

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

Scikit-изучение документации

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

enter image description here