[Traducción] Microsoft SAR - Notas prácticas del sistema de recomendaciones

        [Traducción y bloques] Este artículo es el documento de traducción de la muestra SAR del Proyecto de práctica del sistema de recomendación de Microsoft (Traductor: Funco), la dirección original: SAR Single Node on MovieLens .

        github: microsoft/recommenders es el caso de mejores prácticas del sistema de recomendación de código abierto de Microsoft. Proporciona una gran cantidad de explicaciones de algoritmos del sistema de recomendación y casos específicos, y encapsula algunos métodos comunes en los sistemas de recomendación para nuestra referencia en prácticas futuras. Estas características se reflejan en el presente documento, bienvenidos a comunicarnos y aprender juntos.

        Los corchetes "()" en el texto contienen un número, lo que indica un comentario. El comentario en cada párrafo del texto agregará contenido específico después del texto, que puede ser una explicación de sustantivo , o el autor puede dar una referencia al texto original. para un resultado de traducción incierto. Además, hay una gran cantidad de la palabra Elemento en el texto original . Lo traduje como un elemento , pero de hecho, a veces, traducirlo a un elemento de datos hará que la oración sea más fluida. La razón para no hacer esto es que espero estandarizar el sustantivo: la referencia se basa en el elemento Filtrado colaborativo (ItemCF, Filtrado colaborativo basado en elementos) .

texto

Nodo único de SAR en MovieLens (Python, CPU)

        SAR (Algoritmo simple para recomendación) es un algoritmo de recomendación personalizado rápido y escalable basado en registros de operaciones del usuario, que es rápido y escalable. Puede brindar resultados de recomendación comprensibles e interpretables, al mismo tiempo que trata el problema del "arranque en frío"**(1) . SAR es un algoritmo de vecino más cercano (mencionado en el "Sistema de recomendación" de Agarwal (2) ), que se utiliza para encontrar los elementos más necesarios para cada usuario. Se pueden encontrar más detalles sobre SAR en el cuaderno de inmersión profunda (3)**.

  1. Produce recomendaciones fácilmente explicables e interpretables y maneja escenarios de "elemento frío" y "usuario semifrío".
  2. ** "Principios y práctica de los sistemas de recomendación" ("Sistemas de recomendación: el libro de texto") de Aggarwal es uno de los libros más respetados en el campo de los sistemas de recomendación. Su libro tiene muchas descripciones sobre el algoritmo del vecino más cercano**, especialmente el algoritmo de filtrado colaborativo del vecino más cercano .

Ventajas de los SAR

  1. Fácil de entrenar y desplegar con alta precisión
  2. Entrenamiento rápido: solo se requieren cálculos simples para obtener la matriz de predicción
  3. Puntuación predictiva rápida: simplemente multiplique la matriz de similitud con el vector de puntuación

Puede entenderse fácilmente que la ventaja de SAR es que es simple y rápido en todos los aspectos , pero tiene una precisión considerable .

Cómo usar SAR correctamente

  1. No se enfoca en las características del usuario o las características del artículo

    Tiene un rendimiento deficiente en escenarios que requieren funciones de usuario o funciones de elementos **(1)**

  2. alto uso de memoria

    Requiere crear múltiples matrices dispersas**(2) . La mayoría de los algoritmos basados ​​en la factorización de matrices también sufren este problema (3)**

  3. Favorece un esquema de puntuación implícito, pero no predice la puntuación **(4)**

  1. La esencia de SAR es el filtrado colaborativo de vecinos
  2. El texto original decía que se creará una matriz dispersa de MxM (M es el número de elementos), que es solo una matriz de similitud. De hecho, también necesitamos una matriz de calificación de elementos de usuario. Después de una serie de operaciones, una matriz como producto intermedio se generará
  3. Descomposición de matrices, común como la descomposición en valores singulares (SVD) y la descomposición propia
  4. No sé cómo entender esta frase, el texto original es: favorece un escenario implícito de calificación y no predice calificaciones.

0 Configuración y dependencias

# set the environment path to find Recommenders
import sys
sys.path.append("../../")

import logging
import numpy as np
import pandas as pd
import papermill as pm

from reco_utils.common.timer import Timer
from reco_utils.dataset import movielens
from reco_utils.dataset.python_splitters import python_stratified_split
from reco_utils.evaluation.python_evaluation import map_at_k, ndcg_at_k, precision_at_k, recall_at_k
from reco_utils.recommender.sar import SAR

