協調フィルタリング アルゴリズムは、ユーザーとアイテム間の相関関係を検出するために使用されます。ユーザー ベースとアイテム ベースの 2 つの主なタイプがあります。
ユーザーに基づいて:
ユーザー 1 はアイテム A、B、C、および D を購入し、良いレビューを付けました。ユーザー 2 もアイテム A、B、および C を購入したため、ユーザー 1 とユーザー 2 は同じタイプのユーザーとみなされ、D は次のことができます。ユーザー 2 にも推奨されます。
アイテムベース:
アイテム A とアイテム B をユーザー 1、2、3 が購入した場合、アイテム A とアイテム B は類似度が高いと考えられ、ユーザー 4 がアイテム A を購入した場合、アイテム B も推奨できます。ユーザー4。
次の例は、項目ベースの協調フィルタリング アルゴリズムです。
プロジェクトの背景: あるビデオ プラットフォームは、エクスペリエンスを最適化し、ユーザーの定着率を高めるために、ユーザーの視聴記録に基づいたインテリジェントなレコメンデーション システムを構築することを決定しました。
データセットの処理
# 导入数据
import pandas as pd
movies = pd.read_excel('/kaggle/input/movie-name-and-category/Movie Name and Category.xlsx')
score = pd.read_excel('/kaggle/input/movie-name-and-category/Film rating.xlsx')
# 关联为一张表
df = pd.merge(movies, score, on='电影编号')
df.head()
詳細コード:
merge() 関数は 2 つのデータ セットを関連付けるために使用され、デフォルトは内部結合です。on: 結合に使用される列名。両方の DataFrame オブジェクトに存在する必要があります。
左結合の構文は次のとおりです: result2 = pd.merge(df1, df2, on='key', how='left'); how: 'left'、'right'、'outer'、'inner を含む結合メソッド' 4 (デフォルトは 'inner')。
(データセットのコメントセクションを参照してください。データセットには 9712 本の映画と 100836 個の評価があります)
操作結果:
ピボットテーブルに変換
# 将原始数据转换为数据透视表
user_movie = df.pivot_table(index='用户编号', columns='名称', values= '评分')
user_movie.tail()
詳細コード:
pivot_table()はpandasのピボットテーブル関数で、indexはインデックス、columsは列名を表します。
tail() は最後の数行を表示することを意味し、デフォルトは 5 行です。
操作結果:
ピアソン相関係数の計算
# 从数据透视表中提取各用户对《阿甘正传》的评分
FG = user_movie['阿甘正传(1994)']
# corrwith()函数计算《阿甘正传》与其他电影间的皮尔逊相关系数
corr_FG = user_movie.corrwith(FG) # 计算皮尔逊相关系数
similarity = pd.DataFrame(corr_FG, columns=['相关系数']) # 整合成二维表格
# 使用DataFrame的dropna()函数进行剔除空值
similarity.dropna(inplace=True)
# 展示5部电影的相关系数
similarity.head()
詳細コード:
user_movie は前の手順で生成したピボット テーブルで、まず分析対象のムービーをフィルタリングして FG に保存します。
corrwith() 関数を使用して、項目 A と他の項目の間のピアソン相関係数を計算します。
null 値が存在するため、dropna() 関数を使用して null 値を削除します。null 値の理由は、ユーザーが 2 つの映画を同時に評価していないため、ピアソン相関の共分散が係数を計算できないため、NaN 値が表示されます。
操作結果:
フィルタ結果
# 简单设置评分次数阈值为30,然后用sort_values()函数将表格按相关系数降序排列
similarity_new[similarity_new['评分次数'] > 30].sort_values(by='相关系数', ascending=False).head()
詳細コード:
スクリーニングスコアの数が 30 を超える場合は、サンプルサイズが小さすぎる場合に表示される偶発的な値を避けるためです。
sort_values() は並べ替え関数であり、パラメーター by は並べ替えるフィールドに基づきます。ascending=False は降順を意味します。
操作結果:
結果の解釈: 「クレイジー・ツインズ」、「フェイタル・アトラクション」、「フォレスト・ガンプ」は類似性が高く、「フォレスト・ガンプ」が好きなユーザーはこれら 2 つの映画も気に入っている可能性があり、お勧めできます。