2016-06-04 10 views
1

Это моя первая попытка машинного обучения. Я пишу очень простой механизм рекомендаций, используя набор данных yelp. Он написан на python, используя библиотеки pandas и numpy для (обработки данных). Я уже сузил данные сначала в ресторанах (миллионы), затем только в ресторанах в Вегасе (тысячи), а затем только в ресторанах с 3.5 звездами и выше с более чем 50 отзывами (сотнями). Также я сузил пользователей только тех, кто просмотрел как минимум 20% ресторанов. Наконец, я приехал в матрицу рейтингов, насчитывающую 100 пользователей в 1800 ресторанах.Как матричная декомпозиция помогает заполнить небольшую матрицу полезности/оценок для новых пользователей?

Однако я чувствую, что все еще редко разрешается давать (относительно) полезные рекомендации. Цель состоит в том, чтобы использовать сопоставление векторных расстояний на основе коллективного элемента, используя косинус-сходство.

Я читал о работе с разреженными матрицами, и консенсус, похоже, заключается в использовании матричной факторизации. Однако, похоже, что большинство из этих чтений относятся к текущим пользователям и используют матричную факторизацию в качестве алгоритма, который управляет рекомендацией для текущих пользователей при решении проблемы разреженности как побочного продукта. Мое понимание здесь правильно? То, что я ищу, - это метод, который сначала решает проблему разреженности, а затем использует косинусные векторные расстояния для руководства рекомендацией.

Если декомпозиция на самом деле способ пойти: какой метод sklearn.decomposition следует использовать, например, PCA, SVD, NMF?

[[ 3, 0, 0, ..., 0, 0, 0], 
[ 0, 0, 0, ..., 0, 0, 0], 
[ 0, 0, 0, ..., 0, 4, 3], 
... 
[ 1, 0, 0, ..., 0, 0, 0], 
[ 0, 0, 0, ..., 0, 0, 2], 
[ 0, 0, 5, ..., 0, 1, 3]] 

(100 пользователей X 1800 Рестораны)

ответ

1

Уменьшение количества оценок не является хорошим решением для повышения точности вашей рекомендации (по крайней мере, непосредственно). Сказал, что редкость не является «большой» проблемой. Действительно, алгоритмы факторизации для рекомендации рассчитаны на то, чтобы справиться с такими видами разрешений, которые достигали: 99%, 98%, 95% -ный уровень разреженности.

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

Наиболее популярные алгоритмы основаны на СВД:

  • SVD Функа (он же СВД, хотя это не является реальным SVD Это приближение..)
  • BRISMF (Предвзятый регуляризованная версия Функа)
  • SVD ++: BRISMF плюс неявная информация обратной связи.
  • timesSVD: SVD ++, который также моделирует DateTime
  • trustSVD: SVD ++, который включает в себя информацию доверия (например, друзей)

Основы этих алгоритмов состоит в:

  1. Создать некоторые низкий -rank и произвольно инициализировать их
  2. Для каждого рейтинга в наборе данных вычислите ошибку с учетом вашего прогноза.
  3. Обновление матриц малоранговыми с использованием градиентов функции, которые вы оптимизирующие
  4. Repeat

Python пример (BRISMF):

# Initialize low-rank matrices (K is the number of latent factors) 
P = np.random.rand(num_users, K) # User-feature matrix 
Q = np.random.rand(num_items, K) # Item-feature matrix 

# Factorize R matrix using SGD 
for step in range(steps): 

    # Compute predictions 
    for k in range(0, len(data)): 
     i = data.X[k, user_col] # Users 
     j = data.X[k, item_col] # Items 
     r_ij = data.Y[k] # rating(i, j) 

     # NOTE: For simplicity (here) I've considered the 
     # bias a standard deviation, but it should be 
     # learned for better accuracy. 
     bias = global_avg + std_user[i] + std_item[j] 

     # Make prediction and compute error 
     rij_pred = bias + np.dot(Q[j, :], P[i, :]) 
     eij = rij_pred - r_ij 

     # Update P and Q at the same time, they're dependents 
     tempP = alpha * 2 * (eij * Q[j, :] + beta * P[i, :]) 
     tempQ = alpha * 2 * (eij * P[i, :] + beta * Q[j, :]) 
     P[i] -= tempP 
     Q[j] -= tempQ 

Extra:

  • Для (и простота кода), я рекомендую вам иметь все, что угодно.
  • Попробуйте создать кеши, если необходимо. Доступ к разреженным матрицам может быть довольно медленным, даже при правильной структуре данных.
  • Эти алгоритмы вычислительно очень дорого, поэтому для простых версий вы можете ожидать, чтобы принять 10s/ITER в наборах данных 1000000 оценок
  • Я строю простую библиотеку для Orange3 Data Mining так что если вы заинтересованы вы можете посмотреть: https://github.com/biolab/orange3-recommendation

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

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