Как оценить классификатор с Apache Spark 2.4.5 и PySpark (Python) - PullRequest
0 голосов
/ 20 марта 2020

Мне интересно, как лучше всего оценить подходящую модель двоичной классификации, используя Apache Spark 2.4.5 и PySpark (Python). Я хочу рассмотреть различные метрики, такие как точность, точность, отзыв, au c и оценка f1.

Предположим, что задано следующее:

# pyspark.sql.dataframe.DataFrame in VectorAssembler format containing two columns: target and features
# DataFrame we want to evaluate
df

# Fitted pyspark.ml.tuning.TrainValidationSplitModel (any arbitrary ml algorithm)
model

1 , Опция

Ни BinaryClassificationEvaluator , ни MulticlassClassificationEvaluator не может самостоятельно рассчитать все упомянутые выше показатели. Таким образом, мы используем оба оценщика.

from pyspark.ml.evaluation import BinaryClassificationEvaluator, MulticlassClassificationEvaluator

# Create both evaluators
evaluatorMulti = MulticlassClassificationEvaluator(labelCol="target", predictionCol="prediction")
evaluator = BinaryClassificationEvaluator(labelCol="target", rawPredictionCol="prediction", metricName='areaUnderROC')

# Make predicitons
predictionAndTarget = model.transform(df).select("target", "prediction")

# Get metrics
acc = evaluatorMulti.evaluate(predictionAndTarget, {evaluatorMulti.metricName: "accuracy"})
f1 = evaluatorMulti.evaluate(predictionAndTarget, {evaluatorMulti.metricName: "f1"})
weightedPrecision = evaluatorMulti.evaluate(predictionAndTarget, {evaluatorMulti.metricName: "weightedPrecision"})
weightedRecall = evaluatorMulti.evaluate(predictionAndTarget, {evaluatorMulti.metricName: "weightedRecall"})
auc = evaluator.evaluate(predictionAndTarget)

Недостатки

  • Кажется странным и противоречивым использовать MulticlassClassificationEvaluator при оценке двоичного классификатора
  • Мне нужно использовать два разных оценщика для вычисления пяти метрик
  • MulticlassClassificationEvaluator рассчитывает только weightedPrecision и weightedRecall (что нормально для классификации нескольких классов). Однако равны ли эти две метрики precision и recall в двоичном случае?

2. Опция

Использование API на основе RDD с BinaryClassificatinMetrics и MulticlassMetrics . Опять же, обе метрики не могут самостоятельно рассчитать все метрики, упомянутые выше (по крайней мере, не в python ..). Таким образом, мы используем оба.

from pyspark.mllib.evaluation import BinaryClassificationMetrics, MulticlassMetrics

# Make prediction
predictionAndTarget = model.transform(df).select("target", "prediction")

# Create both evaluators
metrics_binary = BinaryClassificationMetrics(predictionAndTarget.rdd.map(tuple))
metrics_multi = MulticlassMetrics(predictionAndTarget.rdd.map(tuple))

acc = metrics_multi.accuracy
f1 = metrics_multi.fMeasure(1.0)
precision = metrics_multi.precision(1.0)
recall = metrics_multi.recall(1.0)
auc = metrics_binary.areaUnderROC

Недостатки

  • Согласно Spark, API на основе RDD сейчас находится в режиме обслуживания, а DataFrame- основанный на API первичный API
  • Опять же, мне нужно использовать две разные метрики для вычисления пяти метрик
  • Опять же, использование MulticlassMetrics кажется противоречивым при оценке двоичного классификатора

Вверх

  • В моем случае (~ 1.000.000 строк) вариант 2, кажется, быстрее, чем вариант 1

Сюрприз

  • В моем случае я получаю различные значения f1 и areaUnderRoc при использовании варианта 1 по сравнению с вариантом 2.

вариант 3

Использование numpy и sklearn

import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score, f1_score

# Make predicitons
predictionAndTarget = model.transform(df).select("target", "prediction")

predictionAndTargetNumpy = np.array((predictionAndTarget.collect()))

acc = accuracy_score(predictionAndTargetNumpy[:,0], predictionAndTargetNumpy[:,1])
f1 = f1_score(predictionAndTargetNumpy[:,0], predictionAndTargetNumpy[:,1])
precision = precision_score(predictionAndTargetNumpy[:,0], predictionAndTargetNumpy[:,1])
recall = recall_score(predictionAndTargetNumpy[:,0], predictionAndTargetNumpy[:,1])
auc = roc_auc_score(predictionAndTargetNumpy[:,0], predictionAndTargetNumpy[:,1])

Недостаток

  • Использование sklearn и numpy похоже странно, что Apache Spark утверждает, что имеет собственный API для оценки
  • Использование numpy и sklearn может быть даже невозможным, если набор данных становится слишком большим.

Подводя итог моим вопросам:

  1. Какой вариант выше (если есть) рекомендуется для оценки двоичного классификатора с использованием Apache Spark 2.4.5 и PySpark.
  2. Есть ли другие варианты? Я упускаю что-то важное?
  3. Почему я получаю разные результаты для метрик при использовании варианта 1 по сравнению с вариантом 2
...