É possível anexar dados de treinamento aos modelos SVM existentes?

14

Estou usando o libsvm e notei que toda vez que chamo svmtrain (), crio um novo modelo e parece que não há opção para colocar dados em um modelo existente. Isso é possível, no entanto? Eu simplesmente não estou vendo esse aspecto no libsvm?

mugetsu
fonte
Não sei ao certo o que você quer dizer com 'colocar dados em um modelo existente'? Você pode dar um exemplo de alguma outra técnica (não SVM) que permite fazer isso? Tomemos, por exemplo, regressão logística; se você adicionar novos dados, um novo conjunto de coeficientes será treinado novamente no conjunto existente sem referência a quais dados são 'novos' ou 'antigos', são apenas dados de treinamento. Acho que se você estiver usando um solucionador de gradiente descendente, poderá economizar tempo inicializando com os valores otimizados anteriormente, que provavelmente estarão próximos da nova solução. É isto que você quer dizer?
precisa

Respostas:

17

Parece que você está procurando por um algoritmo de aprendizado "incremental" ou "online". Esses algoritmos permitem atualizar um classificador com novos exemplos, sem reciclar a coisa toda do zero.

Definitivamente, é possível com máquinas de vetores de suporte, embora eu acredite que o libSVM atualmente não o suporte. Pode valer a pena dar uma olhada em vários outros pacotes que o oferecem, incluindo

PS: @ Bogdanovist: Há uma literatura bastante extensa sobre isso. O kNN é obviamente e trivialmente incremental. Pode-se transformar (alguns) classificadores bayesianos em classificadores incrementais armazenando contagens em vez de probabilidades. STAGGER, AQ * e alguns (mas não todos) os algoritmos da árvore de decisão da família ID * também são incrementais, no topo da minha cabeça.

Matt Krause
fonte
1
Interessante, obrigado pelo aviso. Eu já tinha visto o termo 'online' citado anteriormente, mas não havia percebido o significado técnico (eu pensei que ele literalmente significava 'pode haz internetz').
Bogdanovist
Feliz em ajudar! Eu deveria ter mencionado isso acima, mas alguns algoritmos on-line / incrementais realmente dão mais peso aos exemplos "mais recentes", que podem ou não ser úteis, dependendo da sua aplicação (por exemplo, ótimo para prever tópicos do twitter, menos impressionantes para o câncer pesquisa).
Matt Krause
12

A maioria dos utilitários SVM on-line / incrementais são para kernels lineares e suponho que não seja tão difícil quanto para kernels não lineares.

Algumas das notáveis ​​ferramentas SVM on-line / incrementais disponíveis atualmente:
+ LaSVM de Leon Bottous : Ele suporta kernels lineares e não lineares. Código C ++
+ LaRank de Bordes : suporta kernels lineares e não lineares. Código C ++. Parece que o link está quebrado agora :-(
+ código de Gert Cauwenberghs, incremental e decremental : suporta kernels lineares e não lineares. Código Matlab.
+ Aprendizado SVM incremental de Chris Diehl : suporta kernels lineares e não lineares. Código Matlab.
+ Alistair SVMHeavy de Shilton : Somente classificação binária e regressão. Código C ++
+ OnlineSVR de Francesco Parrella: Somente regressão. Matlab e C ++.
+ Pegasos : lineares e não lineares. Código C e Matlab. Uma interface Java .
+ Vowpal Wabbit de Langford : Não tenho certeza :-(
+ MCSVM de Koby Crammer : linear e não linear. Código C

Uma lista mais atualizada pode ser encontrada na minha resposta do Quora .

rahulkmishra
fonte
(+1) Bem-vindo ao site. Essa é uma lista bastante exaustiva! :)
cardeal
4

Outra possibilidade é a semeadura alfa . Não sei se o libSVM suporta isso. A idéia é dividir uma enorme quantidade de dados de treinamento em partes. Em seguida, você treina um SVM no primeiro pedaço. Como os vetores de suporte resultantes nada mais são do que algumas amostras dos seus dados, você os utiliza e os treina para treinar seu SVM com o próximo pedaço. Além disso, você usa esse SVM para calcular uma estimativa inicial dos valores alfa para a próxima iteração (propagação). Portanto, os benefícios são duplos: cada um dos problemas é menor e, através da inicialização inteligente, converge ainda mais rapidamente. Dessa forma, você simplifica um grande problema para resolver sequencialmente uma série de etapas mais simples.

jpmuc
fonte
existe alguma biblioteca por aí aplicando esse método?
d.putto
aparentemente LIBSVM já faz isso, ou pelo menos alguma variante do algoritmo work.caltech.edu/~htlin/program/libsvm
jpmuc
1

Outra opção, se você estiver procurando uma solução "incremental", pode ser encontrada aqui ...

Liblinear Incremental

Uma extensão do LIBLINEAR que permite um aprendizado incremental.

Chantz Large
fonte