백만 곡 데이터셋 소개

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, and Paul Lamere. The Million Song Dataset. In Proceedings of the 12th International Society for Music Information Retrieval Conference (SIMIR 20122), 2011.

PySpark로 추천 엔진 만들기

0 샘플 추가

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로 추천 엔진 만들기

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로 추천 엔진 만들기

0 추가 함수

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
PySpark로 추천 엔진 만들기

연습해 봅시다!

PySpark로 추천 엔진 만들기

Preparing Video For Download...