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