SPARK Mllib: Regressão logística multiclasse, como obter as probabilidades de todas as classes e não da primeira?

7

Estou usando LogisticRegressionWithLBFGSpara treinar um classificador de várias classes.

Existe uma maneira de obter a probabilidade de todas as classes (não apenas a principal classe candidata) quando eu testar o modelo em novas amostras não vistas?

PS: Não sou necessariamente obrigado a usar o classificador LBFGS, mas gostaria de usar a regressão logística no meu problema. Portanto, se houver uma solução usando outro tipo de classificador LR, eu aceitaria.

Rami
fonte

Respostas:

4

Eu estou trabalhando no Random Forest Classifier e este classificador tem atributo de probabilidade na previsão, ou seja, se você obtiver o resumo de predictions = model.transform(testData)como print(predictions)no PySpark , obterá a probabilidade de cada rótulo. Você pode verificar o código abaixo e a saída do código:

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)

Agora seu trabalho começa a partir daqui. tente imprimir previsões e valores de previsões

print(predictions)

Resultado:

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

Portanto, no DataFrame você tem a probabilidade que é a probabilidade de cada indexedLabel, além disso, verifiquei como:

print predictions.show(3)

Resultado:

+-----+--------------------+-------+--------------------+--------------------+----------+
|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

Apenas para coluna de probabilidade:

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

Resultado:

[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]))]

No meu caso, tenho 5 indexedLabels e, portanto, o comprimento do vetor de probabilidade é 5. Espero que isso ajude você a obter a probabilidade de cada rótulo no seu problema.

PS: Você provavelmente obterá a probabilidade na Árvore de Decisão , regressão logística . Apenas tente obter o resumo de model.transform(testData).

Krishna Prasad
fonte
Para a referência que você pode verificar a referência de árvore de decisão aqui
Krishna Prasad
1

Para obter todas as probabilidades, em vez de todas as classes, e não apenas a classe rotulada, não há método explícito até agora (Spark 2.0) no Spark MLlib ou ML. Mas você pode estender a classe Regressão Logística a partir do código-fonte MLlib para obter essas probabilidades.

Um trecho de código de exemplo pode ser encontrado nesta resposta .

Santoshi M
fonte