Est-il possible d'ajouter des données d'entraînement aux modèles SVM existants?


14

J'utilise libsvm et j'ai remarqué que chaque fois que j'appelle svmtrain (), je crée un nouveau modèle et qu'il ne semble pas y avoir d'option pour mettre des données dans un modèle existant. Est-ce possible de faire cependant? Suis-je tout simplement pas voir cet aspect dans libsvm?


Je ne sais pas ce que vous entendez par «mettre des données dans un modèle existant»? Pouvez-vous donner un exemple d'une autre technique (pas SVM) qui vous permet de le faire? Prenons par exemple la régression logistique; si vous ajoutez de nouvelles données, vous obtiendrez un nouvel ensemble de coefficients recyclés sur l'ensemble existant sans référence aux données qui sont «nouvelles» ou «anciennes», ce ne sont que des données d'apprentissage. Je suppose que si vous utilisez un solveur de type descente de gradient, vous pourriez gagner du temps en initialisant les valeurs précédemment optimisées, qui seront probablement proches de la nouvelle solution. C'est ce que tu veux dire?
Bogdanovist

Réponses:


17

Il semble que vous recherchiez un algorithme d'apprentissage "incrémentiel" ou "en ligne". Ces algorithmes vous permettent de mettre à jour un classificateur avec de nouveaux exemples, sans recycler le tout à partir de zéro.

C'est certainement possible avec les machines vectorielles de support, bien que je pense que libSVM ne le supporte pas actuellement. Il pourrait être utile de jeter un coup d'œil à plusieurs autres packages qui le proposent, y compris

PS: @Bogdanovist: Il existe une littérature assez complète à ce sujet. kNN est évidemment et trivialement incrémental. On pourrait transformer (certains) classificateurs bayésiens en classificateurs incrémentiels en stockant les nombres plutôt que les probabilités. STAGGER, AQ * et certains (mais pas tous) de la famille ID * d'algorithmes d'arbre de décision sont également incrémentiels, tout en haut de ma tête.


1
Intéressant, merci pour l'avertissement. J'avais déjà vu le terme `` en ligne '' utilisé, mais je n'avais pas réalisé sa signification technique (je pensais qu'il signifiait littéralement `` can haz internetz '').
Bogdanovist

Heureux de vous aider! J'aurais dû le mentionner ci-dessus, mais certains algorithmes en ligne / incrémentiels donnent en fait plus de poids aux exemples les plus récents, qui peuvent ou non être utiles, selon votre application (par exemple, idéal pour prédire les sujets Twitter, moins génial pour le cancer recherche).
Matt Krause

12

La plupart des utilitaires SVM en ligne / incrémentiels sont pour les noyaux linéaires et je suppose que ce n'est pas aussi difficile que pour les noyaux non linéaires.

Certains des principaux outils SVM en ligne / incrémentiels actuellement disponibles:
+ LaSVM de Leon Bottous : Il prend en charge les noyaux linéaires et non linéaires. Code C ++
+ LaRank de Bordes : il prend en charge les noyaux linéaires et non linéaires. Code C ++. Il semble que le lien soit rompu maintenant :-(
+ Code incrémental et décrémentiel de Gert Cauwenberghs : prend en charge les noyaux linéaires et non linéaires. Code Matlab.
+ Incremental SVM Learning de Chris Diehl : prend en charge les noyaux linéaires et non linéaires. Code Matlab.
+ Alistair SVMHeavy de Shilton : classification et régression binaires uniquement. Code C ++
+ OnlineSVR de Francesco Parrella: Seulement régression. Matlab et C ++.
+ Pegasos : linéaire et non linéaire. Code C et Matlab. Une interface java .
+ Vowpal Wabbit de Langford : Pas sûr :-(
+ MCSVM de Koby Crammer : linéaire et non linéaire. Code C

Une liste plus à jour peut être trouvée sur ma réponse Quora .


(+1) Bienvenue sur le site. C'est une liste assez exhaustive! :)
cardinal

4

Une autre possibilité est l'ensemencement alpha . Je ne sais pas si libSVM le prend en charge. L'idée est de diviser une énorme quantité de données d'entraînement en morceaux. Ensuite, vous entraînez un SVM sur le premier morceau. Comme les vecteurs de support résultants ne sont que quelques-uns des exemples de vos données, vous les prenez et les utilisez pour entraîner votre SVM avec le prochain morceau. En outre, vous utilisez ce SVM pour calculer une estimation initiale des valeurs alpha pour la prochaine itération (amorçage). Par conséquent, les avantages sont doubles: chacun des problèmes est plus petit et grâce à une initialisation intelligente, ils convergent encore plus rapidement. De cette façon, vous simplifiez un énorme problème en résolvant séquentiellement une série d'étapes plus simples.


Y a-t-il une bibliothèque qui applique cette méthode?
décédé

apparemment libsvm le fait déjà, ou au moins une variante de l'algorithme work.caltech.edu/~htlin/program/libsvm
jpmuc

1

Une autre option si vous cherchez une solution "incrémentale" peut être trouvée ici ...

Liblinear Incremental

Une extension de LIBLINEAR qui permet un apprentissage incrémental.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.