【问题标题】:Optimization of K-fold cross validation for implicit recommendation systems隐式推荐系统的 K 折交叉验证优化
【发布时间】:2016-05-03 21:00:27
【问题描述】:

我一直在尝试使用 k 折交叉验证来测试我的推荐系统。我的推荐系统是基于隐式反馈的。因为,我试图在我的用户项矩阵上实现 k 折交叉验证,所以我不能使用 scikit-learn 的原生 k 折方法(可以吗?)。我在实施我的 k 折交叉验证技术时遇到了麻烦。我似乎使用了很多 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 循环并优化代码。

任何帮助将不胜感激

谢谢!

【问题讨论】:

  • 出于某种原因,我认为您不会比O(n^3) 更快。
  • 为什么不能使用sklearn的交叉验证?
  • 我不确定,但我可以使用 sklearn.cross_validation 创建折叠。但是,每个不同折叠的训练仍然需要我循环。
  • 正如@flyingmeatball 所说,基本上没有办法在不循环N次的情况下进行N轮交叉验证。成本高昂的原因在于每次迭代训练模型所花费的时间——for 循环本身产生的额外开销可以忽略不计。

标签: python numpy recommendation-engine


【解决方案1】:

根据评论编辑

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

我认为你想要的高水平在这里:

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

您需要做的事情: 编写一个分类器对象,接收 train_data,train_class,test_data 返回 test_data 的预测列表。这是您的“推荐”类,适用于任何 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.        ])

【讨论】:

  • 谢谢。我使用平均平均精度作为指标。
猜你喜欢
  • 2016-02-14
  • 2016-01-15
  • 1970-01-01
  • 2020-08-29
  • 2018-08-29
  • 2017-06-09
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多