隐式推荐器调整超参数Pyspark

时间:2015-12-09 22:41:13

标签: performance apache-spark pyspark implicit

computeMAPK函数采用模型,实际数据和验证数据(用户,产品)来生成评级。然后对每个用户的预测评级进行排序,并将顶部K与实际数据进行比较,以计算平均精度K

我正在使用此功能来调整超参数,即适合多个模型,并选择具有最高MAPK的最佳Lambda,Alpha,Ranks。这适用于小型数据集,但当矩阵成为10万用户* 200个产品时。它特别与reduceByKey步骤和连接打破。是否有更好的方法来调整ALS的超级参数隐式?我正在使用Spark 1.3。

实际RDD的形式(用户,产品) 有效的RDD格式(用户,产品)

def apk(act_pred):
      predicted = act_pred[0]
      actual = act_pred[1]
      k = act_pred[2]
      if len(predicted)>k:
          predicted = predicted[:k]
      score =0.0
      num_hits = 0.0

      for i,p in enumerate(predicted):
            if p in actual and p not in predicted[:i]:
                      num_hits += 1.0
                      score += num_hits / (i+1.0)

      if not actual:
          return 1.0

      #return num_hits
      return (score/min(len(actual),k))



def computeMAPKR(model,actual,valid,k):
    pred = model.predictAll(valid).map(lambda x:(x[0],[(x[1],x[2])])).cache()
    gp = pred.reduceByKey(lambda x,y:x+y)
    #gp = pred.groupByKey().map(lambda x : (x[0], list(x[1])))


    # for every user, sort the items by predicted ratings and get user, item pairs
    def f(x): 
        s = sorted(x,key=lambda x:x[1],reverse=True)
        sm = map(lambda x:x[0],s)
        return sm

    sp = gp.mapValues(f)



    # actual data
    ac = actual.map(lambda x:(x[0],[(x[1])]))

    #gac = ac.reduceByKey(lambda x,y:(x,y)).map(lambda x : (x[0], list(x[1])))
    gac = ac.reduceByKey(lambda x,y:x+y)

    ap = sp.join(gac)


    apk_result = ap.map(lambda x:(x[0],(x[1][0],x[1][1],k))).mapValues(apk)
    mapk = apk_result.map(lambda x :x[1]).reduce(add) / ap.count()

    #print(apk_result.collect()) 
    return mapk

0 个答案:

没有答案