Spark K-fold交叉验证

oth*_*r15 11 classification machine-learning cross-validation apache-spark-mllib

我在理解Spark的交叉验证方面遇到了一些麻烦.我见过的任何一个例子都用它来进行参数调整,但我认为它只会进行常规的K折交叉验证吗?

我想要做的是执行k折交叉验证,其中k = 5.我想获得每个结果的准确性,然后获得平均准确度.在scikit中学习这是怎么做的,分数会给你每个折叠的结果,然后你可以使用scores.mean()

scores = cross_val_score(classifier, y, x, cv=5, scoring='accuracy')
Run Code Online (Sandbox Code Playgroud)

这就是我在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
Run Code Online (Sandbox Code Playgroud)

这和scikit学习实现的做法是一样的吗?为什么这些示例在进行交叉验证时会使用培训/测试数据?

如何交叉验证RandomForest模型?

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

Ser*_*ity 4

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