Scala 交叉验证评估器

Scala 交叉验证评估器,scala,apache-spark,apache-spark-mllib,apache-spark-ml,Scala,Apache Spark,Apache Spark Mllib,Apache Spark Ml,我希望对LDA算法应用交叉验证来确定主题数(K)。 我的疑问是关于评估者,因为我希望使用对数可能性。创建交叉验证时,我应该在.setEvaluator(??)上设置什么 // Define a simple LDA val lda = new LDA() .setMaxIter(10) .setFeaturesCol("features") // We use a ParamGridBuilder to construct a grid of parameters to search

我希望对LDA算法应用交叉验证来确定主题数(K)。 我的疑问是关于评估者,因为我希望使用对数可能性。创建交叉验证时,我应该在.setEvaluator(??)上设置什么

// Define a simple LDA
val lda = new LDA()
  .setMaxIter(10)
  .setFeaturesCol("features")

// We use a ParamGridBuilder to construct a grid of parameters to search over.
val range = 1 to 20
val paramGrid = new ParamGridBuilder()
    .addGrid(lda.k, range.toArray )
    .build()   

// Create a CrossValidator
val cv = new CrossValidator()
  .setEstimator(lda)
  .setEvaluator(????)
  .setEstimatorParamMaps(paramGrid)
  .setNumFolds(5)

当你有效地进行无监督学习时,交叉验证不会很容易应用。除非您标记了培训数据,否则由提供的接口不太可能合适。事实上,您正在尝试不同的k值,即LDA生成的主题数,这表明您可能没有此类标记的培训数据

如果您尝试重新设定目标,我认为没有合适的选项(至少在Spark-2.2中是这样)。如果您正在探索模型的不同维度(例如改变主题的数量,k),那么在具有不同维度的模型之间比较数据的对数可能性并不是微不足道的。例如,当您增加类的数量时,您会期望数据的可能性增加,但有过度拟合的风险。一种标准方法是使用类似的方法来惩罚更复杂的模型(例如,更大的k)。同样,我认为CrossValidator目前不支持这一点