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?
preprocessing
Pooja
quelle
quelle
Antworten:
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:
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.
quelle
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.
quelle
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:
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!
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.
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.
quelle
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.
quelle