2017-09-25 1 views
0

J'ai un modèle DRF créé en h2o flow qui est censé être binomiale et flow indique qu'il est binomialeh2o résultats du service de prédiction de la vapeur ne pas être reconnu comme BinaryPrediction pour estimateur binomiale

enter image description here

mais je suis ayant un problème où, l'important dans h2o steam et le déployant vers le service de prédiction, le modèle ne semble pas être reconnu comme binomial. La raison pour laquelle je pense que c'est vrai est montrée ci-dessous. La raison pour laquelle c'est un problème est parce que je pense que c'est ce qui fait que le service de prédiction ne montre PAS la valeur de confiance pour la prédiction (ce raisonnement est également montré ci-dessous).

Dans le service de prédiction, je peux obtenir une étiquette de prédiction, mais aucune valeur renseignée dans la table de probabilités d'étiquette-index.

enter image description here

Utilisation de l'inspecteur du navigateur (Google Chrome), la sortie de prédiction semble dépendre d'un fichier appelé predict.js.

enter image description here

Afin d'obtenir les valeurs de probabilité de prédiction à afficher dans le service de prédiction, il semble que this bloc de code doit courir pour se rendre à this ligne. Ouverture du fichier predict.js au sein de l'inspecteur sur la page des services de prévision et en ajoutant quelques instructions de sortie de débogage quelques-unes des lignes supérieures (indiquées avec des commentaires DEBUG/ENDDEBUG dans le code ci-dessous), ma fonction showResults() ressemble alors:

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; 
    } 

et en cliquant sur « prévoir » dans le service de prévision génère maintenant la sortie de la console:

enter image description here

Si je devais ajouter une déclaration à isBinaryPrediction = true forcec la variable globale true (autour here) et exécuter à nouveau la prédiction, la console visualise:

enter image description here

indiquant que le variableoutputDomain est indéfini. La variable outputDomain semble être définie dans functionshowModel. Cette fonction semble s'exécuter lors du chargement de la page. Je ne peux donc pas la modifier dans l'inspecteur de chrome pour voir les valeurs des variables. Si quelqu'un sait comment résoudre ce problème (obtenir les valeurs de probabilité de prédiction pour le service de prédiction h2o steam pour les modèles binomiaux), cela serait d'une grande aide. Merci :)

Répondre

0

L'interface utilisateur n'a pas encore été mise à jour pour gérer les MOJO et il semble y avoir un bug. Vous êtes invités à contribuer. https://github.com/h2oai/steam/blob/master/CONTRIBUTING.md

+0

Je ne pense pas que le modèle est importé en tant que MOJO dans ce cas, car je ne rencontre pas les mêmes types de problèmes que ceux que j'ai rencontrés dans ce post (https://stackoverflow.com/q/ 46353578/8236733) lorsqu'il était plus probable que le modèle était importé en tant que MOJO. Le modèle que j'utilise maintenant est beaucoup plus petit (200MB contre 800MB). – lampShadesDrifter

+1

Je crois que Steam envoie toujours des modèles DRF en tant que MOJO. Vous pouvez essayer de l'exporter en tant que POJO et construire un service de prédiction à partir de cela, et voir si vous obtenez le même résultat. – Magnus

+0

Note utile pour les autres: Depuis l'URL du service de prédiction (par exemple, localhost: 16563), vous pouvez accéder au sous-domaine "/ info" (par exemple localhost: 16563/info) pour voir une carte json de certaines informations sur le modèle utilisé. – lampShadesDrifter

0

Ma solution est très hacky, mais fonctionne pour mon particulier cas (c.-à-je un DRF, binomiale modèle à la vapeur h2o qui n'est pas reconnu comme modèle binaire (comment je sais que cela est montré dans cette réponse)).

Solution: Dans mon poste d'origine, il y avait une outputDomain variable qui était undefined. En regardant le code source, cette variable est définie à (ce qui est supposé être) les étiquettes de domaine de la réponse de sortie pour le modèle, here. J'ai changé cette ligne de outputDomain = domains[i1]; à outputDomain = domains[i1-1];. Ma sortie après avoir cliqué sur l'étude PREDICT bouton ressemble à:

enter image description here

du téléchargement de linux officiel h2o steam, vous pouvez accéder au fichier de service predict.js de prédiction en ouvrant steam-1.1.6-linux-amd64/var/master/assets/ROOT.war/extra/predict.js, puis enregistrer les modifications et en relançant le serveur de la jetée $ java -Xmx6g -jar var/master/assets/jetty-runner.jar var/master/assets/ROOT.war.

Causes?: Je soupçonne que le problème a quelque chose à voir avec le fait que la variable globale isBinaryPrediction dans predict.js semble rester false pour mon modèle. La raison pour laquelle isBinaryPrediction est faux semble être parce que dans la fonction showInputParameters(), data.m n'a pas de champ _problem_type. En utilisant console.dir(data, {depth: null}) dans la console de l'inspecteur pour voir les champs de data.m, je vois que le champ attendud data.m._problem_type n'existe pas et renvoie donc undefined, donc isBinaryPrediction n'est jamais défini comme vrai (here).

enter image description here

Pourquoi ce qui se passe, je ne sais pas. Je n'ai utilisé que des modèles DRF dans la vapeur jusqu'à présent et cela peut être un problème avec ce modèle, mais je n'ai pas testé. Si quelqu'un sait pourquoi cela peut se produire, s'il vous plaît faites le moi savoir.