Можно ли добавить данные обучения к существующим моделям SVM?


14

Я использую libsvm и заметил, что каждый раз, когда я вызываю svmtrain (), я создаю новую модель, и кажется, что нет возможности поместить данные в существующую модель. Возможно ли это сделать однако? Я просто не вижу этот аспект в libsvm?


Я не уверен, что вы подразумеваете под «поместить данные в существующую модель»? Можете ли вы привести пример какой-то другой техники (не SVM), которая позволяет вам это делать? Возьмем для примера логистическую регрессию; если вы добавите новые данные, вы получите новый набор коэффициентов, прошедших переподготовку в существующем наборе, без ссылки на то, какие данные являются «новыми» или «старыми», это всего лишь обучающие данные. Я предполагаю, что если вы используете решатель типа градиентного спуска, вы могли бы сэкономить время, инициализируя ранее оптимизированные значения, которые, вероятно, будут близки к новому решению. Это то, что вы имеете в виду?
Богдановист

Ответы:


17

Похоже, вы ищете «инкрементный» или «онлайн» алгоритм обучения. Эти алгоритмы позволяют обновлять классификатор новыми примерами без переобучения всего с нуля.

Это определенно возможно с машинами поддержки векторов, хотя я полагаю, что libSVM в настоящее время не поддерживает это. Возможно, стоит взглянуть на несколько других пакетов, которые предлагают его, в том числе

PS: @Bogdanovist: есть довольно обширная литература по этому вопросу. КНН очевидно и тривиально инкрементно. Можно (некоторые) превратить байесовские классификаторы в инкрементные классификаторы, сохраняя счетчики вместо вероятностей. STAGGER, AQ * и некоторые (но не все) из семейства алгоритмов дерева решений ID * также являются инкрементными, не в моей голове.


1
Интересно, спасибо за голову. Я уже видел термин «онлайн», но не осознавал его технической значимости (я думал, что это буквально означает «может быть интернетом»).
Богдановец

Рад помочь! Я должен был упомянуть об этом выше, но некоторые онлайн / инкрементные алгоритмы на самом деле придают больший вес «новейшим» примерам, которые могут или не могут быть полезны, в зависимости от вашего приложения (например, отлично подходит для предсказания тем в Твиттере, менее круто для рака исследование).
Мэтт Краузе

12

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

Некоторые из известных онлайн / инкрементных инструментов SVM, доступных в настоящее время:
+ LaSVM Леона Боттоса : поддерживает как линейные, так и нелинейные ядра. C ++ код
+ Bordes LaRank : он поддерживает как линейные, так и нелинейные ядра. C ++ код. Кажется, теперь ссылка не работает :-(
+ код Герта Каувенберга: инкрементный и декрементный : поддерживается как линейное, так и нелинейное ядра. Код Matlab.
+ Инкрементальное обучение SVM Криса Дила : поддерживается как линейное, так и нелинейное ядра. Код Matlab.
+ Alistair SVMHeavy Шилтона : только двоичная классификация и регрессия. Код C ++
+ OnlineSVR Франческо Парреллы: Только регресс. Matlab и C ++.
+ Пегас : линейный и нелинейный. С и код Matlab. Java-интерфейс .
+ Vowpal Wabbit Лэнгфорда : Не уверен :-(
+ MCSVM Коби Краммера : и линейный и нелинейный. C-код

Более обновленный список можно найти в моем ответе Quora .


(+1) Добро пожаловать на сайт. Это довольно исчерпывающий список! :)
кардинал

4

Другая возможность - альфа-посев . Я не знаю, поддерживает ли libSVM это. Идея состоит в том, чтобы разделить огромное количество данных обучения на куски. Затем вы тренируете SVM на первом фрагменте. Поскольку результирующие векторы поддержки - это не что иное, как примеры ваших данных, вы берете их и используете их для обучения вашего SVM со следующей порцией. Кроме того, вы используете этот SVM для вычисления начальной оценки альфа-значений для следующей итерации (заполнения). Таким образом, преимущества имеют два аспекта: каждая из проблем меньше, а благодаря интеллектуальной инициализации они сходятся еще быстрее. Таким образом, вы упрощаете огромную проблему, последовательно решая ряд простых шагов.


есть ли какая-нибудь библиотека, применяющая этот метод?
д.путто

по-видимому, libsvm уже делает это, или, по крайней мере, какой-то вариант алгоритма work.caltech.edu/~htlin/program/libsvm
jpmuc

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.