Million Songs Dataset 簡介

使用 PySpark 打造推薦引擎

Jamen Long

Data Scientist at Nike

顯性 vs 隱性

顯性評分 讚/倒讚、5 顆星中的 4 顆、由差到佳的彩色圓點刻度

使用 PySpark 打造推薦引擎

顯性 vs 隱性(續)

顯性評分 讚/倒讚、5 顆星中的 4 顆、由差到佳的彩色圓點刻度

隱性評分 讚/倒讚、5 顆星中的 4 顆、由差到佳的彩色圓點刻度

使用 PySpark 打造推薦引擎

隱性回顧 II

顯性評分 讚/倒讚、5 顆星中的 4 顆、由差到佳的彩色圓點刻度

隱性評分 讚/倒讚、5 顆星中的 4 顆、由差到佳的彩色圓點刻度 白皮書參考

使用 PySpark 打造推薦引擎

Million Songs Dataset 簡介

Thierry Bertin-Mahieux、Daniel P.W. Ellis、Brian Whitman、Paul Lamere。 The Million Song Dataset。見第 12 屆 International Society for Music Information Retrieval Conference(SIMIR 20122)論文集,2011 年。

使用 PySpark 打造推薦引擎

加入零值範例

ratings.show()
+------+------+---------+
|userId|songId|num_plays|
+------+------+---------+
|    10|    22|        5|
|    38|    99|        1|
|    38|    77|        3|
|    42|    99|        1|
+------+------+---------+
使用 PySpark 打造推薦引擎

Cross join 概念

users = ratings.select("userId").distinct()
users.show()
+------+
|userId|
+------+
|    10|
|    38|
|    42|
+------+
songs = ratings.select("songId").distinct()
songs.show()
+------+
|songId|
+------+
|    22|
|    77|
|    99|
+------+
使用 PySpark 打造推薦引擎

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|
+------+------+
使用 PySpark 打造推薦引擎

接回原始評分資料

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|
+------+------+---------+
使用 PySpark 打造推薦引擎

以 0 補齊

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|
+------+------+---------+
使用 PySpark 打造推薦引擎

加入零值函式

def add_zeros(df):
    # 取出不同的使用者
    users = df.select("userId").distinct() 

    # 取出不同的歌曲
    songs = df.select("songId").distinct() 

    # 將使用者與歌曲交叉連接,空值以 0 補齊
    cross_join = users.crossJoin(items) \ 
                .join(df, ["userId", "songId"], "left").fillna(0)

    return cross_join
使用 PySpark 打造推薦引擎

一起來練習吧!

使用 PySpark 打造推薦引擎

Preparing Video For Download...