Spark ALS : 신규 사용자에게 권장


10

질문

Spark 교육을받은 ALS 모델에서 신규 사용자의 등급을 어떻게 예측합니까? (신규 = 훈련 시간 동안 보이지 않음)

문제

공식 Spark ALS 튜토리얼을 따르고 있습니다.

http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html

괜찮은 MSE로 좋은 추천자를 만들 수는 있지만 모델에 새 데이터를 입력하는 방법에 어려움을 겪고 있습니다. 튜토리얼은 교육 전에 첫 번째 사용자의 등급을 변경하지만 이것은 실제로 해킹입니다. 그들은 다음과 같은 힌트를줍니다.

9.2. 매트릭스 요소 보강 :

이 튜토리얼에서는 평가를 훈련 세트에 추가합니다. 권장 사항을 얻는 더 좋은 방법은 먼저 행렬 분해 모델을 학습 한 다음 등급을 사용하여 모델을 보강하는 것입니다. 이것이 흥미 롭다면 MatrixFactorizationModel의 구현을 살펴보고 새로운 사용자와 새로운 영화를 위해 모델을 업데이트하는 방법을 볼 수 있습니다.

구현은 전혀 도움이되지 않습니다. 이상적으로는 다음과 같은 것을 찾고 있습니다.

predictions = model.predictAllNew(newinput)

그러나 그러한 방법은 존재하지 않습니다. 원래 RDD로 가서 수정할 수는 있지만 모델을 재교육해야하므로 이상적인 솔루션이 아닙니다. 더 우아한 방법이 있어야합니까?

내가 지금있는 곳 :

새 벡터의 잠재 표현을 찾아야한다고 생각합니다. 원본 논문 에 따르면 다음과 같이 계산할 수 있습니다.

엑스=(와이와이+λ나는)1와이()

그러나 종이의 값을 사용하여 계산할 때 모델의 값과 일치하지 않습니다. 알파와 정규화 매개 변수를 수정했지만 MLLIB 함침에는 다른 구현 이 있다고 생각합니다 . 여기에 정의되어 있지만 (1304 행 참조) Scala에서 능숙하지는 않습니다.

내 현재 시도 :

V = model.productFeatures().map(lambda x: (x[1])).collect() #product latent matrix Y

Cui =  alpha * np.abs(newinput)
Cui =  (1. + Cui) / (Cui)
Cui[np.where(newinput == 0)] = 0
Cui = np.diag(Cui)

lambdaI = len(np.where(newinput!=0)) * regularization_parameter * np.eye(np.shape(V)[1]) #
term   = np.dot(np.dot(Vt,Cui),V)+lambdaI
term   = np.dot(np.linalg.inv(term),Vt)
term   = np.dot(term,Cui)
term   = np.dot(term,newinput)
latentinput = term

그러나 이것은 일치하지 않습니다.

답변:


9

여기에 많은 질문이 있습니다. 첫째, 데이터가없는 새로운 사용자에게는 추천 모델을 사용할 수있는 방법이 없습니다. 말 그대로 사용자에 대한 정보가 없으면 할 수있는 유일한 방법은 몇 가지 기본 권장 사항을 제공하는 것입니다.

당신이 어떤 데이터를 가지고, 일단 물론, 그리고 당신이 사용자를 통합하는 모델을 재 구축 할 수 있습니다, 당신은 권고를 할 수 있습니다. Spark에서 그렇게 할 수 있지만 이미 알고 있습니다. 런타임시 새 사용자에 대한 정보를 추가해야하는 경우 시간이 너무 오래 걸립니다. 원하는 기술을 "폴더 인 (fold-in)"이라고하며, 사용자가 상호 작용하는 항목이있을 때 새로운 사용자 벡터가 무엇인지 파악하는 데 사용됩니다. 그것은 단지 선형 대수이고 당신이주는 방정식을 따릅니다.

나는 도움이 될만한 오래된 슬라이드를 파헤 쳤다.

ALS 폴드 인

"Cu"는 실제로 다르지 않습니다. 음수 입력의 경우를 처리하기 위해 '확장자'를 추가했지만 양수 입력과 동일합니다.

fold-in의 구현은 다음과 같습니다.하지만 너무 가치가 높으면 밀도가 높아질 것입니다.

https://github.com/OryxProject/oryx/blob/2c01d496f93f2825a076eb7fe492aa39a5290aa6/app/oryx-app-common/src/main/java/com/cloudera/oryx/app/als/ALSUtils.java#L74

사용자-항목 상호 작용에 의해 암시 된 새로운 사용자 벡터를 계산하는 것은 선형 선형 대수입니다. 내가 찾은 까다로운 부분은 무게를 얼마나 감쌀 지 결정하는 것입니다.

그것이 올바른 방향으로 추진되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.