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

h2o steam prediction service results not being recognized as a BinaryPrediction for binomial estimator

我在 h2o flow 中创建了一个 DRF 模型,它应该是二项式的,而 flow 表明它是二项式的

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

在预测服务中,我可以得到一个预测标签,但是索引标签概率没有填写任何值table。

使用浏览器检查器 (google chrome),预测输出似乎取决于名为 predict.js.

的文件

为了获得预测服务中显示的预测概率值,this block of code needs to run to get to this line. Opening the predict.js file within the inspector on the prediction service page and adding some debug output statements at some of the top lines (indicated with DEBUG/ENDDEBUG comments in the code below), my 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;
  }

并在预测服务中单击 "predict" 现在会生成控制台输出:

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

表示variable outputDomain is undefined. The variable outputDomain seems to be set in the functionshowModel。此函数在页面加载时出现 运行,因此我无法在 chrome 检查器中编辑它以查看变量值是什么。如果有人知道如何解决此问题(让预测概率值显示在 h2o steam 的二项式模型预测服务中),那将大有帮助。谢谢:)

UI 尚未更新以处理 MOJO,似乎存在错误。欢迎您投稿:https://github.com/h2oai/steam/blob/master/CONTRIBUTING.md

我的解决方案非常老套,但适用于我的 特殊 案例(即我有一个 DRF h2o 蒸汽中的二项式 模型未被识别为二​​元模型(我如何知道这一点在此答案中显示))。

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

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

原因?: 我怀疑这个问题与 predict.js 中的全局变量 isBinaryPrediction 对于我的模型似乎仍然是 false 这一事实有关。 isBinaryPrediction 为假的原因似乎是因为在函数 showInputParameters(), data.m has no field _problem_type. Using console.dir(data, {depth: null}) in the inspector console to see the fields of data.m, I see that the expectedd field data.m._problem_type does not exist and so returns undefined, thus isBinaryPrediction is never set true (here) 中。

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