Introduction au Million Song Dataset

Créer des moteurs de recommandation avec PySpark

Jamen Long

Data Scientist at Nike

Explicite vs implicite

Évaluations explicites pouce en l'air/pouce en bas, 4 étoiles sur 5, échelle de points colorés du pire au meilleur

Créer des moteurs de recommandation avec PySpark

Explicite vs implicite (suite)

Évaluations explicites pouce en l'air/pouce en bas, 4 étoiles sur 5, échelle de points colorés du pire au meilleur

Évaluations implicites pouce en l'air/pouce en bas, 4 étoiles sur 5, échelle de points colorés du pire au meilleur

Créer des moteurs de recommandation avec PySpark

Rappel : implicite II

Évaluations explicites pouce en l'air/pouce en bas, 4 étoiles sur 5, échelle de points colorés du pire au meilleur

Évaluations implicites pouce en l'air/pouce en bas, 4 étoiles sur 5, échelle de points colorés du pire au meilleur référence à un livre blanc

Créer des moteurs de recommandation avec PySpark

Introduction au Million Song Dataset

Thierry Bertin-Mahieux, Daniel P.W. Ellis, Brian Whitman et Paul Lamere. The Million Song Dataset. Dans les actes de la 12e conférence de l'International Society for Music Information Retrieval (SIMIR 20122), 2011.

Créer des moteurs de recommandation avec PySpark

Ajouter des zéros : échantillon

ratings.show()
+------+------+---------+
|userId|songId|num_plays|
+------+------+---------+
|    10|    22|        5|
|    38|    99|        1|
|    38|    77|        3|
|    42|    99|        1|
+------+------+---------+
Créer des moteurs de recommandation avec PySpark

Introduction au produit cartésien

users = ratings.select("userId").distinct()
users.show()
+------+
|userId|
+------+
|    10|
|    38|
|    42|
+------+
songs = ratings.select("songId").distinct()
songs.show()
+------+
|songId|
+------+
|    22|
|    77|
|    99|
+------+
Créer des moteurs de recommandation avec PySpark

Résultat du produit cartésien

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|
+------+------+
Créer des moteurs de recommandation avec PySpark

Rejoindre les évaluations d'origine

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|
+------+------+---------+
Créer des moteurs de recommandation avec PySpark

Remplir avec des zéros

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|
+------+------+---------+
Créer des moteurs de recommandation avec PySpark

Fonction d'ajout de zéros

def add_zeros(df):
    # Extracts distinct users
    users = df.select("userId").distinct() 

    # Extracts distinct songs
    songs = df.select("songId").distinct() 

    # Joins users and songs, fills blanks with 0
    cross_join = users.crossJoin(items) \ 
                .join(df, ["userId", "songId"], "left").fillna(0)

    return cross_join
Créer des moteurs de recommandation avec PySpark

Passons à la pratique !

Créer des moteurs de recommandation avec PySpark

Preparing Video For Download...