[翻訳] Microsoft SAR - レコメンデーション システム プラクティス ノート

        [翻訳とブリック] この記事は、Microsoft Recommendation System Practice Project (翻訳者: Funco) の SAR サンプルの翻訳文書であり、元のアドレス: SAR Single Node on MovieLens です

        github: microsoft/recommenders は、Microsoft のオープン ソース レコメンデーション システムのベスト プラクティス ケースです。多数のレコメンデーション システム アルゴリズムの説明と特定のケースを提供し、将来の実践で参照できるレコメンデーション システムのいくつかの一般的な方法をカプセル化します。これらの特徴は現在のドキュメントに反映されており、コミュニケーションを取り、一緒に学ぶことを歓迎します。

        テキスト内の括弧 "()" には、コメントを示す数字が含まれています。テキストの各段落のコメントは、テキストの後に特定の内容を追加します。不確実な翻訳結果の場合。また、原文にはItem という単語がたくさんあります. Itemが、実はData文章が流暢になる場合もあります. そうしない理由は名詞を標準化することを望んでいます。参照は、Collaborative filtering (ItemCF、Item-based Collaborative Filtering) という項目に基づいています

文章

MovieLens の SAR 単一ノード (Python、CPU)

        SAR (Simple Algorithm for Recommendation) は、高速でスケーラブルな、ユーザー操作記録に基づく高速でスケーラブルなパーソナライズされたレコメンデーション アルゴリズムです。「コールド スタート」の問題**(1) にも対処しながら、わかりやすく解釈可能な推奨結果を提供できますSAR は最近傍アルゴリズム (Agarwal の "Recommender System" (2)で言及) であり、各ユーザーが最も必要とするアイテムを見つけるために使用されます。SAR の詳細については、ディープ ダイブ ノートブック(3)** を参照してください。

  1. 簡単に説明可能で解釈可能な推奨事項を生成し、「コールドアイテム」および「セミコールドユーザー」のシナリオを処理します。
  2. ** Aggarwal 著の「Recommender Systems Principles and Practice」(「Recommender Systems: The Textbook」) は、レコメンデーション システムの分野で最も広く評価されている本の 1 つです。彼の本には、最近傍アルゴリズム**、特に最近傍協調フィルタリング アルゴリズムに関する多くの記述があります

SARの利点

  1. 高精度でのトレーニングとデプロイが容易
  2. 高速トレーニング - 予測行列を取得するために必要なのは単純な計算だけです
  3. 高速予測スコアリング - 類似度マトリックスにスコアリング ベクトルを掛けるだけ

SAR の利点は、すべての面で単純かつ高速であることにあること容易に理解できますが、かなりの精度があります。

SARの正しい使い方

  1. ユーザーの特性やアイテムの特性に焦点を当てていない

    ユーザー機能またはアイテム機能が必要なシナリオではパフォーマンスが低下します **(1)**

  2. 高いメモリ使用量

    複数の疎行列**(2) を作成する必要がありますほとんどの行列分解ベースのアルゴリズムもこの問題に悩まされています(3)**

  3. 暗黙的なスコアリング スキームを優先しますが、スコアリングを予測しません **(4)**

  1. SAR の本質は近隣協調フィルタリングです
  2. 元のテキストでは、MxM (M はアイテムの数) のスパース マトリックスが作成されると説明されていましたが、これは単なる類似度マトリックスです. 実際には、ユーザー アイテムの評価マトリックスも必要です. 一連の操作の後、マトリックス中間生成物が生成されるため
  3. 特異値分解 (SVD)固有値分解などの一般的な行列分解
  4. この文を理解する方法がわかりません. 元のテキストは次のとおりです: 暗黙の評価シナリオを支持し、評価を予測しません.

0 セットアップと依存関係

# set the environment path to find Recommenders
import sys
sys.path.append("../../")

import logging
import numpy as np
import pandas as pd
import papermill as pm

