我想知道使用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时得到不同的度量结果
1条答案
按热度按时间ncgqoxb01#
现在不确定是否相关,但可以回答您的问题3,因此可能是问题1-
spark ml仅作为MultiClassificationEvaluator模块的一部分提供加权精度和加权召回度量。如果你想对整体精度度量有一个等价的解释,特别是在二元分类相当于scikit world的情况下,那么最好计算混淆矩阵并使用精度&召回公式进行评估
spark ml使用的加权精度是使用两个类的精度计算的,然后使用测试集中每个类标签的权重相加,即。
如果数据集中存在轻微的类不平衡,加权精度和召回率将超过整体精度和召回率,因此基于sklearn和基于spark-ml的度量将有所不同。
举例说明,类不平衡数据集的混淆矩阵如下:
而实际的总体度量计算给出(scikit等效值):
因此,spark-ml加权版本膨胀了我们观察到的总体度量计算,特别是对于二进制分类