print("System version: {}".format(sys.version))
print("Pandas version: {}".format(pd.__version__))

Aviso

  1. reco_utils es el paquete del proyecto donde se encuentra el artículo original, y no se puede obtener a través de pip install .

1 Preparación de datos

        Aquí, SAR trata con datos que se ajustan a la siguiente estructura de datos: <User ID>, <Item ID>,<Time>,[<Event Type>], [<Event Weight>] (1) .

        Cada fila de registros representa un registro de operación de un usuario en un artículo. Los registros pueden ser diferentes tipos de eventos en un sitio de comercio electrónico, como: hacer clic para ver un artículo, agregar al carrito, compartir un enlace, etc. Podemos especificar diferentes pesos para cada evento, por ejemplo: podemos definir "compra" como 10 y "ver detalles" como 1 ( 2) .

        El conjunto de datos MovieLens son los datos formateados de las clasificaciones de películas por parte de los usuarios, que se usarán en los códigos de muestra posteriores para demostrar el proceso del algoritmo.

  1. SAR está diseñado para usarse en interacciones con el siguiente esquema: , ,
  2. Este es un caso de puntaje implícito, y solo quiero enfatizar aquí que recopilar y registrar puntajes implícitos de manera oportuna es importante para el análisis futuro que el sistema pueda necesitar.

1.1 Cargar datos de películas

# MOVIELENS_DATA_SIZE = '100k'
data = movielens.load_pandas_df(
    size=MOVIELENS_DATA_SIZE,
    local_cache_path=sys.path[1] + '/downloads/'
)

# Convert the float precision to 32-bit in order to reduce memory consumption 
data['rating'] = data['rating'].astype(np.float32)

data.head()

print(data)

resultado de salida

       userID  itemID  rating  timestamp
0         196     242     3.0  881250949
1         186     302     3.0  891717742
2          22     377     1.0  878887116
3         244      51     2.0  880606923
4         166     346     1.0  886397596
...       ...     ...     ...        ...
99995     880     476     3.0  880175444
99996     716     204     5.0  879795543
99997     276    1090     1.0  874795795
99998      13     225     2.0  882399156
99999      12     203     3.0  879959583

[100000 rows x 4 columns]

Aviso

movielens es un subpaquete de reco_utils , **movielens.load_pandas_df()** descargará una parte de los recursos a una carpeta temporal cada vez que se llame. la sugerencia es

  1. Crear una carpeta de descargas en el directorio de recomendadores de proyectos

  2. Descargue el zip correspondiente de http://files.grouplens.org/datasets/movielens/

    Si el tamaño del parámetro de movielens.load_pandas_df() es '100k' , descargue ml-100k.zip a la carpeta de descargas recién creada

  3. Especifique el parámetro local_cache_path como la carpeta de descargas que acaba de crear

1.2 Dividir datos

Dividir datos basados ​​en un divisor aleatorio de python de una biblioteca pública

Dividimos todos los datos en un conjunto de prueba y un conjunto de entrenamiento , y mantenemos el conjunto **(1)** invisible durante el entrenamiento para medir el rendimiento del algoritmo. SAR genera resultados de recomendación basados ​​en las preferencias del usuario, por lo tanto, todos los usuarios en el conjunto de datos de prueba deben existir en el conjunto de datos de entrenamiento. Para resolver este problema, podemos usar la función python_stratified_split (2) para determinar la proporción de los datos retenidos de cada usuario en los datos originales (por ejemplo, tomar el 25 % como conjunto reservado), para garantizar que los usuarios existan tanto en el conjunto de entrenamiento y el conjunto de prueba. Además, se proporcionan más métodos de segmentación de datos en dataset.python_splitters .

  1. Conjunto de retención** (conjunto de retención) : también conocido como datos de retención**, lo que se describe aquí es en realidad un método de evaluación del modelo: método de retención (retención), aquí, el conjunto de retención es el conjunto de prueba
  2. python_stratified_split y dataset.python_splitters son solo herramientas de segmentación de datos implementadas en reco_utils en el proyecto del sistema de recomendación de Microsoft . Proporcionan una variedad de métodos de segmentación de datos y no se pueden obtener a través de pip install . Además, python_stratified_split implementa principalmente el muestreo aleatorio a través de pandas.DataFrame.sample .
