Spark K-fold 交叉验证

12

我有些困惑如何理解Spark的交叉验证。我看到的所有示例都是用于参数调整,但我认为它也可以进行常规的K折交叉验证,对吗?

我的目标是执行k-fold交叉验证,其中k = 5。我想获得每个结果的准确性,然后获得平均准确性。 在scikit-learn中,这是如何完成的,其中scores将为您提供每个折叠的结果,然后您可以使用scores.mean()

scores = cross_val_score(classifier, y, x, cv=5, scoring='accuracy')

这是我在Spark中的做法,paramGridBuilder为空,因为我不想输入任何参数。

val paramGrid = new ParamGridBuilder().build()
val evaluator = new MulticlassClassificationEvaluator()
  evaluator.setLabelCol("label")
  evaluator.setPredictionCol("prediction")
evaluator.setMetricName("precision")


val crossval = new CrossValidator()
crossval.setEstimator(classifier)
crossval.setEvaluator(evaluator) 
crossval.setEstimatorParamMaps(paramGrid)
crossval.setNumFolds(5)


val modelCV = crossval.fit(df4)
val chk = modelCV.avgMetrics

你所做的与scikit learn实现是相同的吗?为什么在进行交叉验证时要使用训练/测试数据?

如何交叉验证随机森林模型?

https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/ml/ModelSelectionViaCrossValidationExample.scala

1个回答

4
  1. 你正在做的看起来还不错。
  2. 基本上,是的,它的工作方式与sklearn的网格搜索CV相同。
    对于每个EstimatorParamMaps(一组参数),算法都会进行CV测试,因此avgMetrics是所有折叠的平均交叉验证准确性指标。如果使用空的ParamGridBuilder(没有参数搜索),那么就像拥有“常规”交叉验证,这将导致一个交叉验证的训练准确性。
  3. 每个CV迭代包括K-1个训练fold和1个测试fold,那么为什么大多数示例在进行交叉验证之前将数据分成训练/测试数据?因为CV内的测试folds用于参数网格搜索。这意味着需要额外的验证数据集来进行模型选择。因此,所谓的“测试数据集”是评估最终模型所需的。阅读更多这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接