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?
14
Réponses:
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.
la source
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 .
la source
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.
la source
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.
la source