Spark, ML, StringIndexer: Behandlung von unsichtbaren Labels

8

Mein Ziel ist es, einen multicals-Klassifikator zu erstellen.

Ich habe eine Pipeline für die Merkmalsextraktion erstellt und enthält als ersten Schritt einen StringIndexer-Transformer, um jeden Klassennamen einem Label zuzuordnen. Dieses Label wird im Classifier-Trainingsschritt verwendet.

Die Pipeline ist mit dem Trainingssatz ausgestattet.

Der Testsatz muss von der angepassten Pipeline verarbeitet werden, um dieselben Merkmalsvektoren zu extrahieren.

Ich weiß, dass meine Testset-Dateien die gleiche Struktur des Trainingssatzes haben. Das mögliche Szenario besteht darin, dass ein unsichtbarer Klassenname in der Testgruppe angezeigt wird. In diesem Fall kann der StringIndexer die Bezeichnung nicht finden, und es wird eine Ausnahme ausgelöst.

Gibt es eine Lösung für diesen Fall? oder wie können wir das vermeiden?

    
Rami 08.01.2016, 16:20
quelle

5 Antworten

8

Keine schöne Möglichkeit, es zu tun, fürchte ich. Entweder

  • Filtern Sie die Testbeispiele mit unbekannten Labels, bevor Sie StringIndexer anwenden.
  • oder passen Sie StringIndexer an die Vereinigung von Zug- und Testdatenframe an, so dass Sie sicher sind, dass alle Labels vorhanden sind
  • oder transformieren Sie den Testbeispielfall mit unbekanntem Label in ein bekanntes Label

Hier ist ein Beispielcode, um die obigen Operationen auszuführen:

%Vor%     
KrisP 08.01.2016, 21:20
quelle
11

Mit Spark 2.2 (veröffentlicht 7-2017) können Sie beim Erstellen des Indexers die Option .setHandleInvalid("keep") verwenden. Mit dieser Option fügt der Indexer neue Indizes hinzu, wenn er neue Labels sieht. Beachten Sie, dass Sie bei früheren Versionen auch die Option "skip" haben, wodurch der Indexer die Zeilen mit neuen Labels ignoriert (entfernt).

%Vor%     
queise 11.05.2017 14:03
quelle
10

Es gibt einen Weg in Spark 1.6.

Hier ist die Jira: Ссылка

Hier ist ein Beispiel:

%Vor%

Ich habe damit begonnen, bin aber zu KrisPs zweitem Punkt zurückgekehrt, um diesen speziellen Estimator an den vollständigen Datensatz anzupassen.

Sie benötigen dies später in der Pipeline, wenn Sie den IndexToString konvertieren.

Hier ist das modifizierte Beispiel:

%Vor%     
Chris Fregly 08.01.2016 21:56
quelle
1

In meinem Fall habe ich funke ALS auf einem großen Datensatz ausgeführt, und die Daten waren nicht auf allen Partitionen verfügbar, also musste ich die Daten entsprechend cachen () und es funktionierte wie ein Zauber

    
Suresh Gorakala 14.03.2017 17:37
quelle
1

Für mich ist es nicht wirklich machbar, die Zeilen vollständig zu ignorieren, indem man ein Argument ( Ссылка ) setzt um das Problem zu lösen.

Am Ende habe ich meinen eigenen CustomStringIndexer-Transformer erstellt, der einen neuen Wert für alle neuen Strings zuweist, die während des Trainings nicht gefunden wurden. Sie können dies auch tun, indem Sie die relevanten Teile des Funke-Feature-Codes ändern (entfernen Sie einfach die if-Bedingung, indem Sie explizit dafür suchen und dafür sorgen, dass sie die Länge des Arrays zurückgibt) und kompilieren Sie das jar.

Nicht wirklich eine einfache Lösung, aber es ist sicherlich eine Lösung.

Ich erinnere mich daran, einen Fehler in JIRA gesehen zu haben, um dies ebenfalls zu integrieren: Ссылка

Es ist festgelegt, dass es mit Spark 2.2 veröffentlicht wird. Warte nur, ich rate: S

    
quelle

Tags und Links