Spark ALS: yeni kullanıcılar için tavsiye


10

Soru

Spark'da eğitilmiş bir ALS modelinde yeni bir kullanıcının derecelendirmesini nasıl tahmin edebilirim? (Yeni = eğitim süresi boyunca görülmez)

Sorun

Burada resmi Spark ALS eğitimini takip ediyorum:

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

İyi bir MSE ile iyi bir danışman oluşturabilirim, ancak modele yeni verilerin nasıl girileceği ile mücadele ediyorum. Eğitici, eğitimden önce ilk kullanıcının derecelendirmelerini değiştirir, ancak bu gerçekten bir hack'tir. Aşağıdaki ipucunu veriyorlar:

9.2. Artırıcı matris faktörleri:

Bu eğitimde, değerlendirmelerinizi eğitim setine ekliyoruz. Sizin için önerileri almanın daha iyi bir yolu, önce bir matris çarpanlara ayırma modeli eğitmek ve ardından derecelendirmelerinizi kullanarak modeli güçlendirmektir. Bu size ilginç geliyorsa, MatrixFactorizationModel uygulamasına bakabilir ve yeni kullanıcılar ve yeni filmler için modelin nasıl güncelleneceğini görebilirsiniz.

Uygulama bana hiç yardımcı olmuyor. İdeal olarak, şöyle bir şey arıyorum:

predictions = model.predictAllNew(newinput)

Ancak böyle bir yöntem mevcut değildir. Orijinal RDD'yi değiştirebilirim, ancak bunun modeli yeniden eğitmemi gerektireceğini düşünüyorum, bu da ideal bir çözüm olmayacaktı. Elbette daha zarif bir yol olmalı mı?

Şu anda neredeyim:

Yeni vektörün gizli temsilini bulmam gerektiğini düşünüyorum. Orijinal makaleye göre bunu şu şekilde hesaplayabiliriz:

Xu=(YTCuY+λben)-1YTCup(u)

Cu

Şu anki girişimim:

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

Ama bu uyuşmuyor.

Yanıtlar:


9

Burada bir sürü soru var. İlk olarak, veri içermeyen gerçekten yeni bir kullanıcı için, tavsiye modelini kullanmanın bir yolu yoktur. Kullanıcı hakkında hiçbir bilginiz yoksa, yapabileceğiniz tek şey bazı varsayılan öneriler sunmaktır.

Eğer herhangi bir veriye sahip, bir kez Tabii ki, ve kullanıcıyı dahil etmek modelini yeniden oluşturabilirsiniz önerilerde bulunabilir. Bunu Spark'da yapabilirsiniz ama bunu zaten biliyorsunuz. Çalışma zamanında yeni kullanıcılar hakkında bilgi eklemeniz gerekirse bu işlem çok uzun sürecektir. İstediğiniz tekniğe, kullanıcının etkileşimde bulunduğu öğeler göz önüne alındığında (yaklaşık olarak) yeni kullanıcı vektörünün ne olduğunu bulmak için kullanılan "katlama" adı verilir. Bu sadece bir miktar doğrusal cebirdir ve verdiğiniz denklemi takip eder.

Yardımcı olabilecek eski bir slaytı kazdım:

ALS Katlama

"Cu" gerçekten farklı değil. Negatif giriş durumunu ele almak için bir 'uzantı' ekledim, ancak pozitif giriş için de aynı.

Burada bir katlama uygulaması var, ancak çok değerli olmak için çok yoğun olacağını düşünüyorum:

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

Bir kullanıcı-madde etkileşimi tarafından ima edilen yeni kullanıcı vektörünün hesaplanması oldukça kolay doğrusal cebirdir. Bulduğum zor kısım, ne kadar ağırlık alacağına karar vermektir.

Umarım bu doğru yönde bir itmedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.