2016-10-24 51 views
0

我正在嘗試使用Scala中的GridSearch API for H2O。我發現this文檔說明了在R和Python中要做什麼,但是Java文檔在實際獲得最佳模型之前停止。有人能告訴我最後幾行嗎? IE給出Grid<MP>我怎麼能得到最好的超參數組合或最好的模型?H2O中的GridSearch API

編輯

這裏是我的代碼看起來到目前爲止(它在斯卡拉但很明顯,我打電話到內H2O Java代碼)。

private[this] def hyperopt(hyperParams: Map[String, Array[Object]]): M = { 
    val search = GridSearch.startGridSearch(
    null, 
    params, 
    hyperParams.asJava, 
    new SimpleParametersBuilderFactory[P], 
    new HyperSpaceSearchCriteria.RandomDiscreteValueSearchCriteria) 
    val grid = search.get().asInstanceOf[Grid[P]] 
    val scoringInfo = grid.getScoringInfos.last // This is best scoringInfo cause it gets sorted along the way 
    //val bestParams = scoringInfo.??? 
    //grid.getModel(bestParams).asInstanceOf[M] 
} 

關鍵問題是我不知道如何寫最後2行。

所以一些挖我來到了這個解決方案,我不喜歡,但之後沒有工作

private[this] def hyperopt(hyperParams: (Map[String, Array[Object]], String)): M = { 
    val search = GridSearch.startGridSearch(
    null, 
    params, 
    hyperParams._1.asJava, 
    new SimpleParametersBuilderFactory[P], 
    new HyperSpaceSearchCriteria.RandomDiscreteValueSearchCriteria) 
    val grid = search.get() 
    val summary = grid.createSummaryTable(grid.getModelKeys, hyperParams._2, true) 

    info("Hyper parameter results") 
    info(summary.toString) 

    // TODO Fix this hack. I don't know a better way to do this now. 
    val bestModelId = summary.get(0, 1) 
    grid.getModels.find(m => m._key.toString == bestModelId).get.asInstanceOf[M] 
} 

回答

1

如果沒記錯,格之格=(網格)gs.get()給你一個完整的網格。現在,什麼構成最佳模式?如果你說這是最高的ROC,那麼按降序「auc」對列表進行排序,然後選擇第一個元素 - 就像在this post中一樣。

+0

這正是我的想法。我深入研究了ScoringInfo代碼,發現得分結果確實是排序的,但是我沒有辦法將ScoringInfo與'Model'或params關聯起來,這是我缺少的關鍵元素。您的文章看起來像是R中的答案,但我希望能夠在Java中找到它。 – Jon

+0

該模型將ScoringInfo公開爲公共屬性:https://github.com/h2oai/h2o-3/blob/master/h2o-core/src/main/java/hex/Model.java#L619。 –

+0

這是正確的,但我不希望使用'grid.getModels()'遍歷每個模型,並將最好的'ScoringInfo'與每個模型的得分信息進行比較,這看起來很詭異。看起來很奇怪的是,'Grid'對象沒有公開一個叫做'getBestParams'的方法,這正是我最初尋找的。我用更多的信息更新了我的問題。 – Jon