Unterschiedliche Verteilung von Test- und Trainingssätzen


13

Ich arbeite an einem datenwissenschaftlichen Wettbewerb, bei dem sich die Verteilung meines Testsatzes vom Trainingssatz unterscheidet. Ich möchte Beobachtungen aus dem Trainingssatz unterproben, die dem Testsatz sehr ähnlich sind.

Wie kann ich das machen?


Random Under-Sampling, Random Over-Sampling, Cluster-basiertes Over-Sampling, Informed-Over-Sampling: Synthetic Minority Over-Sampling-Technik, Modifizierte Synthetic Minority Oversampling-Technik (MSMOTE) usw.
Aditya

Markieren Sie eine der Antworten besser als "Akzeptierte Antwort", wenn Sie mit einer dieser Antworten zufrieden sind.
TwinPenguins

Antworten:


15

Gute Frage, dies ist das, was im Paradigma des maschinellen Lernens entweder als "Covariate Shift" oder "Model Drift" oder "Nonstationarity" usw. bekannt ist.

Eine der kritischen Annahmen, die man treffen würde, um ein Modell für maschinelles Lernen für zukünftige Vorhersagen zu erstellen, ist, dass unsichtbare Daten (Test) aus derselben Verteilung stammen wie Trainingsdaten! In der Realität bricht diese recht einfache Annahme jedoch leicht und bevorstehende Daten (ihre Verteilung) ändern sich aus vielen Gründen im Laufe der Zeit. Für diejenigen, die mit diesem sehr wichtigen Problem möglicherweise nicht vertraut sind, empfehle ich, hier zu suchen oder zu posten !

Für mich fällt Ihre Frage in dieselbe Kategorie. Ich habe zwar nicht die perfekte Lösung (eine Implementierung zu bieten), aber ich denke, Sie sehen vielleicht:

  • Dieser Blog-Beitrag bietet Ihnen eine einfache Möglichkeit, die Unterabtastung von Trainingsdaten mit dem in Python bereitgestellten Code durchzuführen!
  • Überprüfen Sie dieses Forschungspapier . Sie schlagen vor, das Problem zu lösen, indem die Trainingsdaten so neu gewichtet werden, dass die Verteilung des Trainings näher an der Verteilung des Tests liegt, wobei das Verfahren zur Schätzung der Kullback-Leibler-Wichtigkeitsschätzung auf der Grundlage des Satzes " Kullback-Leibler-Divergenz " verwendet wird. Ich weiß nicht, ob sie eine Implementierung bereitstellen oder ob sie einfach implementiert werden kann, aber ich denke, es könnte sich lohnen, sie zu untersuchen, da dies eine professionelle Methode ist, um das Missverhältnis zwischen der Verteilung zu beheben.

SCHNELLES Update (eine gute Lösung) : Ich habe eine Python-Implementierung des KLIEP-Algorithmus dieses Forschungspapiers gefunden (letzter Punkt), um diese Gewichte zu finden. Es scheint eher einfach zu bedienen! Grundsätzlich wird das Training durch Setzen von Gewichten (über den KLIEP-Algorithmus) erneut abgetastet, so dass die Annahme einer ähnlichen Verteilung von Zug und Test so weit wie möglich zutrifft.


5

Ich möchte Beobachtungen aus dem Trainingssatz unterproben, die dem Testsatz sehr ähnlich sind.

Ich bin mir nicht sicher, ob Sie das tun möchten. Der ganze Zweck besteht eher darin, Ihren Algorithmus so zu trainieren, dass er sich gut auf unsichtbare Daten verallgemeinern lässt.

Normalerweise sollte man seine Testdaten an seine Zugdaten anpassen (z. B. Standardisierung der Testdaten anhand der Zugdaten ) und nicht umgekehrt. In der Praxis Sie nicht wissen , Ihre Testdaten.


3

Die Unterabtastung von Zugsätzen ist möglicherweise nicht die beste Lösung!

