我在h2o flow
创建的DRF模型应该是二项式,而flow
表示它是二项式
但我遇到了一个问题,将其导入h2o steam
并将其部署到预测服务中,该模型似乎不会被识别为二项式。我认为这是真的的原因如下所示。这是一个问题的原因是因为我认为这是导致预测服务不显示预测的置信度值的原因(这种推理也在下面显示)。
在预测服务中,我可以获得预测标签,但索引标签概率表中没有填充任何值。
使用浏览器检查器(谷歌浏览器),预测输出似乎取决于名为predict.js
的文件。
为了获得预测服务中显示的预测概率值,似乎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;
}
并单击预测服务中的“预测”现在生成控制台输出:
如果我要添加一个语句isBinaryPrediction = true
来强制将全局变量设置为true(大约here)并再次运行预测,控制台会显示:
表示variable outputDomain
未定义。变量outputDomain
似乎在function showModel
中设置。此功能似乎在页面加载时运行,因此我无法在chrome检查器中对其进行编辑以查看变量值是什么。如果有人知道如何解决这个问题(获得预测概率值以显示h2o steam
的二项式模型的预测服务),那将是一个很大的帮助。谢谢:))
答案 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];
。单击预测按钮后的输出如下所示:
从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)。
为什么会这样,我不知道。到目前为止我只在蒸汽中使用过DRF模型,这可能是该模型的问题,但我还没有测试过。如果有人知道为什么会这样,请告诉我。