from reco_utils.common.timer import Timer
from reco_utils.dataset import movielens
from reco_utils.dataset.python_splitters import python_stratified_split
from reco_utils.evaluation.python_evaluation import map_at_k, ndcg_at_k, precision_at_k, recall_at_k
from reco_utils.recommender.sar import SAR

print("System version: {}".format(sys.version))
print("Pandas version: {}".format(pd.__version__))

知らせ

  1. reco_utils は、元の記事が置かれているプロジェクトのパッケージであり、pip installでは取得できません。

1 データの準備

        ここで、SAR は次のデータ構造に準拠するデータを扱います: <User ID>, <Item ID>,<Time>,[<Event Type>], [<Event Weight>] (1)

        レコードの各行は、アイテムに対するユーザーの操作レコードを表します。レコードは、クリックしてアイテムを表示する、カートに追加する、リンクを共有するなど、e コマース サイトのさまざまな種類のイベントである可能性があります。イベントごとに異なる重みを指定できます。たとえば、「購入」を 10、「詳細の表示」を 1 ( 2)と定義できます。

        データセットMovieLens は、ユーザーによる映画の評価の書式設定されたデータであり、アルゴリズム プロセスを示すために後続のサンプル コードで使用されます。

  1. SAR は、次のスキーマとの相互作用で使用されることを意図しています: 、 、
  2. これ暗黙のスコアリングのケースです。ここで強調したいのは、暗黙のスコアをタイムリーに収集して記録することは、システムが必要とする可能性のある将来の分析にとって重要であることです。

1.1 動画データの読み込み

# MOVIELENS_DATA_SIZE = '100k'
data = movielens.load_pandas_df(
    size=MOVIELENS_DATA_SIZE,
    local_cache_path=sys.path[1] + '/downloads/'
)

# Convert the float precision to 32-bit in order to reduce memory consumption 
data['rating'] = data['rating'].astype(np.float32)

data.head()

print(data)

出力結果

       userID  itemID  rating  timestamp
0         196     242     3.0  881250949
1         186     302     3.0  891717742
2          22     377     1.0  878887116
3         244      51     2.0  880606923
4         166     346     1.0  886397596
...       ...     ...     ...        ...
99995     880     476     3.0  880175444
99996     716     204     5.0  879795543
99997     276    1090     1.0  874795795
99998      13     225     2.0  882399156
99999      12     203     3.0  879959583

[100000 rows x 4 columns]

知らせ

movielens はreco_utilsのサブパッケージであり、**movielens.load_pandas_df()** は呼び出されるたびにリソースの一部を一時フォルダーにダウンロードします。提案は

  1. プロジェクトの推奨ディレクトリにダウンロードフォルダーを作成します。

  2. http://files.grouplens.org/datasets/movielens/ から対応する zip をダウンロードします。

    movielens.load_pandas_df()のパラメータサイズが'100k'場合新しく作成されたダウンロードフォルダにml-100k.zipをダウンロードします。

  3. パラメーターlocal_cache_path を、作成したばかりのダウンロードフォルダーとして指定します。

1.2 分割データ

公開ライブラリの Python ランダム スプリッターに基づいてデータを分割する

すべてのデータをテスト セットトレーニングセットに分割し、トレーニング中にセット **(1)** を非表示にして、アルゴリズムのパフォーマンスを測定します。SAR はユーザーの好みに基づいて推奨結果を生成するため、テスト データセット内のすべてのユーザーがトレーニング データセットに存在する必要があります。この問題を解決するには、関数python_stratified_split (2)を使用して、元のデータに含まれる各ユーザーの保持データの割合を決定します (たとえば、25% を予約セットとして取ります)。トレーニング セットとテスト セット。さらに、さらに多くのデータ セグメンテーション メソッドがdataset.python_splittersで提供されています。

  1. Hold-out set** (hold-out set) : hold -out data** とも呼ばれます。ここで説明されているのは、実際にはモデルの評価方法です - hold-out メソッド (hold-out)、ここでのkeep set はテストセット
  2. python_stratified_splitdataset.python_splittersは、Microsoft 推奨システム プロジェクトのreco_utilsに実装された単なるデータ セグメンテーション ツールです. これらはさまざまなデータ セグメンテーション メソッドを提供し、 pip installでは取得できません。さらに、python_stratified_split は主にpandas.DataFrame.sampleによるランダム サンプリングを実装します。
