如何使用 CrossValidator 获得 Precision/Recall 以使用 Spark 训练 NaiveBayes 模型

How to get Precision/Recall using CrossValidator for training NaiveBayes Model using Spark

假设我有这样的管道:

val tokenizer = new Tokenizer().setInputCol("tweet").setOutputCol("words")
val hashingTF = new HashingTF().setNumFeatures(1000).setInputCol("words").setOutputCol("features")
val idf = new IDF().setInputCol("features").setOutputCol("idffeatures")
val nb = new org.apache.spark.ml.classification.NaiveBayes()
val pipeline = new Pipeline().setStages(Array(tokenizer, hashingTF, idf, nb))
val paramGrid = new ParamGridBuilder().addGrid(hashingTF.numFeatures, Array(10, 100, 1000)).addGrid(nb.smoothing, Array(0.01, 0.1, 1)).build()
val cv = new CrossValidator().setEstimator(pipeline).setEvaluator(new BinaryClassificationEvaluator()).setEstimatorParamMaps(paramGrid).setNumFolds(10)
val cvModel = cv.fit(df)

如您所见,我使用 MultiClassClassificationEvaluator 定义了一个 CrossValidator。我已经看到很多例子在测试过程中获得像 Precision/Recall 这样的指标,但是当你使用不同的数据集进行测试时,这些指标是得到的(例如参见 [​​=12=])。

根据我的理解,CrossValidator 将创建折叠,其中一个折叠将用于测试目的,然后 CrossValidator 将选择最佳模型。我的问题是,是否可以在训练过程中获得 Precision/Recall 指标?

好吧,实际存储的唯一指标是您在创建 Evaluator 实例时定义的指标。对于 BinaryClassificationEvaluator 这可以采用以下两个值之一:

  • areaUnderROC
  • areaUnderPR

前者为默认值,可通过setMetricName方式设置。

这些值是在训练过程中收集的,可以使用 CrossValidatorModel.avgMetrics 访问。值的顺序对应于 EstimatorParamMaps (CrossValidatorModel.getEstimatorParamMaps).

的顺序