我希望将交叉验证应用于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)
答案 0 :(得分:2)
当您有效地进行无监督学习时,交叉验证不会直接应用。除非您标记了训练数据,否则CrossValidator提供的接口可能不合适。您尝试使用不同的k值(LDA产生的主题数量)这一事实表明您可能没有这种标记的训练数据。
如果您尝试重新定位CrossValidator,我认为没有任何合适的Evaluators可用(至少从Spark-2.2开始)。如果您正在探索不同的模型维度(例如改变主题的数量,k),那么数据的对数似然性在具有不同维度的模型之间进行比较并不容易。例如,当您增加类的数量时,您会预期数据增加的可能性,但存在过度拟合的风险。一种标准方法是使用诸如Akaike Information criterion之类的东西来惩罚具有更多复杂性的模型(例如,更大的k)。同样,我认为CrossValidator目前不支持。