2017-05-23 86 views
3

我希望將交叉驗證應用於LDA算法以確定主題數量(K)。 我的疑問是關於評估者,因爲我希望使用對數似然。創建交叉驗證時,我在.setEvaluator(????)上設置了什麼?LDA交叉驗證評估器

// 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) 

回答

1

交叉驗證是不會直截了當,當你切實做好無監督學習應用。除非您標記了培訓數據,否則CrossValidator提供的接口不太合適。事實上,你嘗試不同的k值,LDA產生的主題數量,表明你可能沒有這種標記的訓練數據。

如果您嘗試重新使用CrossValidator,我不認爲有任何合適的Evaluators可用(至少Spark-2.2版本)。如果您正在探索模型的不同維度(例如改變主題數量,k),那麼數據的對數似然性並不是微不足道的,以比較具有不同維度的模型。例如,隨着您增加課程數量,您會預期數據可能會增加,但存在過度擬合的風險。一種標準的方法是使用類似Akaike Information criterion的東西來處罰具有更多複雜性的模型(例如更大的k)。同樣,我認爲CrossValidator目前不支持該功能。