我希望将交叉验证应用于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)发布于 2018-02-10 03:54:25
当你有效地进行无监督学习时,交叉验证并不是直接适用的。除非您标记了训练数据,否则CrossValidator提供的接口不太可能是合适的。事实上,您正在尝试不同的k值,即LDA产生的主题数量,这表明您可能没有这种标记的训练数据。
如果您尝试重新调整CrossValidator的用途,我认为没有任何合适的Evaluators可用(至少在Spark-2.2版本中)。如果你正在探索模型的不同维度(例如改变主题的数量,k),那么在具有不同维度的模型之间进行比较时,数据的对数似然并不是微不足道的。例如,当您增加类的数量时,您预计数据的可能性会增加,但存在过度拟合的风险。一种标准的方法是使用像Akaike Information criterion这样的东西来惩罚具有更多复杂性(例如更大的k)的模型。再说一次,我认为CrossValidator目前不支持这一点。
https://stackoverflow.com/questions/44130622
复制相似问题