train, test = python_stratified_split(data, ratio=0.75, col_user='userID', col_item='itemID', seed=42)

print("""
Train:
Total Ratings: {train_total}
Unique Users: {train_users}
Unique Items: {train_items}

Test:
Total Ratings: {test_total}
Unique Users: {test_users}
Unique Items: {test_items}
""".format(
    train_total=len(train),
    train_users=len(train['userID'].unique()),
    train_items=len(train['itemID'].unique()),
    test_total=len(test),
    test_users=len(test['userID'].unique()),
    test_items=len(test['itemID'].unique()),
))

出力結果

Train:
Total Ratings: 74992
Unique Users: 943
Unique Items: 1649

Test:
Total Ratings: 25008
Unique Users: 943
Unique Items: 1444

2 トレーニング SAR モデル

2.1 SAR アルゴリズムのインスタンスとインデックスの構成

        単一のノードで SAR を実行し、データ セット内の各インデックス列の対応する列名を構成します (実際の使用では、タイムスタンプ フィールドは特定の状況に応じて無視または予約できます)。

        パラメータの詳細については、ディープ ダイブ ノートブックを参照してください。

logging.basicConfig(level=logging.DEBUG, 
                    format='%(asctime)s %(levelname)-8s %(message)s')

model = SAR(
    col_user="userID",
    col_item="itemID",
    col_rating="rating",
    col_timestamp="timestamp",
    similarity_type="jaccard", 
    time_decay_coefficient=30, 
    timedecay_formula=True
)
  1. ジャカード係数 (jaccard ): 上記のコードでは、関数SARのパラメーターsimilarity_typeがjaccardに設定されています。これは、2 つのセットの類似度を比較するために使用できるジャカード係数です。基本的な方法は、和集合のサイズに対する 2 つの集合の交点のサイズの比率です。詳細については、百度百科事典 - Jaccard 係数を参照してください。

2.2 トレーニング セットを使用して SAR モデルをトレーニングし、テスト セットから上位 k 個のテスト結果を取得する

        SAR は最初にアイテム - アイテム共起行列 (Co-occurence matrix)を計算します。要素は、ユーザーの評価レコードで 2 つのアイテムが共起するレコードを表します。その後、アイテムの類似性マトリックスを計算するために、共起マトリックスを何らかの尺度で再スケーリングできます(以下のコードでは、Jaccard 係数が類似性尺度として使用されます)。

嗜好マトリックスを通じて、ユーザーとアイテムの相関 **(1)** を取得する        こともできます。類似度は、さまざまな種類と時間のイベント (ユーザーによる映画の評価や視聴の有無など) によって決定されます。

        嗜好行列Aに類似度行列Sを掛けることで、予測スコア行列 (推奨値行列) Rを得ることができます。その後、次のケース コードの関数recommend_k_itemsを使用して、各ユーザーの上位 k 件の最も推奨される結果を取得できます。

        ここから、SAR アルゴリズムの完全な紹介を見つけることができます。

  1. 私の理解によると、この連想行列は評価行列です.データセットとは異なり、連想行列は行-列を使用してユーザー-項目を表します.
with Timer() as train_time:
    model.fit(train)

print("Took {} seconds for training.".format(train_time.interval))

の結果

2020-02-18 20:55:32,377 INFO     Collecting user affinity matrix
2020-02-18 20:55:32,392 INFO     Calculating time-decayed affinities
2020-02-18 20:55:32,463 INFO     Creating index columns
2020-02-18 20:55:32,587 INFO     Building user affinity sparse matrix
2020-02-18 20:55:32,595 INFO     Calculating item co-occurrence
2020-02-18 20:55:32,788 INFO     Calculating item similarity
2020-02-18 20:55:32,789 INFO     Using jaccard based similarity
2020-02-18 20:55:32,891 INFO     Done training

