如何使用apachespark2.4.5和pyspark(python)评估分类器

ej83mcc0  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(405)

我想知道使用apachespark2.4.5和pyspark(python)评估拟合的二进制分类模型的最佳方法是什么。我想考虑不同的指标,如准确性,精密度,召回,auc和f1分数。
假设如下:

  1. # pyspark.sql.dataframe.DataFrame in VectorAssembler format containing two columns: target and features
  2. # DataFrame we want to evaluate
  3. df
  4. # Fitted pyspark.ml.tuning.TrainValidationSplitModel (any arbitrary ml algorithm)
  5. model

1.选项
binaryclassificationevaluator和MultiClassificationEvaluator都不能自己计算上述所有度量。因此,我们使用两个评估器。

  1. from pyspark.ml.evaluation import BinaryClassificationEvaluator, MulticlassClassificationEvaluator
  2. # Create both evaluators
  3. evaluatorMulti = MulticlassClassificationEvaluator(labelCol="target", predictionCol="prediction")
  4. evaluator = BinaryClassificationEvaluator(labelCol="target", rawPredictionCol="prediction", metricName='areaUnderROC')
  5. # Make predicitons
  6. predictionAndTarget = model.transform(df).select("target", "prediction")
  7. # Get metrics
  8. acc = evaluatorMulti.evaluate(predictionAndTarget, {evaluatorMulti.metricName: "accuracy"})
  9. f1 = evaluatorMulti.evaluate(predictionAndTarget, {evaluatorMulti.metricName: "f1"})
  10. weightedPrecision = evaluatorMulti.evaluate(predictionAndTarget, {evaluatorMulti.metricName: "weightedPrecision"})
  11. weightedRecall = evaluatorMulti.evaluate(predictionAndTarget, {evaluatorMulti.metricName: "weightedRecall"})
  12. auc = evaluator.evaluate(predictionAndTarget)

下降趋势
在对二元分类器求值时,使用multiclassionevaluator似乎既奇怪又矛盾
我必须使用两个不同的评估者来计算五个指标
MultiClassificationEvaluator只计算 weightedPrecision 以及 weightedRecall (这对于多类分类是可以的)。然而,这两个指标是否相等 precision 以及 recall 在二进制情况下?
2.选项
使用基于rdd的api和BinaryClassificationMetrics和multiclassmetrics。同样,这两个度量不能单独计算上面提到的所有度量(至少在python中不是这样)。因此,我们使用两者。

  1. from pyspark.mllib.evaluation import BinaryClassificationMetrics, MulticlassMetrics
  2. # Make prediction
  3. predictionAndTarget = model.transform(df).select("target", "prediction")
  4. # Create both evaluators
  5. metrics_binary = BinaryClassificationMetrics(predictionAndTarget.rdd.map(tuple))
  6. metrics_multi = MulticlassMetrics(predictionAndTarget.rdd.map(tuple))
  7. acc = metrics_multi.accuracy
  8. f1 = metrics_multi.fMeasure(1.0)
  9. precision = metrics_multi.precision(1.0)
  10. recall = metrics_multi.recall(1.0)
  11. auc = metrics_binary.areaUnderROC

缺点
spark称,基于rdd的api现在处于维护模式,而基于Dataframe的api是主要的api
同样,我必须使用两个不同的度量来计算五个度量
同样,在评估二元分类器时,使用multiclassmetrics似乎是矛盾的
上行
在我的例子中(~1.000.000行)选项2似乎比选项1快
惊喜
在我的情况下,我会变得不同 f1 以及 areaUnderRoc 使用选项1时的值与使用选项2时的值。
方案3
使用numpy和sklearn

  1. import numpy as np
  2. from sklearn.metrics import accuracy_score, precision_score, recall_score, roc_auc_score, f1_score
  3. # Make predicitons
  4. predictionAndTarget = model.transform(df).select("target", "prediction")
  5. predictionAndTargetNumpy = np.array((predictionAndTarget.collect()))
  6. acc = accuracy_score(predictionAndTargetNumpy[:,0], predictionAndTargetNumpy[:,1])
  7. f1 = f1_score(predictionAndTargetNumpy[:,0], predictionAndTargetNumpy[:,1])
  8. precision = precision_score(predictionAndTargetNumpy[:,0], predictionAndTargetNumpy[:,1])
  9. recall = recall_score(predictionAndTargetNumpy[:,0], predictionAndTargetNumpy[:,1])
  10. auc = roc_auc_score(predictionAndTargetNumpy[:,0], predictionAndTargetNumpy[:,1])

下降趋势
使用sklearn和numpy似乎很奇怪,因为apachespark声称有自己的api进行评估
如果数据集变得太大,使用numpy和sklearn甚至是不可能的。
总结一下我的问题:
使用apachespark2.4.5和pyspark评估二进制分类器时,建议使用上面的哪个选项(如果有)。
还有其他选择吗?我遗漏了什么重要的东西吗?
为什么我在使用选项1和使用选项2时得到不同的度量结果

ncgqoxb0

ncgqoxb01#

现在不确定是否相关,但可以回答您的问题3,因此可能是问题1-
spark ml仅作为MultiClassificationEvaluator模块的一部分提供加权精度和加权召回度量。如果你想对整体精度度量有一个等价的解释,特别是在二元分类相当于scikit world的情况下,那么最好计算混淆矩阵并使用精度&召回公式进行评估
spark ml使用的加权精度是使用两个类的精度计算的,然后使用测试集中每个类标签的权重相加,即。

  1. Prec (Label 1) = TP/(TP+FP)
  2. Prec (Label 0) = TN/(TN+FN)
  3. Weight of Label 1 in test set WL1 = L1/(L1+L2)
  4. Weight of Label 0 in test set WL2 = L2/(L1+L2)
  5. Weighted precision = (PrecL1 * WL1) + (PrecL0 * WL2)

如果数据集中存在轻微的类不平衡,加权精度和召回率将超过整体精度和召回率,因此基于sklearn和基于spark-ml的度量将有所不同。
举例说明,类不平衡数据集的混淆矩阵如下:

  1. array([[3969025, 445123],
  2. [ 284283, 1663913]])
  3. Total 1 Class labels 1948196
  4. Total 0 Class labels 4414148
  5. Proportion Label 1 :0.306207272
  6. Proportion Label 0 :0.693792728
  7. Spark ML will give metrics :
  8. Accuracy : 0.8853557745384405
  9. Weighted Precision : 0.8890015815237463
  10. WeightedRecall : 0.8853557745384406
  11. F-1 Score : 0.8865644697253956

而实际的总体度量计算给出(scikit等效值):

  1. Accuracy: 0.8853557745384405
  2. Precision: 0.7889448070113549
  3. Recall: 0.8540788503826103
  4. AUC: 0.8540788503826103
  5. f1: 0.8540788503826103

因此,spark-ml加权版本膨胀了我们观察到的总体度量计算,特别是对于二进制分类

展开查看全部

相关问题