Codierung und Kreuzvalidierung

Aug 18 2020

Vor kurzem habe ich über die richtige Verwendung der Codierung innerhalb eines Kreuzvalidierungsschemas nachgedacht. Die üblicherweise empfohlene Methode zum Codieren von Funktionen lautet:

  1. Teilen Sie die Daten in Zug- und Testsatz (Hold-out) auf
  2. Montieren Sie den Encoder (entweder LabelEncoderoder OneHotEncoder) am Zugset
  3. Transformieren Sie sowohl den Zug als auch das Testset mit einem eingebauten Encoder.

Dieser Weg soll verhindern, dass Daten verloren gehen. Dies scheint jedoch bei der Kreuzvalidierung häufig weggelassen zu werden. Nehmen wir an, ich führe eine Kreuzvalidierung für das oben genannte Zugset durch. Wenn ich den Zugsatz codiere und dann eine Kreuzvalidierung durchführe, ahmt dies die obigen Schritte nicht wirklich nach. Sollte die Codierung dann nicht "innerhalb" der Kreuzvalidierung durchgeführt werden? Sollten wir beispielsweise unter der Annahme, dass wir eine 5-fache Kreuzvalidierung durchführen, den Encoder nicht 4-fach anpassen und in jedem Kreuzvalidierungsschritt auf 5-fach transformieren? Ich glaube, es ist das, was normalerweise bei der Zielcodierung gemacht wird, aber nicht wirklich bei der Label- oder One-Hot-Codierung.

Meine Fragen sind daher:

  1. Habe ich Recht mit der Notwendigkeit, den Encoder in jedem Kreuzvalidierungsschritt 4-fach und nicht in der 5. Validierungsfalte einzubauen, wenn wir wirklich eine Überanpassung verhindern wollen?
  2. Wenn nicht, warum ist es wirklich notwendig, alle drei zuvor genannten Schritte auszuführen, während Sie sich mit dem Zug- und Test-Set (Hold-out) befassen?

Antworten

1 Erwan Aug 18 2020 at 07:50

Sie haben Recht, der Codierungsschritt selbst kann eine Quelle für Datenlecks sein und sollte normalerweise innerhalb der CV-Schleife nur mit dem aktuellen Trainingssatz durchgeführt werden, wie Sie beschreiben.

Der Grund ist in der Tat der, den Sie im Kommentar erwähnen: Wenn es eine Klassenbezeichnung oder eine Feature-Kategorie gibt, die in einem bestimmten Trainingssatz während des Lebenslaufs nicht zufällig erscheint, sollte das Modell nicht wissen, dass diese Klasse / Kategorie überhaupt existiert.

Im Allgemeinen würde ich denken, dass dieses Problem nur die Leistung des Testsatzes verringern kann, daher ist es wahrscheinlich nicht so schwerwiegend wie andere Arten von Datenlecks. Trotzdem ist es definitiv ein saubereres experimentelles Design, nur mit dem Trainingssatz zu codieren.

Ein eng verwandtes Problem in NLP ist, wenn das System nicht für Wörter außerhalb des Wortschatzes (OOV) ausgelegt ist: Wenn alle Wörter sowohl im Trainings- als auch im Testsatz codiert sind (gleicher Fehler), sieht es fälschlicherweise so aus, als ob Jeder Text kann vollständig codiert werden, was später zu bösen Überraschungen führen kann.

Abgesehen davon ist es normalerweise eine gute Idee, seltene Merkmale oder Beschriftungswerte zu verwerfen. In diesem Fall sollte das Ergebnis entweder mit der richtigen oder mit der schlampigen Methode identisch sein.