train, test = python_stratified_split(data, ratio=0.75, col_user='userID', col_item='itemID', seed=42)

print("""
Train:
Total Ratings: {train_total}
Unique Users: {train_users}
Unique Items: {train_items}

Test:
Total Ratings: {test_total}
Unique Users: {test_users}
Unique Items: {test_items}
""".format(
    train_total=len(train),
    train_users=len(train['userID'].unique()),
    train_items=len(train['itemID'].unique()),
    test_total=len(test),
    test_users=len(test['userID'].unique()),
    test_items=len(test['itemID'].unique()),
))

resultado de salida

Train:
Total Ratings: 74992
Unique Users: 943
Unique Items: 1649

Test:
Total Ratings: 25008
Unique Users: 943
Unique Items: 1444

2 Modelo SAR de entrenamiento

2.1 Instancia del algoritmo SAR y configuración del índice

        Ejecutaremos SAR en un solo nodo y configuraremos el nombre de columna correspondiente de cada columna de índice en el conjunto de datos (en el uso real, el campo de marca de tiempo se puede ignorar o reservar según la situación específica).

        Para obtener más detalles sobre los parámetros, consulte: cuaderno de inmersión profunda .

logging.basicConfig(level=logging.DEBUG, 
                    format='%(asctime)s %(levelname)-8s %(message)s')

model = SAR(
    col_user="userID",
    col_item="itemID",
    col_rating="rating",
    col_timestamp="timestamp",
    similarity_type="jaccard", 
    time_decay_coefficient=30, 
    timedecay_formula=True
)
  1. Coeficiente de Jaccard (jaccard ): en el código anterior, el parámetro similarity_type de la función SAR se establece en jaccard , que es el coeficiente de Jaccard, que se puede usar para comparar la similitud de dos conjuntos. El método básico es la relación entre el tamaño de la intersección de los dos conjuntos y el tamaño de la unión. Para obtener más información, consulte: Enciclopedia de Baidu - Coeficiente de Jaccard.

2.2 Entrene el modelo SAR a través del conjunto de entrenamiento y obtenga resultados de prueba top-k de nuestro conjunto de prueba

        SAR primero calcula la matriz de co-ocurrencia elemento-elemento (matriz de co-ocurrencia) , donde los elementos representan los registros donde dos elementos co-ocurren en los registros de calificación de cualquier usuario. Después de eso, podemos cambiar la escala de la matriz de co-ocurrencia por alguna medida para calcular la matriz de similitud de elementos (en el código a continuación, el coeficiente de Jaccard se usa como la medida de similitud).

        También podemos obtener la correlación usuario-elemento **(1)** a través de una matriz de preferencia . La semejanza está determinada por eventos de diferentes tipos y momentos (como la calificación de un usuario de una película o si la vieron).

        Al multiplicar la matriz de preferencia A con la matriz de similitud S , podemos obtener una matriz de puntuación de predicción (matriz de valores recomendados) R. Posteriormente, podemos obtener los resultados top-k más recomendados de cada usuario a través de la funciónrecomend_k_items en el siguiente código de caso.

        Desde aquí podemos encontrar una introducción completa al algoritmo SAR: https://github.com/microsoft/recommenders/blob/de3782cce370a446e14e6b47e87686867fb7e069/notebooks/02_model/sar_deep_dive.ipynb

  1. Según tengo entendido, esta matriz de asociación es la matriz de evaluación . A diferencia del conjunto de datos, la matriz de asociación utiliza filas-columnas para representar usuarios-elementos.
with Timer() as train_time:
    model.fit(train)

print("Took {} seconds for training.".format(train_time.interval))

Resultados de la

2020-02-18 20:55:32,377 INFO     Collecting user affinity matrix
2020-02-18 20:55:32,392 INFO     Calculating time-decayed affinities
2020-02-18 20:55:32,463 INFO     Creating index columns
2020-02-18 20:55:32,587 INFO     Building user affinity sparse matrix
2020-02-18 20:55:32,595 INFO     Calculating item co-occurrence
2020-02-18 20:55:32,788 INFO     Calculating item similarity
2020-02-18 20:55:32,789 INFO     Using jaccard based similarity
2020-02-18 20:55:32,891 INFO     Done training

