SPARK Mllib: Logistische Regression für mehrere Klassen, wie erhält man die Wahrscheinlichkeiten aller Klassen und nicht die oberste?


7

Ich benutze LogisticRegressionWithLBFGS, um einen Klassifikator für mehrere Klassen zu trainieren.

Gibt es eine Möglichkeit, die Wahrscheinlichkeit aller Klassen (nicht nur der Spitzenkandidatenklasse) zu ermitteln, wenn ich das Modell an neuen unsichtbaren Stichproben teste?

PS Ich bin nicht unbedingt verpflichtet, den LBFGS-Klassifikator zu verwenden, möchte aber die logistische Regression in meinem Problem verwenden. Wenn es also eine Lösung gibt, bei der ein anderer LR-Klassifizierertyp verwendet wird, würde ich mich dafür entscheiden.

Antworten:


4

Ich arbeite am Random Forest Classifier und dieser Klassifikator hat ein Wahrscheinlichkeitsattribut in der Vorhersage. Wenn Sie also die Zusammenfassung von predictions = model.transform(testData)wie print(predictions)in PySpark erhalten, erhalten Sie die Wahrscheinlichkeit für jedes Label. Sie können den folgenden Code und die Ausgabe des Codes überprüfen:

from pyspark.sql import DataFrame
from pyspark import SparkContext, SQLContext
from pyspark.ml import Pipeline
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.feature import StringIndexer, VectorIndexer
from pyspark.ml.evaluation import MulticlassClassificationEvaluator

# Split the data into training and test sets (30% held out for testing)
(trainingData, testData) = data.randomSplit([0.7, 0.3])

# Train a Random Forest model.
rf = RandomForestClassifier(labelCol="label", featuresCol="features", numTrees=12,  maxDepth=10)

# Chain RF in a Pipeline
pipeline = Pipeline(stages=[rf])

# Train model.
model = pipeline.fit(trainingData)

# Make predictions.
predictions = model.transform(testData)

Jetzt beginnt Ihre Arbeit von hier aus. Versuchen Sie, Vorhersagen und Werte von Vorhersagen zu drucken

print(predictions)

Ausgabe:

DataFrame[label: double, features: vector, indexed: double, rawPrediction: vector, probability: vector, prediction: double]

Im DataFrame haben Sie also die Wahrscheinlichkeit, die die Wahrscheinlichkeit jedes indexierten Labels ist. Außerdem habe ich sie wie folgt überprüft:

print predictions.show(3)

Ausgabe:

+-----+--------------------+-------+--------------------+--------------------+----------+
|label|            features|indexed|       rawPrediction|         probability|prediction|
+-----+--------------------+-------+--------------------+--------------------+----------+
|  5.0|(2000,[141,260,50...|    0.0|[34.8672584923246...|[0.69734516984649...|       0.0|
|  5.0|(2000,[109,126,18...|    0.0|[34.6231572522266...|[0.69246314504453...|       0.0|
|  5.0|(2000,[185,306,34...|    0.0|[34.5016453103805...|[0.69003290620761...|       0.0|
+-----+--------------------+-------+--------------------+--------------------+----------+
only showing top 3 rows

Nur für Wahrscheinlichkeitsspalte:

print predictions.select('probability').take(2)

Ausgabe:

[Row(probability=DenseVector([0.6973, 0.1889, 0.0532, 0.0448, 0.0157])), Row(probability=DenseVector([0.6925, 0.1825, 0.0579, 0.0497, 0.0174]))]

In meinem Fall habe ich 5 indexedLabels und so die Wahrscheinlichkeit Vektorlänge ist 5 , Hoffnung dies wird Ihnen helfen, das bekommen Wahrscheinlichkeit jeder Etiketten in Ihr Problem.

PS: Sie werden wahrscheinlich die Wahrscheinlichkeit , in erhalten Decision Tree , logistischer Regression . Versuchen Sie einfach, die Zusammenfassung von zu erhalten model.transform(testData).


Für die Referenz können Sie die Entscheidungsbaumreferenz hier
krishna Prasad

1

Um alle Wahrscheinlichkeiten anstelle aller Klassen anstelle nur der beschrifteten Klasse zu erhalten, gibt es in Spark MLlib oder ML bisher keine explizite Methode (Spark 2.0). Sie können die Logistic Regression-Klasse jedoch aus dem MLlib-Quellcode erweitern, um diese Wahrscheinlichkeiten abzurufen.

Ein Beispielcode-Snippet finden Sie in dieser Antwort .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.