2015-09-16 1 views
2

Je suis coincé avec un moteur et plusieurs algorithmes et j'ai besoin d'aide.PredictionIO - un moteur et plusieurs algorithmes

J'ai un moteur et 2 algorithmes, appelons AL1 et AL2. Dans src/main/scala ayant 2 fichiers scala d'algorithme, nom AL1Algorithm.scala et AL2Algorithm.scala chaque algorithme a son propre param et modèle (AL1AlgorithmParams et AL1Model pour AL1 et AL2AlgorithmParams et AL2Model pour AL2). Il y a donc 2 fonctions de train et 2 fonctions de prédiction.

Je peux former 2 algorithmes en appelant pio train. Quand j'appelle send_query à tester, le programme retourne toujours le résultat de l'algorithme je mets sur le haut du fichier engine.json

Par exemple, si je mets AL1Algorithm sur le dessus, send_query se déroulera AL1Algorithm

"algorithms": [ 
    { 
     "name": "AL1Algorithm", 
     "params": { 
     "n": 100 
     } 
    }, 
    { 
     "name": "AL2Algorithm", 
     "params": { 
     "n": 100 
     } 
    } 

si je mets AL2Algorithm sur le dessus, send_query sera exécuté AL2Algorithm »

"algorithms": [ 
    { 
     "name": "AL2Algorithm", 
     "params": { 
     "n": 100 
     } 
    }, 
    { 
     "name": "AL1Algorithm", 
     "params": { 
     "n": 100 
     } 
    } 

Ma question est, puis-je appeler 2 algorithmes pour un send_query, comment distinguer l'algorithme devrait être appelé à send_query au lieu de engine.json. Il y a quelque chose de bizarre ici, je pense qu'il y a des problèmes avec ma configuration. Will Serving.scala produira les résultats de 2 algorithmes en même temps. Puis-je partager les résultats de chaque algorithme dans le service.

Merci beaucoup

Répondre

0

Vous devez également modifier la fonction servir() Dans Serving.scala. la fonction serve() a 2 arguments. voir ci-dessous

def serve(query: Query, 
    predictedResults: Seq[PredictedResult]): PredictedResult 

La requête est envoyée aux deux algorithmes, et le PredictedResult retourné par les deux algorithmes sont passés à serve() fonction Seq[PredictedResult]. L'ordre Seq[] est identique à l'ordre de l'algorithme défini dans engine.json. Vous devez modifier ceci pour utiliser toutes les sorties PredictedResult par algorithme. Certains des exemples de modèles ne prennent par défaut que le 1er résultat (predictedResults.head)

Veuillez également voir "Étape 4. Modifier le service pour combiner plusieurs sorties d'algorithmes" dans this doc comme exemple.

+0

Cher Kenneth, Merci beaucoup pour votre réponse. Je peux obtenir tout le résultat de 2 algorithmes maintenant par override def serve (requête: Query, predictedResults: Seq [PredictedResult]): PredictedResult = { val standard: Seq [Array [ItemScore]] = predictedResults.map (_. ItemScores) new PredictedResult (standard.flatten.toArray)} Pouvez-vous m'aider à les séparer, j'ai un paramètre dans la requête nommé "eventType", si eventType == "AL1" alors j'ai besoin du résultat du premier algorithme , si eventType == "AL2", le résultat de l'algorithme 2 devrait retourner, et ainsi de suite, si eventType == "ALn", alors j'ai besoin de l'algorithme n. –

+0

Une façon de le faire est de définir PredictedResult comme –

+0

(désolé, appuyez sur Entrée par erreur dans le commentaire précédent) Une façon de le faire est d'ajouter un champ dans votre PredictedResult pour indiquer que le résultat provient de quel algorithme. par exemple. 'case class PredictedResult (algoId: String, itemScores: Array [ItemScore]) étend Serializable', alors en servant vous pouvez dire que PredictedResult est de quel algorithme. –