Ich verwende libsvm und habe festgestellt, dass ich jedes Mal, wenn ich svmtrain () aufrufe, ein neues Modell erstelle und es anscheinend keine Möglichkeit gibt, Daten in ein vorhandenes Modell einzufügen. Ist dies jedoch möglich? Sehe ich diesen Aspekt gerade nicht in libsvm?
14
Antworten:
Es hört sich so an, als würden Sie nach einem "inkrementellen" oder "online" Lernalgorithmus suchen. Mit diesen Algorithmen können Sie einen Klassifikator mit neuen Beispielen aktualisieren, ohne das Ganze von Grund auf neu zu trainieren.
Es ist definitiv mit Support-Vektor-Maschinen möglich, obwohl ich glaube, dass libSVM dies derzeit nicht unterstützt. Es könnte sich lohnen, einen Blick auf einige andere Pakete zu werfen, die es anbieten, einschließlich
PS: @Bogdanovist: Es gibt eine ziemlich umfangreiche Literatur dazu. kNN ist offensichtlich und trivial inkrementell. Man könnte (einige) Bayes-Klassifikatoren in inkrementelle Klassifikatoren umwandeln, indem man statt Wahrscheinlichkeiten Zählungen speichert. STAGGER, AQ * und einige (aber nicht alle) der ID * -Familie von Entscheidungsbaumalgorithmen sind ebenfalls inkrementell.
quelle
Die meisten Online- / inkrementellen SVM-Dienstprogramme sind für lineare Kernel vorgesehen, und ich nehme an, dass dies nicht so schwierig ist wie für nichtlineare Kernel.
Einige der derzeit verfügbaren bemerkenswerten Online / inkrementellen SVM-Tools:
+ Leon Bottous LaSVM : Unterstützt sowohl lineare als auch nichtlineare Kernel. C ++ Code
+ Bordes LaRank : Es unterstützt sowohl lineare als auch nichtlineare Kernel. C ++ Code. Es sieht so aus, als ob die Verknüpfung jetzt unterbrochen ist :-(
+ Inkrementeller und dekrementeller Code von Gert Cauwenberghs : Unterstützt sowohl lineare als auch nichtlineare Kernel. Matlab-Code.
+ Inkrementelles SVM-Lernen von Chris Diehl : Unterstützt sowohl lineare als auch nichtlineare Kernel. Matlab-Code.
+ Alistair Shiltons SVMHeavy : Nur binäre Klassifikation und Regression C ++ - Code
+ Francesco Parrellas OnlineSVR: Nur Regression. Matlab und C ++.
+ Pegasos : Sowohl linear als auch nicht linear. C-Code: Sowohl linear als auch nichtlinear. C- und Matlab-Code. Eine Java-Oberfläche .
+ Langfords Vowpal-Wabbit : Nicht sicher :-(
+ Koby Crammers MCSVM
Eine aktuellere Liste finden Sie auf meiner Quora-Antwort .
quelle
Eine andere Möglichkeit ist Alpha-Seeding . Mir ist nicht bekannt, ob libSVM dies unterstützt. Die Idee ist, eine große Menge an Trainingsdaten in Blöcke aufzuteilen. Dann trainierst du eine SVM auf dem ersten Stück. Da die resultierenden Support-Vektoren nichts anderes als einige der Stichproben Ihrer Daten sind, verwenden Sie diese, um Ihre SVM mit dem nächsten Block zu trainieren. Außerdem verwenden Sie diese SVM, um eine anfängliche Schätzung der Alpha-Werte für die nächste Iteration (Seeding) zu berechnen. Daher gibt es zwei Vorteile: Jedes der Probleme ist kleiner und durch intelligente Initialisierung konvergieren sie noch schneller. Auf diese Weise vereinfachen Sie ein großes Problem und lösen nacheinander eine Reihe von einfacheren Schritten.
quelle
Eine weitere Option, wenn Sie eine "inkrementelle" Lösung suchen, finden Sie hier ...
Liblinear Inkremental
Eine Erweiterung von LIBLINEAR, die inkrementelles Lernen ermöglicht.
quelle