Movie推奨システム

7053 ワード

MovieLens推奨システム転載このメモリベースの協同フィルタリングは、ユーザー-製品協同フィルタリングと製品-製品協同フィルタリングの2つの主要な部分に分けることができます.どちらの場合も、データセット全体からユーザー・プロダクト・マトリクスを構築します.データをテストセットとトレーニングセットに分割したので、2つの[943 x 1682]マトリクスを作成する必要があります.トレーニングマトリクスは75%のスコアを含み、テストマトリクスは25%のスコアを含む.
考え方:1.1ユーザー-製品マトリクスを構築した後、類似性を計算し、類似性マトリクスを作成します.1.2. ユーザ−製品協同フィルタリングの場合、ユーザ間の類似性値は、同時に2つのユーザによって採点されたすべての製品を観察することによって測定される.
2.製品-製品協同フィルタリングにおける製品間の類似性値は、2つの製品間のスコアを計算するすべてのユーザを観察することによって測定される.
一般に推奨システムに用いられる距離行列は余弦類似性であり,スコアはn次元空間におけるベクトルと見なされ,類似性はこれらのベクトル間の角度に基づいて計算される.
質問:1、一部のユーザーは、すべての映画に対して、常に高いスコアまたは低いスコアを与える傾向がある可能性があります.これらのユーザが提供するスコアの相対差は、絶対評価値よりも重要である.例を挙げると、ユーザーkは彼の大好きな映画に4つ星を打って、他のすべての良い映画に3つ星を打っていると仮定します.もう一人のユーザtが彼/彼女の好きな映画に5つ星を打って、彼/彼女に退屈な映画に3つ星を打ったと仮定する.では、この2人のユーザーはセンスが似ているかもしれませんが、採点システムを区別します.2、メモリベースのCFの欠点は、実世界のシーンに拡張することができず、よく知られているコールドスタートの問題を解決していないことです.つまり、新しいユーザーや新製品がシステムに入ったときです.モデルベースのCF法は拡張可能であり,メモリベースのモデル処理よりも高い疎度を扱うことができるが,スコアのないユーザや製品がシステムに入った場合も苦痛である.
メモリベースの共同フィルタ完全コード
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics.pairwise import pairwise_distances
from sklearn.metrics import mean_squared_error
from math import sqrt

# 、 
#1、 , 
header = ['user_id', 'item_id', 'rating', 'timestamp']
df = pd.read_csv('ml-100k/u.data', sep='\t', names=header)
n_users = df.user_id.unique().shape[0]
n_items = df.item_id.unique().shape[0]
print('Number of users = ' + str(n_users) + ' | Number of movies = ' + str(n_items))
train_data, test_data = train_test_split(df, test_size=0.25)

# - 。 , , 。
train_data_matrix = np.zeros((n_users, n_items))
for line in train_data.itertuples():
    train_data_matrix[line[1] - 1, line[2] - 1] = line[3]

test_data_matrix = np.zeros((n_users, n_items))
for line in test_data.itertuples():
    test_data_matrix[line[1] - 1, line[2] - 1] = line[3]

#   0-1
user_similarity = pairwise_distances(train_data_matrix, metric='cosine')
item_similarity = pairwise_distances(train_data_matrix.T, metric='cosine')
print(user_similarity)
print(item_similarity)

# CF 
def predict(ratings, similarity, type='user'):
    if type == 'user':
        mean_user_rating = ratings.mean(axis=1)
        # You use np.newaxis so that mean_user_rating has same format as ratings
        ratings_diff = (ratings - mean_user_rating[:, np.newaxis])
        pred = mean_user_rating[:, np.newaxis] + similarity.dot(ratings_diff) / np.array(
            [np.abs(similarity).sum(axis=1)]).T
    elif type == 'item':
        pred = ratings.dot(similarity) / np.array([np.abs(similarity).sum(axis=1)])
    return pred

item_prediction = predict(train_data_matrix, item_similarity, type='item')
user_prediction = predict(train_data_matrix, user_similarity, type='user')
print(item_prediction)
print(user_prediction)


# 
def rmse(prediction, ground_truth):
    prediction = prediction[ground_truth.nonzero()].flatten()
    ground_truth = ground_truth[ground_truth.nonzero()].flatten()
    return sqrt(mean_squared_error(prediction, ground_truth))

print('User-based CF RMSE: ' + str(rmse(user_prediction, test_data_matrix)))
print('Item-based CF RMSE: ' + str(rmse(item_prediction, test_data_matrix)))

