Esto es para tratar de responder la parte de "cómo" de la pregunta para aquellos que desean implementar prácticamente recomendaciones de SVD dispersas o inspeccionar el código fuente para obtener detalles. Puede usar un software FOSS estándar para modelar SVD disperso. Por ejemplo, vowpal wabbit
, libFM
, o redsvd
.
vowpal wabbit
tiene 3 implementaciones de algoritmos "SVD-like" (cada uno seleccionable por una de las 3 opciones de línea de comando). Estrictamente hablando, estos deberían llamarse "factorización matricial aproximada, iterativa" en lugar de "SVD" pura "clásica", pero están estrechamente relacionados con la SVD. Puede pensar en ellos como una factorización SVD aproximada muy computacionalmente eficiente de una dispersa (principalmente ceros) matriz.
Aquí hay una receta completa y funcional para hacer recomendaciones de películas al estilo de Netflix vowpal wabbit
y su --lrq
opción "cuadrática de bajo rango" ( ) que parece funcionar mejor para mí:
Archivo de formato del conjunto de datos ratings.vw
(cada calificación en una línea por usuario y película):
5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...
Donde el primer número es la calificación (1 a 5 estrellas) seguido de la identificación del usuario que calificó y la identificación de la película que se calificó.
Los datos de prueba están en el mismo formato pero pueden (opcionalmente) omitir la columna de calificaciones:
|user 1 |movie 234
|user 12 |movie 1019
...
opcionalmente porque para evaluar / probar predicciones necesitamos calificaciones para comparar las predicciones. Si omitimos las clasificaciones, vowpal wabbit
todavía pronosticaremos las clasificaciones pero no podremos estimar el error de predicción (valores pronosticados vs valores reales en los datos).
Para entrenar, le pedimos vowpal wabbit
que encuentre un conjunto de N
factores de interacción latente entre los usuarios y las películas que les gustan (o no) Puede pensar en esto como encontrar temas comunes en los que usuarios similares califican un subconjunto de películas de manera similar y usan estos temas comunes para predecir cómo un usuario calificaría una película que aún no ha calificado.
vw
opciones y argumentos que necesitamos usar:
--lrq <x><y><N>
encuentra factores latentes "cuadráticos de bajo rango".
<x><y>
: "um" significa cruzar los espacios de nombres u [sers] ym [ovie] en el conjunto de datos. Tenga en cuenta que solo la primera letra de cada espacio de nombres se usa con la --lrq
opción.
<N>
: a N=14
continuación se muestra el número de factores latentes que queremos encontrar
-f model_filename
: escribe el modelo final en model_filename
Entonces, un comando simple de entrenamiento completo sería:
vw --lrq um14 -d ratings.vw -f ratings.model
Una vez que tengamos el ratings.model
archivo del modelo, podemos usarlo para predecir calificaciones adicionales en un nuevo conjunto de datos more_ratings.vw
:
vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted
Las predicciones se escribirán en el archivo more_ratings.predicted
.
Utilizando demo/movielens
en el vowpalwabbit
árbol fuente, obtengo ~ 0.693 MAE (Error absoluto medio) después de entrenar en 1 millón de clasificaciones de usuario / película ml-1m.ratings.train.vw
con 14 factores latentes (lo que significa que la matriz media SVD es una matriz de 14x14 filas x columnas) y probar en el independiente equipo de pruebaml-1m.ratings.test.vw
. ¿Qué tan bueno es 0.69 MAE? Para el rango completo de posibles predicciones, incluido el caso no calificado (0) [0 a 5], un error de 0.69 es ~ 13.8% (0.69 / 5.0) del rango completo, es decir, aproximadamente 86.2% de precisión (1 - 0.138).
Puede encontrar ejemplos y una demostración completa de un conjunto de datos similar (lente de película) con documentación en el vowpal wabbit
árbol de origen en github:
Notas:
- La
movielens
demostración se utiliza varias opciones omití (para simplificar) de mi ejemplo: en particular --loss_function quantile
, --adaptive
y--invariant
- La
--lrq
implementación en vw
es mucho más rápida que --rank
, en particular, al almacenar y cargar los modelos.
Créditos
--rank
La opción vw fue implementada por Jake Hofman
--lrq
La opción vw (con deserción opcional) fue implementada por Paul Minero
- Widgetpal Wabbit (también conocido como VW) es el hijo del cerebro de John Langford