Мне интересно, как лучше всего оценить подходящую модель двоичной классификации, используя 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 может быть даже невозможным, если набор данных становится слишком большим.
Подводя итог моим вопросам:
- Какой вариант выше (если есть) рекомендуется для оценки двоичного классификатора с использованием Apache Spark 2.4.5 и PySpark.
- Есть ли другие варианты? Я упускаю что-то важное?
- Почему я получаю разные результаты для метрик при использовании варианта 1 по сравнению с вариантом 2