Python 隐式推荐系统K-fold交叉验证的优化
我一直在尝试使用k-fold交叉验证测试我的推荐系统。我的推荐系统是基于隐式反馈的。因为我试图在我的用户项目矩阵上实现k-fold交叉验证,所以我不能使用scikit learn的原生k-fold方法(可以吗?)。我在实现我的k-折叠交叉验证技术时遇到问题。我似乎使用了很多for循环,而且速度变得非常慢。我已经浏览了这些链接:但我似乎无法将其应用到我的代码中。有人能帮我吗 我的代码: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
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循环本身产生的额外开销可以忽略不计。谢谢。我使用平均精度作为度量标准。