Я использую libsvm и заметил, что каждый раз, когда я вызываю svmtrain (), я создаю новую модель, и кажется, что нет возможности поместить данные в существующую модель. Возможно ли это сделать однако? Я просто не вижу этот аспект в libsvm?
Я использую libsvm и заметил, что каждый раз, когда я вызываю svmtrain (), я создаю новую модель, и кажется, что нет возможности поместить данные в существующую модель. Возможно ли это сделать однако? Я просто не вижу этот аспект в libsvm?
Ответы:
Похоже, вы ищете «инкрементный» или «онлайн» алгоритм обучения. Эти алгоритмы позволяют обновлять классификатор новыми примерами без переобучения всего с нуля.
Это определенно возможно с машинами поддержки векторов, хотя я полагаю, что libSVM в настоящее время не поддерживает это. Возможно, стоит взглянуть на несколько других пакетов, которые предлагают его, в том числе
PS: @Bogdanovist: есть довольно обширная литература по этому вопросу. КНН очевидно и тривиально инкрементно. Можно (некоторые) превратить байесовские классификаторы в инкрементные классификаторы, сохраняя счетчики вместо вероятностей. STAGGER, AQ * и некоторые (но не все) из семейства алгоритмов дерева решений ID * также являются инкрементными, не в моей голове.
Большинство онлайн / инкрементных утилит SVM предназначены для линейных ядер, и я полагаю, что это не так сложно, как для нелинейных ядер.
Некоторые из известных онлайн / инкрементных инструментов SVM, доступных в настоящее время:
+ LaSVM Леона Боттоса : поддерживает как линейные, так и нелинейные ядра. C ++ код
+ Bordes LaRank : он поддерживает как линейные, так и нелинейные ядра. C ++ код. Кажется, теперь ссылка не работает :-(
+ код Герта Каувенберга: инкрементный и декрементный : поддерживается как линейное, так и нелинейное ядра. Код Matlab.
+ Инкрементальное обучение SVM Криса Дила : поддерживается как линейное, так и нелинейное ядра. Код Matlab.
+ Alistair SVMHeavy Шилтона : только двоичная классификация и регрессия. Код C ++
+ OnlineSVR Франческо Парреллы: Только регресс. Matlab и C ++.
+ Пегас : линейный и нелинейный. С и код Matlab. Java-интерфейс .
+ Vowpal Wabbit Лэнгфорда : Не уверен :-(
+ MCSVM Коби Краммера : и линейный и нелинейный. C-код
Более обновленный список можно найти в моем ответе Quora .
Другая возможность - альфа-посев . Я не знаю, поддерживает ли libSVM это. Идея состоит в том, чтобы разделить огромное количество данных обучения на куски. Затем вы тренируете SVM на первом фрагменте. Поскольку результирующие векторы поддержки - это не что иное, как примеры ваших данных, вы берете их и используете их для обучения вашего SVM со следующей порцией. Кроме того, вы используете этот SVM для вычисления начальной оценки альфа-значений для следующей итерации (заполнения). Таким образом, преимущества имеют два аспекта: каждая из проблем меньше, а благодаря интеллектуальной инициализации они сходятся еще быстрее. Таким образом, вы упрощаете огромную проблему, последовательно решая ряд простых шагов.
Другой вариант, если вы ищете «пошаговое» решение, можно найти здесь ...
Расширение LIBLINEAR, которое учитывает дополнительное обучение.