Took 0.5264033849998668 seconds for training.
with Timer() as test_time:
    top_k = model.recommend_k_items(test, remove_seen=True)

print("Took {} seconds for prediction.".format(test_time.interval))

の結果

2020-02-18 20:55:35,758 INFO     Calculating recommendation scores
2020-02-18 20:55:35,851 INFO     Removing seen items

Took 0.14565897600004973 seconds for prediction.
top_k.head()

の結果

ユーザーID アイテムID 予測
0 1 204 3.313306
1 1 89 3.280465
2 1 11 3.233867
3 1 367 3.192575
4 1 423 3.131517

2.3 SAR性能の評価

        モジュールreco_utils.python_evaluationを使用して、SAR アイテム リコール ( 1 )各スコアリング方法では、特定のユーザー ID、アイテム ID、およびデータ セット内の評価の列名を指定する必要があります。

  1. 精度と精度には違いがあることに注意してください。
eval_map = map_at_k(test, top_k, col_user='userID', col_item='itemID', col_rating='rating', k=TOP_K)
eval_ndcg = ndcg_at_k(test, top_k, col_user='userID', col_item='itemID', col_rating='rating', k=TOP_K)
eval_precision = precision_at_k(test, top_k, col_user='userID', col_item='itemID', col_rating='rating', k=TOP_K)
eval_recall = recall_at_k(test, top_k, col_user='userID', col_item='itemID', col_rating='rating', k=TOP_K)

print("Model:\t",
      "Top K:\t%d" % TOP_K,
      "MAP:\t%f" % eval_map,
      "NDCG:\t%f" % eval_ndcg,
      "Precision@K:\t%f" % eval_precision,
      "Recall@K:\t%f" % eval_recall, sep='\n')

の結果

Model:	
Top K:	10
MAP:	0.110591
NDCG:	0.382461
Precision@K:	0.330753
Recall@K:	0.176385
# Now let's look at the results for a specific user
user_id = 876

ground_truth = test[test['userID']==user_id].sort_values(by='rating', ascending=False)[:TOP_K]
prediction = model.recommend_k_items(pd.DataFrame(dict(userID=[user_id])), remove_seen=True) 
pd.merge(ground_truth, prediction, on=['userID', 'itemID'], how='left')

の結果

2020-02-18 20:55:40,935 INFO     Calculating recommendation scores
2020-02-18 20:55:40,951 INFO     Removing seen items
ユーザーID アイテムID 評価 タイムスタンプ 予言
0 876 523 5.0 879428378 NaN
1 876 529 4.0 879428451 NaN
2 876 174 4.0 879428378 0.353567
3 876 276 4.0 879428354 NaN
4 876 288 3.0 879428101 NaN

        上図では、モデル top-k が推奨するテスト セットの最高得点の項目が調整され、他の項目は変更されていないことがわかります。アルゴリズムをオフラインで評価することは困難です。この時点では、テスト セットには履歴レコードのみが含まれており、すべての項目の範囲にわたるユーザーの実際の好みを表すことができないためです。この問題については、他のアルゴリズム(1)またはハイパーパラメーター (2)を使用して最適化することもできます。

  1. 実際のアプリケーションでは、それらのほとんどは、UserCF + ItemCF、ItemCF + Content-based、またはその他の独自の最適化方法など、ハイブリッドで統合されたレコメンデーション システムです。この部分については、Aggarwal の「レコメンデーション システム」で詳しく説明されています。
  2. ハイパーパラメータ: 機械学習(ML, Machine Learning)の概念です. ML では設定されたパラメータをハイパーパラメータと呼びます. 私の個人的な理解によると、ここで原文が言いたいことは増分データの機械学習を通じてモデルを継続的に最適化することです。

おすすめ

転載: blog.csdn.net/qq_23937195/article/details/104387486