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

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

我想知道使用apachespark2.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和MultiClassificationEvaluator都不能自己计算上述所有度量。因此,我们使用两个评估器。

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)

下降趋势
在对二元分类器求值时,使用multiclassionevaluator似乎既奇怪又矛盾
我必须使用两个不同的评估者来计算五个指标
MultiClassificationEvaluator只计算 weightedPrecision 以及 weightedRecall (这对于多类分类是可以的)。然而,这两个指标是否相等 precision 以及 recall 在二进制情况下?
2.选项
使用基于rdd的api和BinaryClassificationMetrics和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的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似乎很奇怪,因为apachespark声称有自己的api进行评估
如果数据集变得太大,使用numpy和sklearn甚至是不可能的。
总结一下我的问题:
使用apachespark2.4.5和pyspark评估二进制分类器时,建议使用上面的哪个选项(如果有)。
还有其他选择吗?我遗漏了什么重要的东西吗?
为什么我在使用选项1和使用选项2时得到不同的度量结果

ncgqoxb0

ncgqoxb01#

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

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

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

array([[3969025,  445123],
       [ 284283, 1663913]])

 Total 1 Class labels   1948196
 Total 0 Class labels   4414148

 Proportion Label 1 :0.306207272
 Proportion Label 0 :0.693792728

Spark ML will give metrics :
Accuracy : 0.8853557745384405
Weighted Precision : 0.8890015815237463
WeightedRecall :    0.8853557745384406
F-1 Score  :  0.8865644697253956

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

Accuracy:  0.8853557745384405
 Precision: 0.7889448070113549
 Recall:    0.8540788503826103
 AUC:   0.8540788503826103
 f1:    0.8540788503826103

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

相关问题