Bildung einer Trainingsdatenstichprobe mit Verteilungsverschiebung

Haftungsausschluss: Dieser Artikel ist ein übersetztes Produkt von Max Halforda . Die Übersetzung ist nicht sauber, sondern anpassungsfähig. So dass es auf jeder Wissenslinie Verständnis gibt.







„Meine Freunde und ich haben uns kürzlich für das Finale des Data Science Game 2017 qualifiziert. Der erste Teil des Wettbewerbs war Kaggle mit einem Datensatz von Deezer (1). Das Problem bestand in der Lösung des Problems der binären Klassifizierung: Es musste vorhergesagt werden, ob der Benutzer zum Anhören der ihm angebotenen Komposition wechseln würde.



Wie andere Teams haben wir die relevanten Funktionen extrahiert und den XGBoost (2) -Klassifikator trainiert. Wir haben jedoch eine besondere Sache gemacht, eine Teilstichprobe des Trainingsdatensatzes, damit dieser (der Trainingsdatensatz) repräsentativer für den Testsatz wurde. "




Eine der Grundvoraussetzungen für den Lernprozess für den erfolgreichen Betrieb eines Maschinenmodells ist die gleiche Art der Verteilungen in den Trainings- und Testdatensätzen. Als grobes Beispiel: Das Modell ist für Benutzer ab 20 Jahren geschult, und in der Testprobe sind Benutzer über 60 Jahre alt.



Hier ist es intuitiv natürlich, dass das Modell mit dem Alter, in dem es nicht trainiert wurde, nicht zurechtkommt. Natürlich ist ein solches Beispiel rein synthetisch, aber in Wirklichkeit reicht es für signifikante Unterschiede aus, das Modell für 20+ zu trainieren und zu versuchen, es für 30+ zum Laufen zu bringen. Das Ergebnis wird ähnlich sein.



Dies liegt daran, dass die Modelle die Verteilungen (3) der Daten lernen. Wenn die Verteilungen eines Features in den Trainings- und Testsätzen gleich sind, wird das Modell Ihnen danken.



Übersetzer einfügen: Als ich mich zum Übersetzen hinsetzte, hatte ich eine Frage: Warum sollte das Training auf den Test zugeschnitten sein, da der Test tatsächlich unsichtbare Daten widerspiegelt, die als Eingabe für die Produktion in das Modell gelangen. Dann habe ich verschlafen, noch einmal gelesen und alles ist vorbei. Der Trick ist, dass Retrospektiven unter dem Einfluss von Faktoren für die Gegenwart irrelevant werden können. Dazu später mehr (Beispiel leicht angepasst).



Verzerrungen in Verteilungen für ein Merkmal können aus verschiedenen Gründen auftreten. Das intuitivste Beispiel kann von Facebook ausgeliehen werden.



Angenommen, ein Unternehmen wurde in Minutenschnelle an einem Modell geschult, das auf einem Feature (ein Feature ist dasselbe wie ein Feature) als Zeitvertreib basiert. Lassen Sie es den Grad der Benutzertreue auf einer Zehn-Punkte-Skala synthetisch vorhersagen.



Als die Aufteilung der gemeinsamen Facebook-Anwendung in das soziale Hauptnetzwerk (Feed usw.) und das Nachrichtensystem erfolgte, verringerte sich die Zeit in der Hauptanwendung, dh die eingehenden Datensätze änderten sich und entsprachen nicht mehr der vergangenen Retrospektive.

Mathematisch gesehen wird das Modell unter Berücksichtigung des Zeitmerkmals eine geringere Loyalität vorhersagen, obwohl dies in der Realität nicht der Fall ist - die Zeitübertragung wird einfach in zwei Anwendungen unterteilt. Es kommt traurig heraus.



Eine Verteilungsverschiebung tritt daher auf, wenn die Verteilung historischer Daten für die Vorhersage neuer Daten irrelevant wird.



Im Deezer-Datensatz lag die Inkonsistenz der Verteilungen in der Funktion, mit der die Anzahl der angehörten Songs gemessen wurde, bevor das Vorhersageproblem gelöst wurde. Diese Funktion hatte eine exponentielle (4) Verteilung sowohl im öffentlichen als auch im Testdatensatz. Im Testdatensatz war er jedoch ausgeprägter, sodass der Durchschnitt im Trainingssatz niedriger war als im Testsatz. Nach dem erneuten Abtasten der Trainingsverteilung konnten wir die ROC-AUC-Metrik (5) erhöhen und die Bewertung um etwa 20 Punkte erhöhen.



Unten finden Sie ein Beispiel für den Verteilungsunterschied:



import numpy as np
import plotly.figure_factory as ff

train = np.random.exponential(2, size=100000)
test = np.random.exponential(1, size=10000)

distplot = ff.create_distplot([train, test], ['Train', 'Test'], bin_size=0.5)
distplot.update_layout(title_text=' Test, Train')


" "



Die Idee, die Verteilungsverschiebung auszugleichen, besteht darin, die Trainingsprobe so umzuformen, dass sie die Testverteilung widerspiegelt. "



Stellen wir uns vor, wir möchten aus unserem Trainingssatz eine Teilstichprobe von 50.000 Beobachtungen erstellen, um sie an die Verteilung des Testsatzes anzupassen. Was möchten Sie intuitiv tun?



Stellen Sie sicher, dass Objekte, die im Testdatensatz häufiger vorkommen, auch im Training häufig vorkommen! Aber wie können Sie feststellen, welche Objekte mehr und welche seltener benötigt werden?



Waage!



