【发布时间】: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