2

假设我有这样的管道:

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 之类的指标,但是当您使用不同的数据集进行测试时会获得这些指标(例如,请参见本文档)。

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

4

1 回答 1

3

好吧,实际存储的唯一指标是您在创建Evaluator. 对于BinaryClassificationEvaluatorthis 可以采用以下两个值之一:

  • areaUnderROC
  • areaUnderPR

前者为默认值,可使用setMetricName方法设置。

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

于 2016-06-13T16:58:13.177 回答