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