Die Unterschiede zwischen Test- / Ausführungssatz und Trainingssatzverteilung / -merkmalen sind bei überwachten Lernaufgaben sehr häufig (dies ist einer der Gründe, warum Wettbewerbe wie Kaggle eine Herausforderung darstellen). Aus diesem Grund sagen wir, dass die vergangene Leistung (nur) als Leitfaden für die Schätzung der zukünftigen Leistung verwendet werden kann, sie jedoch nicht anzeigt / garantiert . Daher wurden verallgemeinerbare Modelle immer fein abgestimmten Modellen vorgezogen, die im Zug (Unter-) Satz sehr gut funktionieren, bei unsichtbaren Daten jedoch schlecht abschneiden.

Während ein solcher Unterschied normal ist, kann die zu große Lücke zwischen der vergangenen und der zukünftigen Stichprobe als Beispiel für eine Konzeptdrift bezeichnet werden, die für sich genommen ein aktives Forschungsfeld darstellt. Angesichts Ihrer Frage kann ich nicht beurteilen, dass es sich bei Ihrem Fall um einen normalen ML-Fall handelt oder dass die Konzeptdrift tatsächlich stattfindet.

Das sind meine Vorschläge:

  1. Trainieren Sie eine Reihe von Modellen mit hoher Generalisierungsfähigkeit. Mithilfe der Bootstrap- Stichprobe aus Ihrem Zugdatensatz können Sie leicht die Verzerrungs- und Varianzkomponenten von Fehlern berechnen . Denken Sie daran, dass Sie nach einem Modell mit geringer Varianz suchen (bei dem die Änderungen der Daten nur einen geringen Einfluss auf die Leistung haben würden), anstatt nach Modellen mit geringer Verzerrung, aber hoher Varianz (die möglicherweise zu Ihrem Trainings- (Teil-) Satz passen). Jetzt können Sie die besten Algorithmen auswählen und anhand des Testsatzes bewerten. Beachten Sie, dass wir in der Trainingszeit nicht auf das Testset schauen sollten!

  2. Suchen Sie anstelle von mehreren zufälligen Downsamplings nach Standardisierung / Normalisierung und Funktionsauswahl / Engineering. Diese Techniken könnten beim Erlernen allgemeinerer Modelle praktisch sein. Beispielsweise kann sich manchmal der Bereich der Merkmalsdomäne im Laufe der Zeit ändern, während die Form der Verteilung (was auch immer sie ist) nahezu gleich bleibt (z. B. dieselbe Verteilung, die nach links oder rechts verschoben ist). In einem solchen Fall kann eine einfache Standardisierung (dh das Zuordnen der Zug- und Testproben zu einem vordefinierten Raum wie [0,1] unter Verwendung verschiedener Zuordnungsfunktionen) die Symptome verringern.

  3. Ein systematisches Downsampling kann nur dann eine geeignete Lösung sein, wenn Sie es auf der Grundlage einiger Kenntnisse über das Problem durchführen (nicht nur, um eine bessere Genauigkeit des Testdatensatzes zu erzielen). Beispielsweise wissen Sie möglicherweise, dass einige der Datensätze in den Zugdaten vor langer Zeit aus dem Fernfeld abgetastet wurden oder von bestimmten Faktoren beeinflusst wurden, die in Zukunft nicht mehr auftreten werden (bei der Erfassung von Testdaten). In einem solchen Fall können Sie die Stichproben entfernen, die irrelevant sein können, da Sie sicher sind, dass Sie solche Muster in Zukunft nicht mehr sehen werden (ich meine, Sie sollten eine Begründung für die Auswahl der Trainingsuntermenge haben, anstatt sich die Testmenge anzusehen, die dies tut In Wirklichkeit haben Sie keinen Zugriff darauf. In diesem Fall nenne ich es Ausreißerentfernung eher als Downsampling.


1
p(y|x)

-1

Es gibt ein gutes Paket in Python (Scikit lernen)

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

Mit diesem Paket können Sie Ihre Beobachtungen aus dem Trainingssatz abtasten.


1
Soweit ich die Frage verstehe, sind die Zug- / Testverteilungen unterschiedlich, was, wenn es nicht berücksichtigt wird, zu dem führen würde, was als "Covariate Shift" bekannt ist. Ein einfaches Teilbeispiel mit der Implementierung "train_test_split" in scikit learn, das hier erwähnt wird, berücksichtigt keine Verteilungen während des Split! Somit ist die Antwort nicht relevant.
TwinPenguins
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.