Introdução ao Million Songs Dataset

Construindo mecanismos de recomendação com PySpark

Jamen Long

Data Scientist at Nike

Explícitas vs implícitas

Avaliações explícitas joinha positivo/negativo, 4 de 5 estrelas, escala de pontos coloridos do pior ao melhor

Construindo mecanismos de recomendação com PySpark

Explícitas vs implícitas (cont.)

Avaliações explícitas joinha positivo/negativo, 4 de 5 estrelas, escala de pontos coloridos do pior ao melhor

Avaliações implícitas joinha positivo/negativo, 4 de 5 estrelas, escala de pontos coloridos do pior ao melhor

Construindo mecanismos de recomendação com PySpark

Revisão de implícitas II

Avaliações explícitas joinha positivo/negativo, 4 de 5 estrelas, escala de pontos coloridos do pior ao melhor

Avaliações implícitas joinha positivo/negativo, 4 de 5 estrelas, escala de pontos coloridos do pior ao melhor referência ao white paper

Construindo mecanismos de recomendação com PySpark

Introdução ao Million Songs Dataset

Thierry Bertin-Mahieux, Daniel P.W. Ellis, Brian Whitman e Paul Lamere. The Million Song Dataset. Nos Anais da 12th International Society for Music Information Retrieval Conference (SIMIR 20122), 2011.

Construindo mecanismos de recomendação com PySpark

Adicionar amostra com zeros

ratings.show()
+------+------+---------+
|userId|songId|num_plays|
+------+------+---------+
|    10|    22|        5|
|    38|    99|        1|
|    38|    77|        3|
|    42|    99|        1|
+------+------+---------+
Construindo mecanismos de recomendação com PySpark

Introdução ao cross join

users = ratings.select("userId").distinct()
users.show()
+------+
|userId|
+------+
|    10|
|    38|
|    42|
+------+
songs = ratings.select("songId").distinct()
songs.show()
+------+
|songId|
+------+
|    22|
|    77|
|    99|
+------+
Construindo mecanismos de recomendação com PySpark

Saída do cross join

cross_join = users.crossJoin(songs)
cross_join.show()
+------+------+
|userId|songId|
+------+------+
|    10|    22|
|    10|    77|
|    10|    99|
|    38|    22|
|    38|    77|
|    38|    99|
|    42|    22|
|    42|    77|
|    42|    99|
+------+------+
Construindo mecanismos de recomendação com PySpark

Reunindo os dados originais de avaliações

cross_join = users.crossJoin(songs)
                  .join(ratings, ["userId", "songId"], "left")
cross_join.show()
+------+------+---------+
|userId|songId|num_plays|
+------+------+---------+
|    10|    22|        5|
|    10|    77|     null|
|    10|    99|     null|
|    38|    22|     null|
|    38|    77|        3|
|    38|    99|        1|
|    42|    22|     null|
|    42|    77|     null|
|    42|    99|        1|
+------+------+---------+
Construindo mecanismos de recomendação com PySpark

Preenchendo com zero

cross_join = users.crossJoin(songs)
                  .join(ratings, ["userId", "songId"], "left").fillna(0)
cross_join.show()
+------+------+---------+
|userId|songId|num_plays|
+------+------+---------+
|    10|    22|        5|
|    10|    77|        0|
|    10|    99|        0|
|    38|    22|        0|
|    38|    77|        3|
|    38|    99|        1|
|    42|    22|        0|
|    42|    77|        0|
|    42|    99|        1|
+------+------+---------+
Construindo mecanismos de recomendação com PySpark

Função para adicionar zeros

def add_zeros(df):
    # Extrai usuários distintos
    users = df.select("userId").distinct() 

    # Extrai músicas distintas
    songs = df.select("songId").distinct() 

    # Faz o join de usuários e músicas e preenche vazios com 0
    cross_join = users.crossJoin(items) \ 
                .join(df, ["userId", "songId"], "left").fillna(0)

    return cross_join
Construindo mecanismos de recomendação com PySpark

Vamos praticar!

Construindo mecanismos de recomendação com PySpark

Preparing Video For Download...