È possibile aggiungere dati di training ai modelli SVM esistenti?


14

Sto usando libsvm e ho notato che ogni volta che chiamo svmtrain (), creo un nuovo modello e che non sembra esserci alcuna opzione per inserire i dati in un modello esistente. È possibile farlo comunque? Non vedo questo aspetto in libsvm?


Non sono sicuro di cosa intendi per "inserire i dati in un modello esistente"? Puoi fare un esempio di qualche altra tecnica (non SVM) che ti consente di farlo? Prendiamo ad esempio la regressione logistica; se aggiungi nuovi dati otterrai una nuova serie di coefficienti riqualificati sul set esistente senza riferimento a quali dati sono "nuovi" o "vecchi", sono solo dati di addestramento. Immagino che se stai usando un solutore di tipo di discesa a gradiente potresti risparmiare tempo inizializzando ai valori precedentemente ottimizzati, che probabilmente saranno vicini alla nuova soluzione. È ciò che intendi?
Bogdanovist,

Risposte:


17

Sembra che tu stia cercando un algoritmo di apprendimento "incrementale" o "online". Questi algoritmi ti consentono di aggiornare un classificatore con nuovi esempi, senza riqualificare il tutto da zero.

È sicuramente possibile con le macchine vettoriali di supporto, anche se credo che libSVM al momento non lo supporti. Potrebbe valere la pena dare un'occhiata a molti altri pacchetti che lo offrono, incluso

PS: @Bogdanovist: C'è una letteratura piuttosto ampia su questo. kNN è ovviamente e banalmente incrementale. Si potrebbero trasformare (alcuni) classificatori bayesiani in classificatori incrementali memorizzando i conteggi anziché le probabilità. Anche STAGGER, AQ * e alcuni (ma non tutti) gli algoritmi della famiglia ID * dell'albero delle decisioni sono incrementali, al di sopra della mia testa.


1
Interessante, grazie per il testa a testa. Avevo già visto il termine "online" prima, ma non avevo capito il significato tecnico (pensavo che significasse letteralmente "Can Haz Internetz").
Bogdanovist,

Felice di aiutare! Avrei dovuto menzionarlo sopra, ma alcuni algoritmi online / incrementali in realtà danno più peso agli esempi "più recenti", che possono essere o non essere utili, a seconda della tua applicazione (ad esempio, ottimo per prevedere argomenti su Twitter, meno fantastico per il cancro ricerca).
Matt Krause,

12

La maggior parte delle utility SVM online / incrementali sono per kernel lineari e suppongo che non sia così difficile come per i kernel non lineari.

Alcuni dei notevoli strumenti SVM online / incrementali attualmente disponibili:
+ LaSVM di Leon Bottous : supporta kernel sia lineari che non lineari. Codice C ++
+ Bordes's LaRank : supporta kernel sia lineari che non lineari. Codice C ++. Sembra che il collegamento non sia stato interrotto ora :-(
+ codice incrementale e decrementale di Gert Cauwenberghs : supporta kernel sia lineari che non lineari. Codice Matlab.
+ App SVM incrementale di Chris Diehl : supporta kernel sia lineari che non lineari. Codice Matlab.
+ Codice Allair Shilton's SVMHeavy : solo classificazione binaria e regressione Codice C ++
+ OnlineSVR di Francesco Parrella: Solo regressione. Matlab e C ++.
+ Pegasos : sia lineare che non lineare. Codice C e Matlab. Un'interfaccia java .
+ Langford's Vowpal Wabbit : Non sono sicuro :-(
+ Koby Crammer MCSVM : sia lineare che non lineare. Codice C

Un elenco più aggiornato è disponibile nella mia risposta Quora .


(+1) Benvenuti nel sito. Questa è una lista abbastanza esaustiva! :)
cardinale

4

Un'altra possibilità è la semina alfa . Non so se libSVM lo supporta. L'idea è quella di dividere un'enorme quantità di dati di allenamento in blocchi. Quindi si allena un SVM sul primo pezzo. Poiché i vettori di supporto risultanti non sono altro che alcuni dei campioni dei tuoi dati, li prendi e li usi per addestrare il tuo SVM con il prossimo pezzo. Inoltre, si utilizza tale SVM per calcolare una stima iniziale dei valori alfa per la successiva iterazione (seeding). Pertanto, i vantaggi sono duplici: ciascuno dei problemi è più piccolo e attraverso l'inizializzazione intelligente convergono ancora più velocemente. In questo modo si semplifica un enorme problema nella risoluzione sequenziale di una serie di passaggi più semplici.


c'è qualche libreria là fuori che applica questo metodo?
d.putto

apparentemente libsvm lo fa già, o almeno qualche variante dell'algoritmo work.caltech.edu/~htlin/program/libsvm
jpmuc

1

Un'altra opzione se stai cercando una soluzione "incrementale" può essere trovata qui ...

Incrementale liblinare

Un'estensione di LIBLINEAR che consente l'apprendimento incrementale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.