Mein Trainingsset enthält ungefähr 50.000 Einträge, mit denen ich ein erstes Lernen mache. Wöchentlich werden ~ 5.000 Einträge hinzugefügt. aber der gleiche Betrag "verschwindet" (da es sich um Benutzerdaten handelt, die nach einiger Zeit gelöscht werden müssen).
Daher verwende ich Online-Lernen, da ich zu einem späteren Zeitpunkt keinen Zugriff auf den vollständigen Datensatz habe. Momentan verwende ich eine, SGDClassifier
die funktioniert, aber mein großes Problem: Es erscheinen neue Kategorien und jetzt kann ich mein Modell nicht mehr verwenden, da sie nicht in der Anfangszeit waren fit
.
Gibt es einen Weg mit SGDClassifier
oder einem anderen Modell? Tiefes Lernen?
Es spielt keine Rolle, ob ich JETZT von vorne anfangen muss (dh etwas anderes als verwenden muss SGDClassifier
), aber ich brauche etwas, das Online-Lernen mit neuen Labels ermöglicht.
Antworten:
Es hört sich so an, als ob Sie das Modell nicht jedes Mal neu trainieren möchten, wenn eine neue Etikettenkategorie angezeigt wird. Der einfachste Weg, um maximale Informationen über vergangene Daten zu erhalten, besteht darin, einen Klassifikator pro Kategorie zu trainieren.
Auf diese Weise können Sie jeden Klassifikator schrittweise ("online") mit so etwas wie trainieren,
SGDClassifier
ohne ihn neu trainieren zu müssen. Immer wenn eine neue Kategorie angezeigt wird, fügen Sie einen neuen binären Klassifikator nur für diese Kategorie hinzu. Anschließend wählen Sie die Klasse mit der höchsten Wahrscheinlichkeit / Punktzahl unter den Klassifizierern aus.Dies unterscheidet sich auch nicht wesentlich von dem, was Sie heute tun, da das Multiklassen-Szenario bereits durch Anbringen mehrerer "One vs All" -Klassifikatoren unter der Haube
scikit's SDGClassifier
bewältigt wird .Wenn immer wieder neue Kategorien auftauchen, kann es natürlich schwierig werden, diesen Ansatz zu verwalten.
quelle
warm_start
Option haben.Wenn sehr selten neue Kategorien eintreffen, bevorzuge ich selbst die von @oW_ bereitgestellte "one vs all" -Lösung . Für jede neue Kategorie trainieren Sie ein neues Modell mit X Anzahl von Stichproben aus der neuen Kategorie (Klasse 1) und X Anzahl von Stichproben aus den übrigen Kategorien (Klasse 0).
Wenn jedoch häufig neue Kategorien eintreffen und Sie ein einzelnes gemeinsames Modell verwenden möchten , gibt es eine Möglichkeit, dies mithilfe neuronaler Netze zu erreichen.
Zusammenfassend lässt sich sagen, dass wir beim Eintreffen einer neuen Kategorie der Softmax-Ebene einen entsprechenden neuen Knoten mit null (oder zufälligen) Gewichten hinzufügen und die alten Gewichte intakt halten. Anschließend trainieren wir das erweiterte Modell mit den neuen Daten. Hier ist eine visuelle Skizze für die Idee (von mir gezeichnet):
Hier ist eine Implementierung für das gesamte Szenario:
Das Modell wird in zwei Kategorien trainiert:
Eine neue Kategorie kommt an,
Modell- und Zielformate werden entsprechend aktualisiert.
Das Modell wird auf neue Daten trainiert.
Code:
welche Ausgänge:
Ich sollte zwei Punkte in Bezug auf diese Ausgabe erklären:
Die Modellleistung wird durch einfaches Hinzufügen eines neuen Knotens von
0.9275
bis verringert0.8925
. Dies liegt daran, dass die Ausgabe des neuen Knotens auch für die Kategorieauswahl enthalten ist. In der Praxis sollte die Ausgabe eines neuen Knotens erst aufgenommen werden, nachdem das Modell an einer großen Stichprobe trainiert wurde. Zum Beispiel sollten wir[0.15, 0.30, 0.55]
zu diesem Zeitpunkt den größten der ersten beiden Einträge in der 2. Klasse erreichen.Die Leistung des erweiterten Modells in zwei (alten) Kategorien
0.88
ist geringer als die des alten Modells0.9275
. Dies ist normal, da das erweiterte Modell nun einer von drei Kategorien anstelle von zwei eine Eingabe zuweisen möchte. Dieser Rückgang wird auch erwartet, wenn wir aus drei binären Klassifikatoren im Vergleich zu zwei binären Klassifikatoren im Ansatz "Eins gegen Alle" auswählen.quelle
Ich muss sagen, dass ich zu diesem Thema keine Literatur gefunden habe. Soweit ich weiß, ist das, was Sie fragen, unmöglich. Sie sollten sich dessen bewusst sein, und der Product Owner sollte es auch sein. Der Grund dafür ist, dass jede Verlustfunktion auf bekannten Labels beruht, sodass Sie kein Label vorhersagen können, das nicht in den Trainingsdaten enthalten ist. Es ist auch Science-Fiction, dass ein Algorithmus für maschinelles Lernen etwas vorhersagen kann, für das er nicht trainiert wurde
Trotzdem denke ich, dass es eine Problemumgehung geben kann (lassen Sie mich darauf hinweisen, dass dies eine Meinung ist, die nicht auf formaler Literatur basiert). Wenn der Klassifikator probabilistisch ist, ist die Ausgabe die Wahrscheinlichkeit, dass jede Klasse wahr ist, und die Entscheidung ist die höhere Wahrscheinlichkeit. Möglicherweise können Sie einen Schwellenwert für diese Wahrscheinlichkeit festlegen, sodass das Modell "unbekannt" vorhersagt, wenn alle Wahrscheinlichkeiten unter diesem Schwellenwert liegen. Lassen Sie mich Ihnen ein Beispiel geben.
Was Sie mit diesen Unbekannten machen , hängt von der Geschäftslogik ab. Wenn sie wichtig sind, können Sie einen Pool von ihnen erstellen und das Modell anhand der verfügbaren Daten neu trainieren. Ich denke, Sie können eine Art "Transferlernen" aus dem trainierten Modell durchführen, indem Sie die Dimension der Ausgabe ändern. Aber das ist etwas, mit dem ich nicht konfrontiert bin, also sage ich nur
Nehmen Sie die Zählung an,
SGDClassifier
dieSVM
darunter verwendet wird, was kein probabilistischer Algorithmus ist. In der folgendenSGDClassifier
Dokumentation können Sie dasloss
Argument ändernmodified_huber
oder ändernlog
, um probabilistische Ausgaben zu erhalten.quelle
Es gibt zwei Möglichkeiten:
Prognostizieren Sie die Wahrscheinlichkeit, dass ein Datenpunkt zu einem Unbekannten oder einer
unk
Kategorie gehört. Alle neuen Kategorien, die im Stream angezeigt werden, sollten als vorhergesagt werdenunk
. Dies ist bei der Verarbeitung natürlicher Sprache (Natural Language Processing, NLP) üblich, da in Wortströmen immer neue Wort-Token angezeigt werden.Trainieren Sie das Modell jedes Mal neu, wenn eine neue Kategorie angezeigt wird.
Da Sie erwähnen
SGDClassifier
, gehe ich davon aus, dass Sie Scikit-Learn verwenden. Scikit-learn unterstützt das Online-Lernen nicht sehr gut. Es wäre besser, ein Framework zu wechseln, das Streaming und Online-Lernen besser unterstützt, wie z. B. Spark .quelle