百万歌曲数据集简介

使用 PySpark 构建推荐引擎

Jamen Long

Data Scientist at Nike

显式 vs 隐式

显式评分 大拇指赞/踩、5星中的4星、由差到优的彩色点刻度

使用 PySpark 构建推荐引擎

显式 vs 隐式(续)

显式评分 大拇指赞/踩、5星中的4星、由差到优的彩色点刻度

隐式评分 大拇指赞/踩、5星中的4星、由差到优的彩色点刻度

使用 PySpark 构建推荐引擎

隐式回顾 II

显式评分 大拇指赞/踩、5星中的4星、由差到优的彩色点刻度

隐式评分 大拇指赞/踩、5星中的4星、由差到优的彩色点刻度 白皮书参考

使用 PySpark 构建推荐引擎

百万歌曲数据集简介

Thierry Bertin-Mahieux、Daniel P.W. Ellis、Brian Whitman 和 Paul Lamere。 The Million Song Dataset。见第12届国际音乐信息检索学会会议(ISMIR 2011)论文集,2011年。

使用 PySpark 构建推荐引擎

添加零样本

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

交叉连接简介

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 = 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 构建推荐引擎

用零填充

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...