Поддерживает ли SVM в sklearn инкрементное (онлайн) обучение?

В настоящее время я разрабатываю рекомендательную систему для текстовых статей (двоичный случай "интересный" или "неинтересный" ). Одна из моих спецификаций заключается в том, что она должна постоянно обновляться для изменения тенденций.

Из того, что я могу сказать, лучший способ сделать это - использовать алгоритм машинного обучения, который поддерживает инкрементное /онлайн-обучение.

Алгоритмы, такие как Perceptron и Winnow, поддерживают онлайн-обучение, но я не совсем уверен в поддержке Vector Machines. Библиотека scythit-learn python поддерживает онлайн-обучение, и если да, то является ли поддерживающий векторный компьютер одним из алгоритмов, которые могут его использовать?

Я, очевидно, не полностью привязан к использованию машин векторной поддержки, но они, как правило, подходят к алгоритму для двоичной классификации из-за их всесторонней производительности. Я был бы готов изменить все, что подходит лучше всего в конце.

Ответ 1

В то время как онлайн-алгоритмы для SVM существуют, важно определить, хотите ли вы ядро ​​или линейные SVM, так как было разработано много эффективных алгоритмов для частного случая линейных SVM.

Для линейного случая, если вы используете классификатор SGA в scikit-learn с потерей шарнира и регуляцией L2, вы получите SVM, который может быть обновлен в режиме онлайн /incrementall. Вы можете комбинировать это с функциями, которые приближаются к ядру, чтобы получить сходство с ядром SVM онлайн.

Одна из моих спецификаций заключается в том, что она должна постоянно обновляться для изменения тенденций.

Это называется дрейфом концепции и не будет обрабатываться простым онлайн-SVM. Использование классификатора PassiveAggresive, скорее всего, даст вам лучшие результаты, поскольку его скорость обучения не уменьшается с течением времени.

Предполагая, что вы получаете обратную связь во время обучения/работы, вы можете попытаться обнаружить снижение точности с течением времени и начать обучение новой модели, когда точность начинает уменьшаться (и переключиться на новую, когда вы считаете, что она стала более точной). JSAT имеет 2 метода обнаружения дрейфа (см. jsat.driftdetectors), которые могут использоваться для отслеживания точности и предупреждения когда он изменился.

Он также имеет больше сетевых линейных и ядерных методов.

(примечание смещения: я автор JSAT).

Ответ 2

Возможно, это я наивный, но я думаю, что стоит упомянуть, как реально обновлять sci-kit SGD classifier, когда вы представляете свои данные постепенно

clf = linear_model.SGDClassifier()
x1 = some_new_data
y1 = the_labels
clf.partial_fit(x1,y1)
x2 = some_newer_data
y2 = the_labels
clf.partial_fit(x2,y2)

Ответ 3

Технические аспекты

Короткий ответ нет. Внедрение Sklearn (как и большинство других) не поддерживает онлайн-обучение SVM. Можно обучать SVM инкрементным образом, но это не так уж и сложно.

Если вы хотите ограничить себя линейным случаем, то ответ да, так как sklearn предоставляет вам Stochastic Gradient Descent (SGD), который имеет возможность минимизировать критерий SVM.

Вместо этого вы можете попробовать библиотеку pegasos, которая поддерживает онлайн-обучение SVM.

Теоретические аспекты

Проблема адаптации трендов в настоящее время очень популярна в сообществе ML. Как заявил @Raff, это называется дрейфом концепции и имеет множество подходов, которые часто являются видами метамоделей, которые анализируют "как ведет себя тренд" и изменяют базовую модель ML (например, заставляя ее переучиваться на подмножестве данных). Итак, у вас есть две независимые проблемы:

  • проблема онлайн-обучения, которая носит чисто технический характер и может быть рассмотрена SGD или другими библиотеками, чем sklearn
  • концепт-дрейф, который в настоящее время является горячей темой и не имеет ответов just works. Существует много возможностей, гипотеза и доказательства понятий, в то время как нет никого, общепринятого способа борьбы с этим явлением, на самом деле многие phd-диссертации в ML основаны на этой проблеме.

Ответ 4

SGD для задач пакетного обучения обычно имеет уменьшающуюся скорость обучения и проходит множество тренировок несколько раз. Итак, для чисто онлайн-обучения убедитесь, что для параметра learning_rate установлено значение "constant" в sklearn.linear_model.SGDClassifier() и eta0 = 0,1 или любое требуемое значение. Поэтому процесс выглядит следующим образом:

clf= sklearn.linear_model.SGDClassifier(learning_rate = 'constant', eta0 = 0.1, shuffle = False, n_iter = 1)
# get x1, y1 as a new instance
clf.partial_fit(x1, y1)
# get x2, y2
# update accuracy if needed
clf.partial_fit(x2, y2)

Ответ 5

Если вы заинтересованы в онлайн-обучении с концептуальным дрейфом, то вот несколько предыдущих работ

Ответ 6

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

Обновление тенденций может быть достигнуто путем поддержания временного окна каждый раз, когда вы запускаете свой учебный конвейер. Например, если вы тренируетесь один раз в день, и вам достаточно информации за последние месячные данные, создайте ваш набор данных из исторических данных, полученных за последние 30 дней.