Ich versuche, die Klassenwahrscheinlichkeiten eines zufälligen Waldobjekts zu extrahieren, das ich mit PySpark trainiert habe. Ich sehe jedoch nirgendwo in der Dokumentation ein Beispiel dafür und auch keine Methode von RandomForestModel
.
Wie kann ich Klassenwahrscheinlichkeiten aus einem RandomForestModel
Klassifikator in PySpark extrahieren?
Hier ist der Beispielcode aus der Dokumentation, der nur die letzte Klasse (nicht die Wahrscheinlichkeit) enthält:
%Vor% Ich sehe keine model.predict_proba()
-Methode - was soll ich tun?
Soweit ich das beurteilen kann, wird dies in der aktuellen Version (1.2.1) nicht unterstützt. Der Python-Wrapper über den nativen Scala-Code (tree.py) definiert nur "vorhergesagte" Funktionen, die wiederum die entsprechenden Scala-Gegenstücke (treeEnsembleModels.scala) aufrufen. Letztere treffen Entscheidungen, indem sie unter binären Entscheidungen abstimmen. Eine viel sauberere Lösung wäre gewesen, eine probabilistische Vorhersage zu liefern, die beliebig für die ROC-Berechnung wie in sklearn beliebig schwellenfrei oder für die ROC-Berechnung verwendet werden kann. Diese Funktion sollte für zukünftige Versionen hinzugefügt werden!
Als Workaround habe ich predict_proba als reine Python-Funktion implementiert (siehe Beispiel unten). Es ist weder elegant noch sehr effizient, da es eine Schleife über die Menge der einzelnen Entscheidungsbäume in einem Wald führt. Der Trick - oder eher ein schmutziger Hack - besteht darin, auf das Array von Java-Entscheidungsbaummodellen zuzugreifen und diese in Python-Gegenstücke zu werfen. Danach können Sie die Vorhersagen des einzelnen Modells über den gesamten Datensatz berechnen und ihre Summe in einer RDD mit 'zip' akkumulieren. Das Teilen nach der Anzahl der Bäume bringt das gewünschte Ergebnis. Bei großen Datenmengen sollte eine Schleife über eine kleine Anzahl von Entscheidungsbäumen in einem Master-Knoten akzeptabel sein.
Der folgende Code ist ziemlich schwierig, da Python nur schwer in Spark (in Java) integriert werden kann. Man sollte sehr vorsichtig sein, keine komplexen Daten an Arbeiterknoten zu senden, was zu Abstürzen aufgrund von Serialisierungsproblemen führt. Kein Code, der sich auf den Spark-Kontext bezieht, kann auf einem Worker-Knoten ausgeführt werden. Außerdem kann kein Code, der sich auf einen Java-Code bezieht, serialisiert werden. Zum Beispiel könnte es verlockend sein, len (trees) anstelle von ntrees im folgenden Code zu verwenden - bang! Das Schreiben eines solchen Wrappers in Java / Scala kann viel eleganter sein, zum Beispiel indem eine Schleife über Entscheidungsbäume auf Arbeiterknoten ausgeführt wird und somit die Kommunikationskosten reduziert werden.
Die folgende Testfunktion zeigt, dass die Vorhersagefunktion einen identischen Testfehler liefert, wie er in den ursprünglichen Beispielen vorhergesagt wurde.
%Vor%Alles in allem war das eine schöne Übung, um Spark zu lernen!
Dies ist jetzt verfügbar.
Spark ML bietet:
predictionCol
, das das vorhergesagte Label enthält
probabilityCol
, das einen Vektor mit den Wahrscheinlichkeiten für jedes Label enthält , nach dem Sie gesucht haben ! Weitere Informationen finden Sie in der Spark-Dokumentation: Ссылка
Es wird jedoch mit Spark 1.5.0 und der neuen Spark-ML-API verfügbar sein.
Wahrscheinlich hätten die Leute mit diesem Beitrag weitergemacht, aber ich wurde heute von demselben Problem getroffen, als ich versuchte, die Genauigkeit für den Mehrklassenklassifikator gegen einen Trainingssatz zu berechnen. Also dachte ich, ich teile meine Erfahrung, wenn jemand mit mllib versucht ...
Wahrscheinlichkeit kann ziemlich einfach wie folgt berechnet werden: -
%Vor%Tags und Links apache-spark random-forest pyspark apache-spark-mllib