【问题标题】:PredictionIO - one engine and multiple algorithmsPredictionIO - 一个引擎和多种算法
【发布时间】:2015-09-16 09:25:32
【问题描述】:

我被一个引擎和多种算法困住了,需要进一步的帮助。

我有一个引擎和两个算法,我们称之为 AL1 和 AL2。 在 src/main/scala 中有 2 个算法 scala 文件,名称为 AL1Algorithm.scala 和 AL2Algorithm.scala,每个算法都有自己的参数和模型(AL1AlgorithmParams 和 AL1Model 用于 AL1,AL2AlgorithmParams 和 AL2Model 用于 AL2)。 因此有 2 个训练函数和 2 个预测函数。

我可以通过调用 pio train 来训练 2 种算法。 当我调用 send_query 进行测试时,程序总是返回我放在 engine.json 文件顶部的算法的结果

例如,如果我将 AL1Algorithm 放在顶部,send_query 将运行 AL1Algorithm

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

如果我将 AL2Algorithm 放在顶部,send_query 将运行 AL2Algorithm'

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

我的问题是,我可以为一个send_query调用2个算法吗,如何区分应该在send_query而不是engine.json中调用哪个算法。 这里有些奇怪,我认为我的配置有问题。 Serving.scala 会同时产生 2 个算法的结果。我可以在服务中拆分每个算法的结果吗?

非常感谢

【问题讨论】:

    标签: algorithm predictionio


    【解决方案1】:

    你还需要修改Serving.scala中的serve()函数。 serve() 函数有 2 个参数。见下文

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

    查询被发送到两个算法,两个算法返回的PredictedResult 被作为Seq[PredictedResult] 传递给serve() 函数。 Seq[] 顺序与engine.json 中定义的算法顺序相同。您需要修改它以利用算法输出的所有PredictedResult。一些模板示例默认只取第一个结果(predictedResults.head

    请参见this doc 中的“步骤 4. 修改 Serving 以组合多个算法的输出”作为示例。

    【讨论】:

    • 亲爱的肯尼斯, 非常感谢您的回复。我现在可以通过覆盖 def serve(query: Query, predictedResults: Seq[PredictedResult]): PredictedResult = { val standard: Seq[Array[ItemScore]] = predictResults.map(_.itemScores) 来获得 2 种算法的所有结果new PredictedResult(standard.flatten.toArray) } 你能帮我拆分它们的方法吗,我在查询中有一个名为“eventType”的参数,如果 eventType == “AL1”,那么我需要第一个算法的结果,如果 eventType == "AL2",算法2的结果应该返回,以此类推,如果eventType == "ALn",那么我需要算法n。
    • 一种方法是将 PredictedResult 定义为
    • (抱歉,在之前的评论中误按了 Enter) 一种方法是在 PredictedResult 中添加一个字段以指示结果来自哪个算法。例如case class PredictedResult(algoId: String, itemScores: Array[ItemScore]) extends Serializable,那么在服务中你可以知道 PredictedResult 来自哪个算法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 2017-03-15
    • 1970-01-01
    相关资源
    最近更新 更多