隐式推荐系统的K折交叉验证的优化

时间:2016-05-03 21:00:28

标签: python numpy recommendation-engine

我一直在尝试使用k-fold交叉验证来测试我的推荐系统。我的推荐系统基于隐式反馈。因为,我正在尝试在我的用户项矩阵上实现k-fold交叉验证,我不能使用scikit-learn的本机k-fold方法(可以吗?)。我无法实现我的k-fold交叉验证技术。我似乎使用了很多for循环,而且它变得非常慢。我已浏览过这些链接:Optimize this function with numpy (or other vectorization methods)Speed up for loop with numpy但我似乎无法将其应用于我的代码。有人可以帮助我吗?

我的代码:

 def TrainRepeat2(counts,FinalArr,k=3):


  """
  parameters:
  -------------------------------------------

  counts : user-item matrix
  k  :  No of folds
  FinalArr : shuffled indices

  Example:
  if k = 3
  FinalArr will be a list containing 3 lists with randomly shuffled indices
"""


   # No of factors
   num_factors= [10,20]
   PartitionList = range(k)


   # Iterating over the number of factors
   for i in range(len(num_factors)):


       # iterating over the folds
       for partition in PartitionList:

          # Keep one fold for testing
          validation = counts[FinalArr[partition],:]

         # CKeep the rest for training
          validation_list = [x for x in PartitionList if x != partition]

           # Train over the rest
           for t in validation_list:

             train = counts[FinalArr[t],:]
             train = sparse.csr_matrix(train)
             print "THe evaluation is being done for factor no %d" %(num_factors[i])
             reg_param = 5

             MF_als = ImplicitMF(train,validation,num_factors = num_factors[i],num_iterations=80,reg_param = reg_param,num_threads=14)
             user_vectors,item_vectors=  MF_als.train_model(flag,leaveone=False)

具体来说,算法是o(N ^ 3)。我想以某种方式删除for循环并优化代码。

任何帮助将不胜感激

谢谢!

1 个答案:

答案 0 :(得分:2)

根据评论编辑

如果您想要多次运行交叉验证,那么在一天结束时,您将需要循环n次。无论你是否隐藏了这个循环(并且希望非常有效地编写,无论是在cython中还是在类似的东西中)或在代码中可见,都会发生这种情况。

我认为你想要的就是这里:

http://scikit-learn.org/stable/modules/cross_validation.html

您需要做的事情: 写一个分类器对象,它接受train_data,train_class,test_data返回test_data的预测列表。这是你的推荐人" class,并且对任何sklearn分类器都有效。

写一个得分对象。根据下面的评论,这应该采用两个相同长度的数组,预测和正确的分类,并计算错误。然后,您可以直接在下面的示例sklearn代码中使用这两个对象。

假设:

您的完整数据集位于df

你的"目标" (无论如何定义)是在目标

clf是你的分类器(在这种情况下是推荐者)

得分手就是你如何计算错误

n_samples = len(df)
cv = cross_validation.ShuffleSplit(n_samples, n_iter=3, test_size=0.3, random_state=0)

cross_validation.cross_val_score(clf, df, targets, scoring = scorer,cv=cv)

array([ 0.97...,  0.97...,  1.        ])