Spark ALS: merekomendasikan untuk pengguna baru

10

Pertanyaan

Bagaimana cara memprediksi peringkat untuk pengguna baru dalam model ALS yang dilatih di Spark? (Baru = tidak terlihat selama waktu pelatihan)

Masalah

Saya mengikuti tutorial resmi Spark ALS di sini:

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

Saya dapat membangun pemberi rekomendasi yang baik dengan MSE yang layak tetapi saya berjuang dengan cara memasukkan data baru ke model. Tutorial mengubah peringkat pengguna pertama sebelum pelatihan, tetapi ini benar-benar hack. Mereka memberikan petunjuk berikut:

9.2. Faktor matriks augmentasi:

Dalam tutorial ini, kami menambahkan peringkat Anda ke set pelatihan. Cara yang lebih baik untuk mendapatkan rekomendasi untuk Anda adalah melatih model faktorisasi matriks terlebih dahulu dan kemudian menambah model menggunakan peringkat Anda. Jika ini terdengar menarik bagi Anda, Anda dapat melihat implementasi MatrixFactorizationModel dan melihat cara memperbarui model untuk pengguna baru dan film baru.

Implementasinya tidak membantu saya sama sekali. Idealnya, saya mencari sesuatu seperti:

predictions = model.predictAllNew(newinput)

Tetapi tidak ada metode seperti itu. Saya bisa pergi dan memodifikasi RDD yang asli, tetapi saya pikir itu akan mengharuskan saya untuk melatih ulang model, sehingga tidak akan menjadi solusi yang ideal juga. Tentunya harus ada cara yang lebih elegan?

Di mana saya sekarang:

Saya pikir saya perlu menemukan representasi laten dari vektor baru. Menurut kertas asli kita dapat menghitung seperti ini:

Xu=(YTCuY+λI)1YTCup(u)

Cu

Upaya saya saat ini:

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

Tapi ini tidak cocok.

ciri
sumber

Jawaban:

9

Banyak pertanyaan di sini. Pertama, untuk pengguna yang benar-benar baru tanpa data, tidak ada cara untuk menggunakan model pemberi rekomendasi. Jika Anda benar-benar tidak memiliki informasi tentang pengguna, satu-satunya hal yang dapat Anda lakukan adalah memberikan beberapa rekomendasi standar.

Tentu saja, setelah Anda memiliki data apa pun, dan Anda dapat membangun kembali model untuk memasukkan pengguna, Anda dapat membuat rekomendasi. Anda dapat melakukannya di Spark tetapi Anda sudah tahu itu. Ini akan memakan waktu terlalu lama jika Anda perlu menambahkan informasi tentang pengguna baru saat runtime. Teknik yang Anda inginkan disebut "fold-in", digunakan untuk mencari tahu apa vektor pengguna baru (kurang-lebih) mengingat item yang berinteraksi dengan pengguna. Itu hanya beberapa aljabar linier dan tidak mengikuti dari persamaan yang Anda berikan.

Saya menggali slide lama yang mungkin bisa membantu:

ALS Lipat

"Cu" tidak terlalu berbeda. Saya menambahkan 'ekstensi' untuk menangani kasus input negatif, tetapi sama untuk input positif.

Berikut ini adalah implementasi dari fold-in, meskipun saya pikir ini akan menjadi terlalu padat untuk menjadi bernilai:

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

Menghitung vektor pengguna baru yang tersirat oleh interaksi barang-pengguna adalah aljabar linier yang cukup mudah. Bagian rumit yang saya temukan adalah memutuskan berapa banyak untuk membobotnya.

Harapan itu adalah dorongan ke arah yang benar.

Sean Owen
sumber