Isso é para tentar responder à parte "como fazer" da pergunta para quem deseja implementar praticamente recomendações de SVD esparsas ou inspecionar o código-fonte para obter detalhes. Você pode usar um software FOSS pronto para uso para modelar SVD esparso. Por exemplo, vowpal wabbit
, libFM
, ou redsvd
.
vowpal wabbit
possui 3 implementações de algoritmos "do tipo SVD" (cada uma selecionável por uma das 3 opções de linha de comando). Estritamente falando, eles devem ser chamados de "fatoração matricial aproximada, iterativa", em vez de puro "SVD" clássico, mas estão intimamente relacionados ao SVD.Você pode pensar neles como uma fatoração SVD aproximada muito computacionalmente eficiente de uma dispersão (principalmente zeros) matriz.
Aqui está uma receita completa e prática para fazer recomendações de filmes no estilo Netflix com vowpal wabbit
e sua --lrq
opção "quadrática de classificação baixa" ( ) que parece funcionar melhor para mim:
Arquivo de formato do conjunto de dados ratings.vw
(cada classificação em uma linha por usuário e filme):
5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...
Onde o 1º número é a classificação (de 1 a 5 estrelas), seguida pelo ID do usuário que avaliou e o ID do filme que foi classificado.
Os dados de teste estão no mesmo formato, mas podem (opcionalmente) omitir a coluna de classificações:
|user 1 |movie 234
|user 12 |movie 1019
...
opcionalmente porque para avaliar / testar previsões precisamos de classificações para comparar as previsões. Se omitirmos as classificações, vowpal wabbit
ainda assim as preveremos, mas não será possível estimar o erro de previsão (valores previstos x valores reais nos dados).
Para treinar, solicitamos vowpal wabbit
encontrar um conjunto de N
fatores de interação latente entre usuários e filmes de que eles gostam (ou não). Você pode pensar nisso como encontrar temas comuns em que usuários semelhantes classificam um subconjunto de filmes de maneira semelhante e usar esses temas comuns para prever como um usuário classificaria um filme que ainda não classificou.
vw
opções e argumentos que precisamos usar:
--lrq <x><y><N>
encontra fatores latentes "quadráticos de classificação baixa".
<x><y>
: "um" significa cruzar os espaços de nomes dos [es] e dos [ovi] no conjunto de dados. Observe que apenas a 1ª letra em cada espaço de nome é usada com a --lrq
opção
<N>
: N=14
abaixo está o número de fatores latentes que queremos encontrar
-f model_filename
: escreva o modelo final em model_filename
Portanto, um simples comando de treinamento completo seria:
vw --lrq um14 -d ratings.vw -f ratings.model
Depois de termos o ratings.model
arquivo de modelo, podemos usá-lo para prever classificações adicionais em um novo conjunto de dados more_ratings.vw
:
vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted
As previsões serão gravadas no arquivo more_ratings.predicted
.
Usando demo/movielens
a vowpalwabbit
árvore de origem, recebo ~ 0,693 MAE (erro absoluto médio) após o treinamento em 1 milhão de classificações de usuário / filme ml-1m.ratings.train.vw
com 14 fatores latentes (o que significa que a matriz do meio SVD é uma matriz de 14 x 14 linhas x colunas) e teste no independente conjunto de teste ml-1m.ratings.test.vw
. Quão bom é 0,69 MAE? Para o intervalo completo de previsões possíveis, incluindo o caso não classificado (0) [0 a 5], um erro de 0,69 é de ~ 13,8% (0,69 / 5,0) do intervalo completo, ou seja, cerca de 86,2% de precisão (1 - 0,138).
Você pode encontrar exemplos e uma demonstração completa de um conjunto de dados semelhante (movielens) com documentação na vowpal wabbit
árvore de fontes no github:
Notas:
- A
movielens
demonstração usa várias opções I omitido (para simplificar) do meu exemplo: em particular --loss_function quantile
, --adaptive
e--invariant
- A
--lrq
implementação vw
é muito mais rápida do que --rank
, em particular, ao armazenar e carregar os modelos.
Créditos:
--rank
opção vw foi implementada por Jake Hofman
--lrq
A opção vw (com abandono opcional) foi implementada por Paul Minero
- vowpal wabbit (aka vw) é o filho cerebral de John Langford