2016-05-03 5 views
1

Я пытаюсь протестировать мою систему рекомендаций, используя проверку соответствия k-fold cross. Моя система рекомендаций основана на неявной обратной связи. Поскольку я пытаюсь выполнить кросс-валидацию k-fold в моей матрице пользовательского элемента, я не могу использовать собственные методы k-fold scikit-learn (может я?). У меня возникли проблемы с реализацией моей методики проверки перекрестной привязки k-fold. Кажется, я использую много для циклов, и это становится очень медленным. Я прошел через эти ссылки: Optimize this function with numpy (or other vectorization methods) и Speed up for loop with numpy, но я не могу применить его к моему коду. Может кто-нибудь мне помочь?Оптимизация проверки перекрестных ссылок K для неявных систем рекомендаций

Мой код:

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

По какой-то причине я не думаю, что вы goi ng, чтобы сделать его быстрее, чем 'O (n^3)'. – erip

+0

Почему вы не можете использовать проверку креста sklearn? – flyingmeatball

+0

Я не уверен в этом, но я могу использовать sklearn.cross_validation для создания складок. Тем не менее, тренировка на каждой разной складке все равно потребует от меня петли. –

ответ

2

Отредактировано на комментарий

В конце дня, если вы хотите запустить кросс проверки п число раз, вы будете иметь в цикле п раз. Является ли этот цикл скрытым для вас (и, мы надеемся, написанный очень эффективно, либо в цитоне, либо что-то подобное), либо видимый в вашем коде, это произойдет.

Я думаю, на высоком уровне, что вы хотите здесь:

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

вещей вам нужно сделать: написать классификатор объект, который принимает в train_data, train_class, test_data возвращает список предсказаний для test_data. Это ваш «рекомендательный» класс, и он функционирует для любого из классификаторов sklearn.

Запишите объект оценки. В соответствии с вашим комментарием, это должно принимать два массива одинаковой длины, предсказание и правильную классификацию и вычислять ошибку. Затем вы можете использовать эти два объекта непосредственно в приведенном ниже коде sklearn.

Предполагая:

ваш полный набор данных в ДФ

ваша "цель" (однако определено) в целевых

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.  ]) 
+0

Спасибо. Я использую среднюю среднюю точность в качестве показателя. –

 Смежные вопросы

  • Нет связанных вопросов^_^