モデルベースの協同フィルタリングの利点:モデルベースの協同フィルタリングはマトリックス分解(MF)に基づいており,主に潜変数分解と降次元の監視なし学習法としてより大きな露光が得られている.マトリクス分解は、メモリベースのCFよりも拡張性や疎性に優れた処理が可能な推奨システムとして広く用いる.MFの目標は、既知のスコアからユーザの潜在的な好みと製品の潜在的な属性(スコア特徴を記述する特徴を学習する)を学習し、その後、ユーザと製品の潜在的な特徴のポイント積によって未知のスコアを予測することである.方法:非常に疎な多次元マトリクスがある場合、マトリクス分解を行うことでユーザー-プロダクトマトリクスを低レベルの構造に調整し、2つの低ランクマトリクス(各ローに固有ベクトルが含まれている)の積でマトリクスを表すことができます.低ランクマトリクスを乗算することで、元のマトリクスに欠落したアイテムを埋め、このマトリクスを調整して、できるだけ元のマトリクスに近似します.
例:ユーザと製品の学習隠蔽嗜好は、MovieLensデータセットに以下の情報があると仮定する:(user id,age,location,gender,movie id,director,actor,language,year,rating).マトリックス分解を適用することによって,モデル学習の重要なユーザ特徴は年齢群(10歳以下,10−18歳,18−30歳,30−90歳),位置と性別であり,映画特性については年まで学習し,監督と俳優が最も重要である.今、保存されている情報を見てみると、年のような特性はありませんが、モデルは自分で学ぶことができます.重要な点は,CFモデルが潜在的特徴を学習するためにデータ(user_id,movie_id,rating)のみを使用することである.利用可能なデータが少数しかない場合、モデルベースのCFモードは、潜在的特徴の学習がより困難になるため、不良を予測するであろう.
スコアとコンテンツ特性を同時に使用するモデルをハイブリッド推奨システムと呼び,ここで,協同フィルタリングとコンテンツベースのモデルを結合する.ハイブリッド推奨システムは、通常、共同フィルタリングまたはコンテンツベースのモデル自体よりも高い精度を示します.冷却起動の問題をよりよく解決する能力があります.ユーザーまたは製品のスコアがなければ、ユーザーまたは製品のメタデータを使用してSVDの周知のマトリクス分解方法が奇異値分解(SVD)であることを予測することができます.奇異値分解を用いることにより,協同フィルタリングを1つの行列Xに近似して作成することができる.
#  MovieLens :
sparsity = round(1.0 - len(df) / float(n_users * n_items), 3)
print('The sparsity level of MovieLens100K is ' + str(sparsity * 100) + '%')

#  (SVD)
import scipy.sparse as sp
from scipy.sparse.linalg import svds

# get SVD components from train matrix. Choose k.
u, s, vt = svds(train_data_matrix, k=20)
s_diag_matrix = np.diag(s)
X_pred = np.dot(np.dot(u, s_diag_matrix), vt)

print('User-based CF MSE: ' + str(rmse(X_pred, test_data_matrix)))

コンソール:
Number of users = 943 | Number of movies = 1682
[[0.         0.89836005 0.97986307 ... 0.85458633 0.87920808 0.67340185]
 [0.89836005 0.         0.91582156 ... 0.91960457 0.87277272 0.91170124]
 [0.97986307 0.91582156 0.         ... 0.97600463 0.91078074 1.        ]
 ...
 [0.85458633 0.91960457 0.97600463 ... 0.         0.97246425 0.94329862]
 [0.87920808 0.87277272 0.91078074 ... 0.97246425 0.         0.86405338]
 [0.67340185 0.91170124 1.         ... 0.94329862 0.86405338 0.        ]]
[[0.         0.72655859 0.71110326 ... 1.         1.         1.        ]
 [0.72655859 0.         0.78844369 ... 1.         0.90661408 1.        ]
 [0.71110326 0.78844369 0.         ... 1.         1.         1.        ]
 ...
 [1.         1.         1.         ... 0.         1.         1.        ]
 [1.         0.90661408 1.         ... 1.         0.         1.        ]
 [1.         1.         1.         ... 1.         1.         0.        ]]
yuce***********
[[0.38285028 0.40383315 0.41990713 ... 0.47385458 0.46267752 0.47114813]
 [0.0839331  0.09477321 0.09129674 ... 0.09362053 0.09501009 0.09518144]
 [0.06516871 0.06845461 0.06684125 ... 0.06331703 0.06697337 0.06722189]
 ...
 [0.0268516  0.0359455  0.03502679 ... 0.04058066 0.03970251 0.04045211]
 [0.13417963 0.14283188 0.14976465 ... 0.15155925 0.15103048 0.15288519]
 [0.20520577 0.20295445 0.22561216 ... 0.25758525 0.24941277 0.25580012]]
[[ 1.64300223  0.57801719  0.5136358  ...  0.32376338  0.32351587
   0.32119798]
 [ 1.38470596  0.25382729  0.15109705 ... -0.07179432 -0.07053171
  -0.07374653]
 [ 1.3893305   0.2226973   0.12585267 ... -0.10138413 -0.09947328
  -0.1026983 ]
 ...
 [ 1.23145311  0.18601276  0.08755609 ... -0.12392211 -0.12315057
  -0.1262216 ]
 [ 1.4340729   0.295668    0.21700738 ... -0.00697219 -0.00611205
  -0.0089443 ]
 [ 1.45976555  0.35963021  0.30179446 ...  0.10529929  0.10523553
   0.10279947]]
User-based CF RMSE: 3.1228749648419565
Item-based CF RMSE: 3.4501665337217244
The sparsity level of MovieLens100K is 93.7%
User-based CF MSE: 2.7175119312541027