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を変更することもできますが、モデルを再トレーニングする必要があるため、それも理想的なソリューションではありません。きっともっとエレガントな方法があるに違いない?

私が今いるところ:

新しいベクトルの潜在的な表現を見つける必要があると思います。元の論文によると、次のように計算できます。

バツあなた=YTCあなたY+λ1YTCあなたpあなた

Cあなた

私の現在の試み:

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でそれを行うことができますが、あなたはすでにそれを知っています。実行時に新しいユーザーに関する情報を追加する必要がある場合、これには時間がかかりすぎます。必要な手法は「フォールドイン」と呼ばれ、ユーザーが操作するアイテムが与えられたときに、新しいユーザーベクトルが(およそ)何であるかを把握するために使用されます。それは単なる線形代数であり、あなたが与える方程式から従います。

私は役立つかもしれない古いスライドを掘り出しました:

ALSフォールドイン

"Cu"は実際には違いはありません。負の入力の場合を処理するために「拡張」を追加しましたが、正の入力の場合も同じです。

以下はフォールドインの実装ですが、密度が高すぎてあまり価値がないと思います。

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.