Die Schritte werden ungefähr so ​​aussehen:



  • Teilen Sie die numerische Gerade der Verteilung in gleiche Intervalle (oder Körbe (Behälter)).
  • Zählen Sie die Anzahl der Objekte in jedem Korb (Behältergröße).
  • Berechnen Sie für jede Beobachtung im Korb das Gewicht gleich 1 / (Behältergröße)
  • Erstellen Sie eine Teilstichprobe von k mit einer gewichteten Verteilung (Objekte mit einer höheren Gewichtung werden häufiger in der Teilstichprobe angezeigt).


Beim Übertragen auf den Code führen wir die folgenden Aktionen aus:



SAMPLE_SIZE = 50000
N_BINS = 300

#   ,       .
#        
step = 100 / N_BINS

test_percentiles = [
    np.percentile(test, q, axis=0)
    for q in np.arange(start=step, stop=100, step=step)
]

#     . 
#    ,    
train_bins = np.digitize(train, test_percentiles)

#          i   ,
#  0      , 1    1    i 
train_bin_counts = np.bincount(train_bins)

#    ,        
weights = 1 / np.array([train_bin_counts[x] for x in train_bins])

#   ,     
weights_norm = weights / np.sum(weights)

np.random.seed(0)

sample = np.random.choice(train, size=SAMPLE_SIZE, p=weights_norm, replace=False)

distplot_with_sample = ff.create_distplot([train, test, sample], ['Train', 'Test', 'New train'], bin_size=0.5)
distplot_with_sample.update_layout(title_text=' Test, Train, New train')


" " Die



neue Verteilung (grün) passt jetzt besser zur Verteilung der Testprobe (orange). Wir haben im Wettbewerb ähnliche Aktionen durchgeführt - der ursprüngliche Datensatz enthielt 3 Millionen Zeilen, die Größe der neuen Stichprobe wurde aus 1,3 Millionen Objekten generiert. Die Daten wurden kleiner, aber die Repräsentativität der Verteilung verbesserte die Qualität der Ausbildung.



Einige Anmerkungen aus der persönlichen Erfahrung des Autors:



  • Die Anzahl der Körbe spielt keine große Rolle, aber je weniger Körbe, desto schneller lernt der Algorithmus (versuchen Sie, die Anzahl der Körbe (N_BINS) im Beispiel auf 3, 30 zu ändern, und Sie werden sehen, dass der Unterschied wirklich gering ist).
  • , , , “” , , .

    ( , “” , “” . . , )



Der Umformungsalgorithmus befindet sich im Github des Autors ( xam- Ordner ). In Zukunft plant der Autor, neue Themen zu analysieren und im Blog zu teilen.



Ich hoffe, die Übersetzung und die Notizen waren hilfreich und klar. Ich freue mich auf Ihr Feedback in einem konstruktiven Format. Vielen Dank für Ihre Zeit.



Fußnoten:



1. Deezer ist ein französischer Online-Musik-Streaming-Dienst. Geben Sie Spotify, Ya.Muzyki ein und Sie erhalten



2. XGBoost- Algorithmus zur Erhöhung des extremen Gradienten. Ich habe es absolut geliebt, es "Gradientenverstärkung bei Steroiden" zu nennen. Die Idee des Boostings besteht darin, mehrere homogene schwache Schüler auszubilden, von denen jeder auf der Grundlage der retrospektiven Lernerfahrung des vorherigen eine Note bildet, wobei auf die Klassen geachtet wird, in denen der vorherige Algorithmus am meisten gestolpert ist. Die Idee hinter einem Farbverlauf ist mit einem einfachen Wort, Lernfehler zu minimieren. XGBoost als Algorithmus ist eine rechnerisch vorteilhaftere Konfiguration von Gradient Boosting



3. Verteilung bedeutet hier genau das, was das Gesetz beschreibt, nach dem Zahlen in einer Variablen gestreut werden.



4. Meiner persönlichen Meinung nach der verständlichste Ansporn für die Visualisierung von ExponentialVerteilung im Kopf ist seine Definition als Verteilung mit konstanter Intensität.



5. ROC-AUC (Area Under Receiver Operating Characteristic Curve) - die Fläche unter der Kurve der „Receiver Processing Characteristics“ - ein wörtlicher Name, da die Metrik aus der Signalverarbeitungstheorie stammt. Die ROC-Kurve ist sehr steil - sie zeigt das Verhältnis von True Positive und False Positive der Modellantworten, wenn sich die Wahrscheinlichkeitsschwelle für die Zuordnung zu einer Klasse ändert und einen „Bogen“ bildet. Aufgrund der Tatsache, dass das Verhältnis von TP und FP sichtbar ist, kann die optimale Wahrscheinlichkeitsschwelle in Abhängigkeit von Fehlern der 1. und 2. Art ausgewählt werden.



Wenn die Genauigkeit des Modells berücksichtigt wird und die Wahrscheinlichkeitsschwelle der Antworten nicht berücksichtigt wird, wird die ROC-AUC-Metrik verwendet, die Werte im Bereich [0,1] annimmt. Für ein konstantes Modell mit einem Klassengleichgewicht beträgt die ROC-AUC ungefähr 0,5. Daher bestehen die folgenden Modelle die Überprüfung der geistigen Gesundheit (Prüfung auf geistige Gesundheit) nicht. Je näher der Bereich unter der ROC-Kurve an eins liegt, desto besser. Für die Indizierung des Nutzens der Ergebnisse im Allgemeinen ist der AUC-ROC des trainierten Modells relevant, um ihn mit dem AUC-ROC des konstanten Modells zu vergleichen.



All Articles