news

レコメンドシステムの要約

レコメンドシステムの要約

初めまして、今回の記事を担当するリュウです。入社して以来ECのレコメンドシステムの構築を担当しています。今回の記事ではレコメンドシステムに関する事を皆さんに共有しようと思います。
まず、今回のブログの構成を説明します。セクション1と2ではレコメンドシステムの役割と普段使うアルゴリズムを紹介します。セクション3は例としてオープンソースの機械学習のツールであるSparkとGoogleのクラウドサービスであるDataprocで簡単な映画のレコメンドシステムを作ります。セクション4ではレコメンドシステムを学ぶ為の資料を記載します。
セクション1と2についてはITの知識がなくでも大丈夫です。セクション3はPythonとLinuxなどの基本的な知識が必要になります。

 

1 レコメンドシステムとは?

「レコメンド」は、“お薦めする”という意味の英単語「Recommend」が起源となっています。「レコメンドシステム」の役割は、その名前の通り二つの意味があります。一番目は特定のユーザーが興味ありそうなモノやサービスをお薦めする事です。二番目は特定のモノやサービスに興味があるユーザーを抽出する事です。

現在、レコメンドシステムがよく使われる領域としては通販サイト(Amazon)、Webサイトの広告(Google, Yahoo)、音楽・映画ストリーミング配信サイト(Netflix)があります。

 

2 レコメンドアルゴリズム紹介

レコメンドシステムで使えるアルゴリズムはいくつかありますが。最近よく使われているアルゴリズムは二種類あります。「内容ベースのアルゴリズム」と「協調フィルタリング」を使用しているものです。

2.1 内容ベースのレコメンド

内容ベースレコメンドは商品・ユーザーの詳細情報に基づいて特徴を計算してレコメンドする方法です。例えば、内容ベースレコメンドでブログの文章をレコメンドするシステムを作った場合、図1の左側はユーザーEliseの閲覧履歴です。真ん中ブロックの数字はEliseが読んだ記事の数です。Eliseの閲覧履歴から日頃、一番よく読むブログはLinuxに関するブログになります(11回閲覧)。EliseはLinuxに関する内容に似ているブログについて興味がある可能性が高いです。Eliseへレコメンドを作る時にLinuxに関するブログの内容を分析して一番似ており、かつEliseは読んたことのないブログ(OpenSource)になります(図1の右側)。よってEliseへOpenSourceのブログをお勧めします。
図1:内容ベースレコメンド
※この表はお薦めする資料4から転載したものです。
内容ベースで作った代表的なプロダクトは音楽配信サービスであるpandoraです。
pandoraは専門家のチームで450以上の音楽の特徴を定義しました。ユーザーへ音楽をお勧めする時に定義された特徴を計算してユーザーの好みに類似した音楽をお薦めします。

2.2 協調フィルタリングのレコメンド

協調フィルタリング(Collaborative Filtering、CF)はお勧めする商品の内容を分析しません。協調フィルタリングのコンセプトは趣味の似た人からの意見を参考にするという口コミの原理に例えられることが多いです。例えば、辛い料理が好きな人が辛い料理を出してくれるお店に行く時に、誰かからお薦めのお店を紹介されたとします。その場合、お店を選択する時に選ばれる可能性が高いのは同じ辛い料理好きな人からの紹介です。 協調フィルタリングではユーザーの評価情報または商品の購買履歴情報で指定されたユーザーと他のユーザーの類似度を計算して類似度の高いユーザー群を抽出します。さらに抽出されたユーザー群から評価の高い商品をお薦めします。
図2は具体的な協調フィルタリングの例です。緑の線はそれぞれの人物が評価した映画を表しています。例えばjoeに四本の映画(右側の図)の中から一本の映画をお薦めします。過去に見た映画(左側の図)の評価がjoeと似ているユーザー群(Anie, James, Bob)を抽出します。 抽出されたユーザー群による評価が一番高い映画#1をjoeへお薦めします。
図2:協調フィルタリングの例

※この図はお薦めする資料1から転載したものです。

協調フィルタリングを採用された代表的なプロダクトはNetflixの映画のレコメンドシステムです。

2.3 協調フィルタリングと内容ベースはできる・できないこと

 

 

表1:内容ベース、協調フィルタリングのメリット・デメリット
※この表はお薦めする資料5から転載したものです。

 

 

表1は内容ベース、協調フィルタリングのメリット・デメリットです。下記は表中の各項目になります。

■ 多様性 協調: ○ 内容ベース: ×
内容ベースでは商品内容に記載されていない情報はレコメンドされませんが、協調フィルタリングでは他の利用者を通じてレコメンドされるため、自身が知らない情報でもレコメンドできます。

■ ドメイン知識 協調: ○ 内容ベース: × 協調フィルタリングでは対象アイテムについて情報や知識が一切なくとも他の利用者の行動履歴を通じてレコメンド可能です。一方内容ベースではアイテムの特徴を特徴ベクトルに変換する設計が必須です。

■ COLD STARTの問題

協調: × 内容ベース: △ 新規システムで他の利用者がいない状況や、利用者のプロファイル取得が難しい状況では協調フィルタリングを利用できません。内容ベースではアイテムの特徴さえ取得できれば利用者プロファイルを取得できない状況でもレコメンド可能です。
■ 利用者数 協調: × 内容ベース: ○
協調フィルタリングではまだ誰も評価していないアイテムの評価ができません。一方内容ベースでは利用者がいなくても特徴からレコメンドが可能です。
■ 被覆率
協調: × 内容ベース: ○ 利用者数と同様に、協調フィルタリングではまだ誰も評価していないアイテムの評価ができないため、全ての商品を網羅してレコメンドすることができません。

