2017-01-10 10 views
7

私はモデルをバッチ処理するプロセス間の評価を予測しています。予測評価があまりにも高いように見えるしかしその後...ALSモデル - 予測full_u * v^t * vの評価が非常に高い

import json 
import numpy as np 

pf = model.productFeatures() 

pf_vals = pf.sortByKey().values().collect() 
pf_keys = pf.sortByKey().keys().collect() 

Vt = np.matrix(np.asarray(pf_vals)) 

full_u = np.zeros(len(pf_keys)) 

def set_rating(pf_keys, full_u, key, val): 
    try: 
     idx = pf_keys.index(key) 
     full_u.itemset(idx, val) 
    except: 
     pass 

set_rating(pf_keys, full_u, 260, 9), # Star Wars (1977) 
set_rating(pf_keys, full_u, 1, 8), # Toy Story (1995) 
set_rating(pf_keys, full_u, 16, 7), # Casino (1995) 
set_rating(pf_keys, full_u, 25, 8), # Leaving Las Vegas (1995) 
set_rating(pf_keys, full_u, 32, 9), # Twelve Monkeys (a.k.a. 12 Monkeys) (1995) 
set_rating(pf_keys, full_u, 335, 4), # Flintstones, The (1994) 
set_rating(pf_keys, full_u, 379, 3), # Timecop (1994) 
set_rating(pf_keys, full_u, 296, 7), # Pulp Fiction (1994) 
set_rating(pf_keys, full_u, 858, 10), # Godfather, The (1972) 
set_rating(pf_keys, full_u, 50, 8) # Usual Suspects, The (1995) 

recommendations = full_u*Vt*Vt.T 

top_ten_ratings = list(np.sort(recommendations)[:,-10:].flat) 

print("predicted rating value", top_ten_ratings) 

top_ten_recommended_product_ids = np.where(recommendations >= np.sort(recommendations)[:,-10:].min())[1] 
top_ten_recommended_product_ids = list(np.array(top_ten_recommended_product_ids)) 

print("predict rating prod_id", top_ten_recommended_product_ids) 

を、製品の特徴を抽出ALS model - how to generate full_u * v^t * v?

! rm -rf ml-1m.zip ml-1m 
! wget --quiet http://files.grouplens.org/datasets/movielens/ml-1m.zip 
! unzip ml-1m.zip 
! mv ml-1m/ratings.dat . 

from pyspark.mllib.recommendation import Rating 

ratingsRDD = sc.textFile('ratings.dat') \ 
       .map(lambda l: l.split("::")) \ 
       .map(lambda p: Rating(
            user = int(p[0]), 
            product = int(p[1]), 
            rating = float(p[2]), 
           )).cache() 

from pyspark.mllib.recommendation import ALS 

rank = 50 
numIterations = 20 
lambdaParam = 0.1 
model = ALS.train(ratingsRDD, rank, numIterations, lambdaParam) 

:私はここで説明するアプローチを使用してい

('predicted rating value', [313.67320347694897, 315.30874327316576, 317.1563289268388, 317.45475214423948, 318.19788673744563, 319.93044594688428, 323.92448427140653, 324.12553531632761, 325.41052886977582, 327.12199687047649]) 
('predict rating prod_id', [49, 287, 309, 558, 744, 802, 1839, 2117, 2698, 3111]) 

これが表示されます間違っている。任意のヒントをいただきました。

+1

私はこれを使用して良い結果を得ましたが、これは暗黙のフィードバックであり、評価は負または不明の場合は0、正の場合は1でした。私は0と1の間の予測を得ました。そして、私はランクを指標として使用していました。つまり、スコアにあまり注意を払っていませんでした。 –

+0

ああ、興味深い。私はまだ暗黙のフィードバックを調べていない。あなたが答えとしてあなたのコメントを投稿すると、他に誰も答えなければデフォルトで賞金を得るでしょう;) –

+0

@ yoh.lejなぜ、私はクリスのような膨らんだ評価を得ていたのですか?だから、評価はバイナリです。ヨハン、この式が何に基づいているのか簡単に説明できますか?私は類似性測定のためのグーグルを試みて、それを見ていない。類似点は何を計算していますか?私は現在線形代数クラスを取っているので興味をそそられています。論理的には、この新しいユーザーが最も類似している既存のユーザーを判断し、評価を予測するためにその要素を使用するように思われる - このアプローチはより洗練されていますか?ありがとう! (クリス - ALSをチェックしてください。trainImplicit) – ScottEdwards2000

答えて

5

あなたが映画のランキングだけを気にするなら、言及されたアプローチはうまくいくと思います。実際の評価を取得したい場合は、用語の次元/スケーリングの何かがあるようです。

ここでの考え方は、新しいユーザーの潜在的な表現を推測することです。通常、因数分解のユーザuser iの潜在的な表現はu_i(i番目の行はmodel.userFeatures())であり、model.predictを使って与えられた映画(映画j)の評価はu_iの潜在的表現で基本的に掛けます製品v_j。あなたがv:u_i*v全体を掛け合わせると、すべての予測評価を一度に得ることができます。

新しいユーザーの場合、潜在的な表現は何ですか?u_newfull_u_newです。 基本的には、潜在的な製品要因のそれぞれに対して新しいユーザーの親和性を表す50の係数が必要です。 簡潔にするため、私の暗黙的なフィードバックの使用例では十分だったので、私は単純にドットプロダクトを使って、基本的に新しいユーザーをプロダクト潜在的な要素に投影しました:full_u_new*V^tは50係数を、coeffは新しいユーザーの見た目製品潜在因子i。暗黙的なフィードバックでは特にうまく機能します。 だから、ドットプロダクトを使用すると、それが表示されますが、スケーリングされず、見ている高い得点が説明されます。あなたは私はあなたが彼らがしたように、コサイン類似度を使用すると、[ここ] https://github.com/apache/incubator-predictionio/blob/release/0.10.0/examples/scala-parallel-recommendation/custom-query/src/main/scala/ALSAlgorithm.scala

コメントで@ ScottEdwards2000で述べたアプローチがあまりにも面白いと得ることができると考えるのではなく、u_newをより正確にスケールする必要が使用可能なスコアを取得するために 異なる。実際には、トレーニングセットで最も類似したユーザーを探すことができます。複数ある場合は、平均を得ることができます。私はそれがあまりにもひどくなるとは思わないが、それは本当に異なるアプローチであり、(最も似たユーザーを見つけるために)完全な評価マトリックスが必要です。近いユーザーを1人取得することは、スケーリングの問題を確実に解決するはずです。あなたが両方のアプローチ作業を行うことができれば、結果を比較することができます!

関連する問題