Я пытаюсь запустить SVR, используя scikit learn (python) для обучающего набора данных, имеющего 595605 строк и 5 столбцов (функций), и тестового набора данных, имеющего 397070 строк. Данные были предварительно обработаны и упорядочены.
Я могу успешно запустить тестовые примеры, но, выполнив мой набор данных и оставив его работать более часа, я все равно не смог увидеть какой-либо вывод или завершение программы. Я пытался выполнить с использованием другой IDE и даже из терминала, но это не проблема. Я также попытался изменить значение параметра «C» с 1 до 1e3.
Я сталкиваюсь с похожими проблемами со всеми реализациями SVM с использованием Scikit.
Разве я не жду достаточно, чтобы завершить? Сколько времени должно занять это выполнение?
Из моего опыта это не должно занять более нескольких минут.
Вот моя конфигурация системы: Ubuntu 14.04, 8 ГБ ОЗУ, много свободной памяти, процессор 4-го поколения i7
источник
Ответы:
Вы можете увеличить этот кеш, вызывая SVR как
В общем, это не сработает. Но еще не все потеряно. Вы можете выполнить выборку данных и использовать оставшуюся часть в качестве набора для проверки или выбрать другую модель. Выше 200 000 диапазонов наблюдения целесообразно выбирать линейных учеников.
Ядро SVM может быть аппроксимировано путем аппроксимации матрицы ядра и подачи ее в линейный SVM. Это позволяет вам выбирать между точностью и производительностью за линейное время.
Популярное средство для достижения этой цели - использовать около 100 кластерных центров, найденных kmeans / kmeans ++, в качестве основы вашей функции ядра. Новые производные функции затем вводятся в линейную модель. Это очень хорошо работает на практике. Google, Yahoo и Microsoft делают это с помощью таких инструментов, как sophia-ml и vowpal wabbit . Ввод / вывод становится доминирующей стоимостью для простых линейных учеников.
В изобилии данных непараметрические модели работают примерно одинаково для большинства задач. Исключениями являются структурированные входы, такие как текст, изображения, временные ряды, аудио.
дальнейшее чтение
источник
SVM решает задачу оптимизации квадратичного порядка.
Мне нечего добавить, что здесь не было сказано. Я просто хочу опубликовать ссылку на страницу sklearn о SVC, которая разъясняет, что происходит:
Если вы не хотите использовать ядра, и достаточно линейного SVM, есть LinearSVR, который намного быстрее, потому что он использует подход оптимизации, основанный на линейных регрессиях. Однако вам придется нормализовать данные, если вы этого еще не сделали, потому что они применяют регуляризацию к коэффициенту перехвата, что, вероятно, не то, что вам нужно. Это означает, что если ваше среднее значение данных далеко от нуля, оно не сможет решить его удовлетворительно.
Вы также можете использовать стохастический градиентный спуск для решения задачи оптимизации. Склеарн Особенности SGDRegressor . Вы должны использовать,
loss='epsilon_insensitive'
чтобы получить результаты, аналогичные линейному SVM. Смотрите документацию. Я бы использовал градиентный спуск только в крайнем случае, потому что он подразумевает много настроек гиперпараметров, чтобы избежать застревания в локальных минимумах. Используйте,LinearSVR
если можете.источник
Вы включили масштабирование на этапе предварительной обработки? У меня была эта проблема при запуске моего SVM. Мой набор данных ~ 780 000 образцов (строка) с 20 функциями (столбец). Мой тренировочный набор составляет ~ 235 тыс. Образцов. Оказывается, я просто забыл масштабировать свои данные! Если это так, попробуйте добавить этот бит в ваш код:
масштабировать данные до [-1,1]; увеличить скорость SVM:
источник
С таким огромным набором данных, я думаю, вам лучше использовать нейронную сеть, глубокое обучение, случайный лес (они на удивление хороши) и т. Д.
Как упоминалось в предыдущих ответах, время, затрачиваемое на обучение, пропорционально третьей степени числа обучающих выборок. Даже время прогнозирования является полиномиальным по количеству тестовых векторов.
Если вам действительно нужно использовать SVM, то я бы порекомендовал использовать ускорение графического процессора или уменьшение размера набора обучающих данных. Попробуйте сначала с примером (возможно, 10000 строк) данных, чтобы увидеть, не является ли это проблемой с форматом данных или распределением.
Как упоминалось в других ответах, линейные ядра работают быстрее.
источник
Недавно я столкнулся с подобной проблемой, потому что забыл масштабировать объекты в моем наборе данных, который ранее использовался для обучения ансамблевой модели. Неспособность масштабировать данные может быть вероятным виновником, как указал Шелби Мэтлок. Вы можете попробовать различные скейлеры, доступные в sklearn, такие как RobustScaler :
from sklearn.preprocessing import RobustScaler scaler = RobustScaler() X = scaler.fit_transfrom(X)
X теперь преобразован / масштабирован и готов к передаче в нужную вам модель.
источник
Это имеет смысл. IIUC, скорость выполнения опорных векторных операций зависит от количества выборок, а не от размерности. Другими словами, он ограничен временем процессора, а не оперативной памятью. Я не уверен, сколько именно времени это займет, но я провожу некоторые тесты, чтобы узнать.
источник
Оставьте его на ночь или лучше на 24 часа. Какова загрузка вашего процессора? Если ни одно из ядер не работает на 100%, значит, у вас проблема. Вероятно, с памятью. Вы проверили, подходит ли ваш набор данных к 8 ГБ вообще? Вы пробовали SGDClassifier? Это один из самых быстрых там. Стоит сначала попробовать, надеясь, что это завершится через час или около того.
источник
SGDClassifier
не поддерживает ядра. Если ОП хочет линейный SVM, то я бы рекомендовал сначала попробоватьLinearSVR
. Это намного быстрее, чемSVR
потому, что он решает проблему с использованием библиотеки линейной регрессии, и глобальный минимум гарантирован (в отличие от градиентного спуска).The loss function to be used. Defaults to ‘hinge’, which gives a linear SVM.
То же самое дляSGDRegressor
.SGDRegressor
эквивалентно использованиюSVR(kernel='linear')
. Если это то, что хочет ОП, это здорово. У меня сложилось впечатление, что он хочет использовать SVM с ядром. Если это не так, я бы рекомендовал сначала попробоватьLinearSVR
.Попробуйте нормализовать данные до [-1,1]. Я столкнулся с подобной проблемой, и после нормализации все работало нормально. Вы можете легко нормализовать данные, используя:
from sklearn import preprocessing X_train = preprocessing.scale(X_train) X_test = preprocessing.scale(X_test)
источник
Я столкнулся с этой проблемой, и,
cache_size
как полагают другие, не помогает вообще. Вы можете увидеть этот пост и этот как основной вкладчик предложил изменить код вручную.Как известно, есть
SVC
иSVR
проблемы оптимизации, и они прекращаются, когда погрешность настолько мала, когда дальнейшая оптимизация бесполезна. Так что в них есть еще один параметр,max_iter
где вы можете указать, сколько итераций он должен выполнить.Я использовал
sklearn
в Python иe1071
в R и R гораздо быстрее получить результат без установкиmax_iter
иsklearn
занимает в 2-4 раза больше. Единственный способ сократить время вычислений для python - это использоватьmax_iter
. Это относительно сложности модели, количества признаков, ядер и гиперпараметров, но для небольшого набора данных я использовал около 4000 и точек данныхmax_iter
был10000
результаты не отличалось на всех , и это было приемлемо.источник
У меня просто была похожая проблема с набором данных, который содержит только 115 элементов и только одну особенность (данные международных авиакомпаний). Решение состояло в том, чтобы масштабировать данные. Что я пропустил в ответах до сих пор, так это использование конвейера:
Вы можете тренироваться
model
как обычная модель классификации / регрессии и оценивать ее таким же образом. Ничего не меняется, только определение модели.источник
Pipeline
? Вы не импортируете это.Вам нужно масштабировать ваши данные. Масштабирование нормализует ваши точки данных в диапазоне от -1 до 1, что поможет в более быстрой конвергенции.
Попробуйте использовать следующий код:
источник