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?
Keine schöne Möglichkeit, es zu tun, fürchte ich. Entweder
StringIndexer
anwenden.
StringIndexer
an die Vereinigung von Zug- und Testdatenframe an, so dass Sie sicher sind, dass alle Labels vorhanden sind Hier ist ein Beispielcode, um die obigen Operationen auszuführen:
%Vor% 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).
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%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
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
Tags und Links apache-spark apache-spark-ml