■ 類似アイテム 協調: × 内容ベース: ○
アイテムの特徴を一切考慮しない協調フィルタリングでは、例えばマグカップの色違いについて見分けることができません。内容ベースでは類似度が高すぎるアイテムを足切りすることで色違い問題を防ぐことができます。
■ 少数派の利用者 協調: x 内容ベース: o
協調ベースでは特定アイテムの利用者が極めて少数の場合、類似したアイテムを予想できないためレコメンドできません。内容ベースではアイテムの特徴によってレコメンドできます。

3 レコメンドシステムを構築する例

今回はオープンソースの映画評価のデータセットとオープンソースの機械学習のツールであるSparkとGoogleのCloudサービスであるDataprocを運用して、一緒に簡単なレコメンドシステムを作りましょう。

3.1 DATAPROC/Spark紹介

  • Dataproc/Sparkとは?
    • Sparkは大容量データの取り扱いを目的とした分散処理のフレームワークです。DataprocはGoogleがSpark使って構築したサービスです。DataprocとSparkを組み合わせてレコメンドシステムを構築すると下記のメリットがあります。
  • Dataproc/Sparkのメリット
    • 大容量のデータを処理できる 注文数100万、ユーザー数10万、商品数1万のデータを20分ぐらいで処理できます。
    • 開発をしやすい 機械学習の開発でよく使われているアルゴリズムのモジュールが多数提供されています。
    • Googleの別のサービスと連携しやすい 例えばDataprocでGoogleの大容量のデータサービスBigQueryスケーラブルなサービスと連携しやすいです。
    • メンテナンスをしやすい
      自身で構築するSparkのサーバよりDataprocとGCEを使うことでメンテナンスの手間が少ないです。

3.2 テスト用データ

  • データソース 映画レコメンドのウェブサイト MovieLensから映画のレビューデータ。
  • データサイズ 700人×作品数9,000×10万件レビュー履歴。
  • データフォーマット レコードタイムスタンプ(10桁の整数)、 ユーザーID 、映画ID、レビュー点数(1点〜5点)。

 

 

図3:精度の測定方法
今回はテスト用データの中から80%部分は教師データにします。残る20%部分は検証データです。テストする時に教師データでモデルをトレーニングして、検証データのユーザーは映画に評価した点数を予測します。最後に予測結果と正解値の分散を計算します。

3.4 サンプルコードの説明:

今回の例のサンプルコードはPyhtonで書きました。コードの重要な部分を説明します。

  • 教師データと検証データを分ける Code1のように教師データと検証データを分けます。教師データのフォーマットは下記になります。
    • X[0] : レコードタイムスタンプ(10桁の整数型)
    • X[1] :  ユーザーID ,映画ID
    • X[2]: レビュー点数(1点〜5点)

 

 

Code1:教師データと検証データを分けます

 

 

  • モデルのトレーニング SPARKのレコメンドAPIにトレーニングパラメータが三つあります。今回は学習率(0.1, 10.0)、ランク(8,12)、訓練回数(10,20)組み合わせてテストします。テストし、出た結果から精度が高い組み合わせを選びます。
  1. ランク:トレーニングする商品とユーザーのRatings Matrixのディメンション数です。(※詳しい定義はMATRIX FACTORIZATION TECHNIQUES FOR RECOMMENDER SYSTEMS にあります。)
  2. 学習率:モデルをレーニングする時にアルゴリズムのパラメーターを調整する間隔です。
  3. 訓練回数:モデルをレーニングする回数です。

 

 

Code2:モデルのトレーニング

 

3.4 構築の手順

 

 

  • テストデータの準備
    1. テストデータをダウンロードします:MovieLensで三つのサイズ(全データ、最新のデータSMALL、最新のデータFULL)のデータをダウンロードできます。今回はテストの為、最新のデータSMALLをダウンロードします。
    2. テストデータをGCSへ格納します:
      使うコマンドは
      gsutil cp -r [テストデータが格納されたディレクトリ] [GCSのディレクトリ] です。

 

  • サンプルコードの実行
    1. DATAPROCのINSTANCEを作ります
      使うコマンドは下記になります。gcloud dataproc clusters create  [INSTANCE名]  –num-workers [WORKER数]  -z asia-northeast1-a
    1. サンプルコードアップロードします 使うコマンドは下記になります。 gcloud beta dataproc jobs submit pyspark –cluster  [INSTANCE名] [サンプルコードのファイル名] — [テストデータが格納されたディレクトリ] [GCSのディレクトリ]

 

  • テスト結果
今回の試したデータセットにおいての予測結果と正解値の分散は0.904339です。
図4:テストの結果

4 お薦めする資料:

  1. Matrix Factorization Techique For Recommende Systems :Yehuda Koren/Yahoo Research Robert Bell,Chris Volinsky/AT&T Labs.
  2. Collaborative Filtering for Implicit Feedback Datasets:Yifan Hu/AT&T Labs, Yehuda Koren/ Yahoo! Research,Chris Volinsky/ AT&T Labs
  3. Recommender SystemsHandbook/Francesco Ricci, Lior Rokach, Bracha Shapira
  4. Introduction to approaches and algorithms,M. Jones
  5. 推薦システムのアルゴリズム :神嶌 敏弘

今回はレコメンドシステムの役割とそれらの種類において、よく使われているアルゴリズムを紹介しました。例として映画の簡単なレコメンドシステムの構築を皆さんに共有しました。今回の例だけでなく、他にも色々な使い道がレコメンドシステムにはあります。皆さん興味があればぜひ試してください。