협업 필터링 소개

PySpark로 배우는 빅데이터 기초

Upendra Devisetty

Science Analyst, CyVerse

협업 필터링이란?

  • 협업 필터링은 공통 관심사를 가진 사용자를 찾습니다

  • 추천 시스템에 흔히 사용됩니다

  • 협업 필터링 방식:

    • 사용자-사용자 협업 필터링: 대상 사용자와 유사한 사용자를 찾습니다

    • 아이템-아이템 협업 필터링: 대상 사용자가 가진 아이템과 유사한 아이템을 찾아 추천합니다

PySpark로 배우는 빅데이터 기초

pyspark.mllib.recommendation의 Rating 클래스

  • Rating 클래스는 (user, product, rating) 튜플을 감싼 래퍼입니다

  • RDD 파싱과 (user, product, rating) 튜플 생성에 유용합니다

from pyspark.mllib.recommendation import Rating 
r = Rating(user = 1, product = 2, rating = 5.0)
(r[0], r[1], r[2])
(1, 2, 5.0)
PySpark로 배우는 빅데이터 기초

randomSplit()으로 데이터 분할

  • 예측 모델 평가를 위해 학습용과 테스트용으로 데이터 분할이 중요합니다

  • 일반적으로 학습 데이터 비중이 더 큽니다

  • PySpark의 randomSplit()은 가중치대로 무작위 분할하여 여러 RDD를 반환합니다

data = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
training, test=data.randomSplit([0.6, 0.4])
training.collect()
test.collect()
[1, 2, 5, 6, 9, 10]
[3, 4, 7, 8]
PySpark로 배우는 빅데이터 기초

ALS(Alternating Least Squares)

  • spark.mllib의 ALS(Alternating Least Squares) 알고리즘은 협업 필터링을 제공합니다

  • ALS.train(ratings, rank, iterations)

r1 = Rating(1, 1, 1.0)
r2 = Rating(1, 2, 2.0)
r3 = Rating(2, 1, 2.0)
ratings = sc.parallelize([r1, r2, r3])
ratings.collect()
[Rating(user=1, product=1, rating=1.0),
 Rating(user=1, product=2, rating=2.0),
 Rating(user=2, product=1, rating=2.0)]
model = ALS.train(ratings, rank=10, iterations=10)
PySpark로 배우는 빅데이터 기초

predictAll()

  • predictAll()은 사용자-아이템 쌍에 대한 예측 평점 목록을 반환합니다

  • 평점이 없는 RDD를 입력으로 받아 평점을 생성합니다

unrated_RDD = sc.parallelize([(1, 2), (1, 1)])
predictions = model.predictAll(unrated_RDD)
predictions.collect()
[Rating(user=1, product=1, rating=1.0000278574351853),
 Rating(user=1, product=2, rating=1.9890355703778122)]
PySpark로 배우는 빅데이터 기초

모델 평가

rates = ratings.map(lambda x: ((x[0], x[1]), x[2]))
rates.collect()
[((1, 1), 1.0), ((1, 2), 2.0), ((2, 1), 2.0)]
preds = predictions.map(lambda x: ((x[0], x[1]), x[2]))
preds.collect()

[((1, 1), 1.000027857), ((1, 2), 1.9890355703)]
rates_preds = rates.join(preds)
rates_preds.collect()
[((1, 2), (2.0, 1.9890355703)), ((1, 1), (1.0, 1.000027857))]

MSE는 (실제 평점 - 예측 평점) 제곱의 평균입니다.

MSE = rates_preds.map(lambda r: (r[1][0] - r[1][1])**2).mean()
PySpark로 배우는 빅데이터 기초

연습해 봅시다!

PySpark로 배우는 빅데이터 기초

Preparing Video For Download...