Python 隐式推荐系统K-fold交叉验证的优化

Python 隐式推荐系统K-fold交叉验证的优化,python,numpy,recommendation-engine,Python,Numpy,Recommendation Engine,我一直在尝试使用k-fold交叉验证测试我的推荐系统。我的推荐系统是基于隐式反馈的。因为我试图在我的用户项目矩阵上实现k-fold交叉验证,所以我不能使用scikit learn的原生k-fold方法(可以吗?)。我在实现我的k-折叠交叉验证技术时遇到问题。我似乎使用了很多for循环,而且速度变得非常慢。我已经浏览了这些链接:但我似乎无法将其应用到我的代码中。有人能帮我吗 我的代码: def TrainRepeat2(counts,FinalArr,k=3): """ parame

我一直在尝试使用k-fold交叉验证测试我的推荐系统。我的推荐系统是基于隐式反馈的。因为我试图在我的用户项目矩阵上实现k-fold交叉验证,所以我不能使用scikit learn的原生k-fold方法(可以吗?)。我在实现我的k-折叠交叉验证技术时遇到问题。我似乎使用了很多for循环,而且速度变得非常慢。我已经浏览了这些链接:但我似乎无法将其应用到我的代码中。有人能帮我吗

我的代码:

 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循环并优化代码

任何帮助都将不胜感激


谢谢

按评论编辑

在一天结束时,如果要运行n次交叉验证,则必须循环n次。无论循环对您是隐藏的(并且希望非常有效地编写,无论是用cython还是类似的东西),还是在代码中可见的,都会发生这种情况

我认为在高层次上,你想要的是:

你需要做的事情: 编写一个分类器对象,它接收训练数据,训练类,测试数据返回测试数据的预测列表。这是您的“recommender”类,对任何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.        ])

出于某种原因,我不认为你会使它比
O(n^3)
更快。为什么你不能使用sklearn的交叉验证?我不确定这一点,但我可以使用sklearn.cross\u验证来创建褶皱。然而,在每个不同层面上的训练仍然需要我循环。正如@flyingmeatball所说,如果不循环N次,根本不可能进行N轮交叉验证。使这一成本高昂的是在每次迭代中训练您的模型所花费的时间-由for循环本身产生的额外开销可以忽略不计。谢谢。我使用平均精度作为度量标准。