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

Optimization of K-fold cross validation for implicit recommendation systems

我一直在尝试使用 k 折交叉验证来测试我的推荐系统。我的推荐系统基于隐式 feedback.Since,我试图在我的用户-项目矩阵上实现 k 折交叉验证,我不能使用 scikit-learn 的原生 k 折方法(可以吗?)。我在实施我的 k 折交叉验证技术时遇到了问题。我似乎使用了很多 for 循环,而且它变得非常慢。我浏览了这些链接: and 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 循环并优化代码。

如有任何帮助,我们将不胜感激

谢谢!

根据评论进行编辑

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

我想你想要的高层次在这里:

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

您需要做的事情: 编写一个 classifier 对象,它接收 train_data、train_class、test_data returns test_data 的预测列表。这是您的 "recommender" class,并且对任何 sklearn classifier 都有效。

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

假设:

你的完整数据集在 df

您的 "target"(无论如何定义)在目标中

clf 是您的class推荐人(在本例中为推荐人)

scorer 是你计算误差的方式

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.        ])