Took 0.5264033849998668 seconds for training.
with Timer() as test_time:
    top_k = model.recommend_k_items(test, remove_seen=True)

print("Took {} seconds for prediction.".format(test_time.interval))

Resultados de la

2020-02-18 20:55:35,758 INFO     Calculating recommendation scores
2020-02-18 20:55:35,851 INFO     Removing seen items

Took 0.14565897600004973 seconds for prediction.
top_k.head()

Resultados de la

ID de usuario Identificación del artículo predicción
0 1 204 3.313306
1 1 89 3.280465
2 1 11 3.233867
3 1 367 3.192575
4 1 423 3.131517

2.3 Evaluación del desempeño SAR

        Usamos el módulo reco_utils.python_e Evaluation para evaluar el desempeño de SAR a partir de algunos indicadores comunes, que incluyen: precisión promedio (MAP), ganancia acumulada descontada normalizada (NDCG), precisión y top-k de cada usuario que calculamos con SAR Recuperación de elementos ( 1 ) . Cada método de puntuación debe especificar la identificación de usuario específica, la identificación del elemento y el nombre de la columna de la calificación en el conjunto de datos.

  1. Tenga en cuenta que hay una diferencia entre Precisión y Exactitud.
eval_map = map_at_k(test, top_k, col_user='userID', col_item='itemID', col_rating='rating', k=TOP_K)
eval_ndcg = ndcg_at_k(test, top_k, col_user='userID', col_item='itemID', col_rating='rating', k=TOP_K)
eval_precision = precision_at_k(test, top_k, col_user='userID', col_item='itemID', col_rating='rating', k=TOP_K)
eval_recall = recall_at_k(test, top_k, col_user='userID', col_item='itemID', col_rating='rating', k=TOP_K)

print("Model:\t",
      "Top K:\t%d" % TOP_K,
      "MAP:\t%f" % eval_map,
      "NDCG:\t%f" % eval_ndcg,
      "Precision@K:\t%f" % eval_precision,
      "Recall@K:\t%f" % eval_recall, sep='\n')

Resultados de la

Model:	
Top K:	10
MAP:	0.110591
NDCG:	0.382461
Precision@K:	0.330753
Recall@K:	0.176385
# Now let's look at the results for a specific user
user_id = 876

ground_truth = test[test['userID']==user_id].sort_values(by='rating', ascending=False)[:TOP_K]
prediction = model.recommend_k_items(pd.DataFrame(dict(userID=[user_id])), remove_seen=True) 
pd.merge(ground_truth, prediction, on=['userID', 'itemID'], how='left')

Resultados de la

2020-02-18 20:55:40,935 INFO     Calculating recommendation scores
2020-02-18 20:55:40,951 INFO     Removing seen items
ID de usuario Identificación del artículo clasificación marca de tiempo predicción
0 876 523 5.0 879428378 Yaya
1 876 529 4.0 879428451 Yaya
2 876 174 4.0 879428378 0.353567
3 876 276 4.0 879428354 Yaya
4 876 288 3.0 879428101 Yaya

        Arriba, podemos ver que se ajustó el elemento con la puntuación más alta en el conjunto de prueba recomendado por el modelo top-k, mientras que otros elementos permanecieron sin cambios. La evaluación de algoritmos fuera de línea es difícil porque en este punto el conjunto de prueba solo contiene registros históricos y no puede representar las preferencias reales de los usuarios en el rango de todos los elementos. Para este problema, también podemos optimizar mediante otros algoritmos (1) o utilizando hiperparámetros (2) .

  1. En aplicaciones prácticas, la mayoría de ellos son sistemas de recomendación híbridos e integrados, como UserCF + ItemCF, ItemCF + Content-based o algunos otros métodos de optimización únicos. Esta parte se describe en detalle en el "Sistema de recomendación" de Aggarwal.
  2. hiperparámetros: Es el concepto de aprendizaje automático (ML, Machine Learning) .En ML, los parámetros que se han establecido se denominan hiperparámetros. Según mi entendimiento personal, lo que el texto original aquí quiere decir es optimizar continuamente el modelo a través del aprendizaje automático en datos incrementales.

Supongo que te gusta

Origin blog.csdn.net/qq_23937195/article/details/104387486
Recomendado
Clasificación