h2o蒸汽预测服务结果未被识别为二​​项式估算的二元预测

时间:2017-09-25 19:26:27

标签: h2o

我在h2o flow创建的DRF模型应该是二项式,而flow表示它是二项式

enter image description here

但我遇到了一个问题,将其导入h2o steam并将其部署到预测服务中,该模型似乎不会被识别为二​​项式。我认为这是真的的原因如下所示。这是一个问题的原因是因为我认为这是导致预测服务不显示预测的置信度值的原因(这种推理也在下面显示)。

在预测服务中,我可以获得预测标签,但索引标签概率表中没有填充任何值。

enter image description here

使用浏览器检查器(谷歌浏览器),预测输出似乎取决于名为predict.js的文件。

enter image description here

为了获得预测服务中显示的预测概率值,似乎this代码块需要运行才能到达this行。在预测服务页面上的检查器中打开predict.js文件,并在一些顶行添加一些调试输出语句(在下面的代码中用DEBUG / ENDDEBUG注释表示),我的showResults()函数然后看起来像:

function showResult(div, status, data) {
    ////////// DEBUG
    console.log("showResult entered")
    ////////// ENDDEBUG

    var result = '<legend>Model Predictions</legend>'

    //////////  DEBUG
    console.log(data)
    console.log(data.classProbabilities)
    console.log("**showResult: isBinPred=" + isBinaryPrediction)
    ////////// ENDDEBUG

    if (data.classProbabilities) {
      ////////// DEBUG
      console.log("**showResult: data.classProbabilities not null")
      ////////// ENDDEBUG

      // binomial and multinomial
      var label = data.label;
      var index = data.labelIndex;
      var probs = data.classProbabilities;
      var prob = probs[index];

      result += '<p>Predicting <span class="labelHighlight">' + label + '</span>';
      if (probs.length == 2) {
        result += ' based on max F1 threshold </p>';
      }
      result += ' </p>';
      result += '<table class="table" id="modelPredictions"> \
                  <thead> \
                    <tr> \
                      <th>Index</th> \
                      <th>Labels</th> \
                      <th>Probability</th> \
                    </tr> \
                   </thead> \
                   <tbody> \
                  ';

      if (isBinaryPrediction) {
        var labelProbabilitiesMapping = [];
        outputDomain.map(function(label, i) {
          var labelProbMap = {};
          labelProbMap.label = outputDomain[i];
          labelProbMap.probability = probs[i];
          if (i === index) {
            labelProbMap.predicted = true;
          }
          labelProbMap.originalIndex = i;
          labelProbabilitiesMapping.push(labelProbMap);
        });
        labelProbabilitiesMapping.sort(function(a, b) {
          return b.probability - a.probability;
        });
        var limit = labelProbabilitiesMapping.length > 5 ? 5 : labelProbabilitiesMapping.length;
        for (var i = 0; i < limit; i++) {
          if (labelProbabilitiesMapping[i].predicted === true) {
            result += '<tr class="rowHighlight">'
          } else {
            result += '<tr>'
          }
          result += '<td>' + labelProbabilitiesMapping[i].originalIndex + '</td><td>' + labelProbabilitiesMapping[i].label + '</td> <td>' + labelProbabilitiesMapping[i].probability.toFixed(4) + '</td></tr>';
        }
      } else {
        for (var label_i in outputDomain) {
          if (parseInt(label_i) === index ){
            result += '<tr class="rowHighlight">'
          } else {
            result += '<tr>'
          }
          result += '<td>' + label_i + '</td><td>' + outputDomain[label_i] + '</td> <td>' + probs[label_i].toFixed(4) + '</td></tr>';
        }
      }

      result += '</tbody></table>';
    }
    else if ("cluster" in data) {
      // clustering result
      result = "Cluster <b>" + data["cluster"] + "</b>";
    }
    else if ("value" in data) {
      // regression result
      result = "Value <b>" + data["value"] + "</b>";
    }
    else if ("dimensions" in data) {
      // dimensionality reduction result
      result = "Dimensions <b>" + data["dimensions"] + "</b>";
    }
    else {
      result = "Can't parse result: " + data;
    }

    div.innerHTML = result;
  }

并单击预测服务中的“预测”现在生成控制台输出:

enter image description here

如果我要添加一个语句isBinaryPrediction = true来强制将全局变量设置为true(大约here)并再次运行预测,控制台会显示:

enter image description here

表示variable outputDomain未定义。变量outputDomain似乎在function showModel中设置。此功能似乎在页面加载时运行,因此我无法在chrome检查器中对其进行编辑以查看变量值是什么。如果有人知道如何解决这个问题(获得预测概率值以显示h2o steam的二项式模型的预测服务),那将是一个很大的帮助。谢谢:))

2 个答案:

答案 0 :(得分:0)

UI还没有更新来处理MOJO,似乎有一个bug。欢迎您提供:https://github.com/h2oai/steam/blob/master/CONTRIBUTING.md

答案 1 :(得分:0)

我的解决方案非常hacky,但适用于我的特定案例(即我在h2o steam中有 DRF 二项式模型不被认为是二元模型(我知道这个在这个答案中显示))。

<强>解决方案: 在我的原始帖子中,有一个outputDomain变量undefined。查看源代码,该变量设置为(假设是什么)模型的输出响应的域标签here。我将此行从outputDomain = domains[i1];更改为outputDomain = domains[i1-1];。单击预测按钮后的输出如下所示:

enter image description here

h2o steam的官方Linux下载,您可以通过打开predict.js,然后保存更改并重新启动jetty服务器steam-1.1.6-linux-amd64/var/master/assets/ROOT.war/extra/predict.js来访问预测服务$ java -Xmx6g -jar var/master/assets/jetty-runner.jar var/master/assets/ROOT.war文件。 / p>

<强>原因?: 我怀疑这个问题与我的模型中的predict.js中的全局变量isBinaryPrediction似乎保持false这一事实有关。 isBinaryPrediction为假的原因似乎是因为在函数showInputParameters()中,data.m没有字段_problem_type。在检查器控制台中使用console.dir(data, {depth: null})查看data.m的字段,我发现预期的字段data.m._problem_type不存在,因此返回undefined,因此isBinaryPrediction永远不会设置为true (here)。

enter image description here

为什么会这样,我不知道。到目前为止我只在蒸汽中使用过DRF模型,这可能是该模型的问题,但我还没有测试过。如果有人知道为什么会这样,请告诉我。