web-dev-qa-db-fra.com

Le SVM dans sklearn prend-il en charge l'apprentissage incrémentiel (en ligne)?

Je suis actuellement en train de concevoir un système de recommandation d'articles de texte (un cas binaire "intéressant" ou "non intéressant"). L'une de mes spécifications est qu'il doit être mis à jour en permanence en fonction des tendances changeantes.

D'après ce que je peux dire, la meilleure façon de le faire est d'utiliser l'algorithme d'apprentissage automatique qui prend en charge incrémentiel/ apprentissage en ligne .

Des algorithmes comme Perceptron et Winnow prennent en charge l'apprentissage en ligne, mais je ne suis pas complètement certain des machines à vecteurs de support. Est-ce que la bibliothèque scikit-learn python prend en charge l'apprentissage en ligne et si oui, une machine à vecteur de support est-elle l'un des algorithmes qui peuvent l'utiliser?

Je ne suis évidemment pas complètement lié à l'utilisation de machines à vecteurs de support, mais elles sont généralement l'algorithme de référence pour la classification binaire en raison de leurs performances globales. Je serais prêt à changer pour ce qui convient le mieux à la fin.

39
Michael Aquilina

Bien qu'il existe des algorithmes en ligne pour les SVM, il est devenu important de spécifier si vous voulez des SVM noyaux ou linéaires, car de nombreux algorithmes efficaces ont été développés pour le cas particulier des SVM linéaires.

Pour le cas linéaire, si vous utilisez le classificateur SGD dans scikit-learn avec la perte de charnière et la régularisation L2, vous obtiendrez un SVM qui peut être mis à jour en ligne/incrémentalement. Vous pouvez combiner cela avec transformations de fonctionnalité qui se rapprochent d'un noya pour obtenir une similitude avec un noyau SVM en ligne.

L'une de mes spécifications est qu'il doit être mis à jour en permanence en fonction des tendances changeantes.

Ceci est appelé dérive du concept, et ne sera pas bien géré par un simple SVM en ligne. L'utilisation du classificateur PassiveAggresive vous donnera probablement de meilleurs résultats, car son taux d'apprentissage ne diminue pas avec le temps.

En supposant que vous obtenez des commentaires pendant l'entraînement/la course, vous pouvez essayer de détecter des diminutions de précision au fil du temps et commencer à entraîner un nouveau modèle lorsque la précision commence à diminuer (et passer au nouveau lorsque vous pensez qu'il est devenu plus précis). JSAT a 2 méthodes de détection de dérive (voir jsat.driftdetectors ) qui peuvent être utilisées pour suivre la précision et vous alerter lorsqu'elle a changé .

Il a également plus de méthodes linéaires et de noyau en ligne.

(note de parti pris: je suis l'auteur de JSAT).

30
Raff.Edward

Peut-être que c'est moi d'être naïf mais je pense qu'il vaut la peine de mentionner comment mettre à jour le classificateur SGD sci-kit lorsque vous présentez vos données de manière incrémentielle:

clf = linear_model.SGDClassifier()
x1 = some_new_data
y1 = the_labels
clf.partial_fit(x1,y1)
x2 = some_newer_data
y2 = the_labels
clf.partial_fit(x2,y2)
19
user277194

Aspects techniques

La réponse courte est non. L'implémentation de Sklearn (ainsi que la plupart des autres solutions existantes) ne prend pas en charge la formation SVM en ligne. Il est possible de former SVM de manière incrémentielle, mais ce n'est pas une tâche si triviale.

Si vous voulez vous limiter au cas linéaire, la réponse est oui, car sklearn vous fournit la descente de gradient stochastique (SGD), qui a l'option de minimiser le critère SVM.

Vous pouvez également essayer la bibliothèque pegasos, qui prend en charge la formation SVM en ligne.

Aspects théoriques

Le problème de l'adaptation aux tendances est actuellement très populaire dans la communauté ML. Comme l'a déclaré @Raff, il est appelé dérive du concept , et a de nombreuses approches, qui sont souvent des types de méta-modèles, qui analysent "comment la tendance se comporte "et modifier le modèle ML sous-jacent (en le forçant par exemple à se recycler sur le sous-ensemble des données). Vous avez donc ici deux problèmes indépendants:

  • le problème de la formation en ligne, qui est purement technique, et peut être traité par SGD ou d'autres bibliothèques que sklearn
  • dérive de concept, qui est actuellement un sujet brûlant et qui n'a pas fonctionne juste réponses Il y a beaucoup de possibilités, d'hypothèses et de preuves de concepts, alors qu'il n'y a personne, une manière généralement acceptée de traiter ce phénomène, en fait de nombreuses thèses de doctorat en ML sont actuellement basées sur ce problème.
9
lejlot

Si vous êtes intéressé par l'apprentissage en ligne avec dérive de concept, voici quelques travaux antérieurs

  1. Apprendre sous Concept Drift: an Overview https://arxiv.org/pdf/1010.4784.pdf

  2. Le problème de la dérive des concepts: définitions et travaux connexes http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.58.9085&rep=rep1&type=pdf

  3. A Survey on Concept Drift Adaptation http://www.win.tue.nl/~mpechen/publications/pubs/Gama_ACMCS_AdaptationCD_accepted.pdf

  4. MOA Concept Drift Active Learning Strategies for Streaming Data http://videolectures.net/wapa2011_bifet_moa/

  5. Un flux d'algorithmes pour la dérive de concept http://people.cs.georgetown.edu/~maloof/pubs/maloof.heilbronn12.handout.pdf

  6. FLUX DE DONNÉES MINIÈRES AVEC CONCEPT DRIFT http://www.cs.put.poznan.pl/dbrzezinski/publications/ConceptDrift.pdf

  7. Analyse des données de séries chronologiques avec traitement de flux et apprentissage automatique http://www.ibmbigdatahub.com/blog/analyzing-time-series-data-stream-processing-and-machine-learning

3
SemanticBeeng

SGD pour les tâches d'apprentissage par lots a normalement un taux d'apprentissage décroissant et se répète plusieurs fois. Donc, pour un apprentissage purement en ligne, assurez-vous que learning_rate est défini sur "constant" dans sklearn.linear_model.SGDClassifier () et eta0 = 0,1 ou toute valeur souhaitée. Par conséquent, le processus est le suivant:

clf= sklearn.linear_model.SGDClassifier(learning_rate = 'constant', eta0 = 0.1, shuffle = False, n_iter = 1)
# get x1, y1 as a new instance
clf.partial_fit(x1, y1)
# get x2, y2
# update accuracy if needed
clf.partial_fit(x2, y2)
3
Alaleh Rz

Un moyen de faire évoluer SVM pourrait être de diviser votre grand ensemble de données en lots pouvant être consommés en toute sécurité par un algorithme SVM, puis de trouver des vecteurs de support pour chaque lot séparément, puis de construire un modèle SVM résultant sur un ensemble de données comprenant tous les vecteurs de support trouvés dans tous les lots.

La mise à jour des tendances peut être réalisée en maintenant une fenêtre de temps à chaque fois que vous exécutez votre pipeline de formation. Par exemple, si vous effectuez votre formation une fois par jour et qu'il y a suffisamment d'informations dans les données historiques d'un mois, créez votre ensemble de données de formation à partir des données historiques obtenues au cours des 30 derniers jours.

1
Sergey Zakharov