【发布时间】:2020-07-01 11:33:34
【问题描述】:
我想知道使用 Apache Spark 2.4.5 和 PySpark (Python) 评估拟合二进制分类模型的最佳方法是什么。我想考虑不同的指标,例如准确度、精确度、召回率、auc 和 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。选项
将基于 RDD 的 API 与 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 的说法,基于 RDD 的 API 现在处于维护模式,DataFrame-based API is primary API
- 同样,我必须使用两个不同的指标来计算五个指标
- 同样,在评估二元分类器时,使用 MulticlassMetrics 似乎是矛盾的
上涨
- 就我而言(~1.000.000 行)选项 2 似乎比选项 1 更快
惊喜
- 就我而言,使用选项 1 和使用选项 2 时,
f1和areaUnderRoc值不同。
选项 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 时得到不同的指标结果
【问题讨论】:
-
我尝试了你的第一种方法,它只适用于准确性。
-
尝试使用 Spark 的
MulticlassClassificationEvaluator,我只能在上面秒 OP 的 cmets。令人困惑的是,并非所有指标都由一个评估者类提供。在 Spark 中也有类似 sklearn 的分类报告之类的东西会很棒。
标签: python apache-spark pyspark apache-spark-mllib evaluation