我一直在尝试使用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循环并优化代码。
任何帮助将不胜感激
谢谢!
答案 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. ])