たいさブログ

taisa's engineer blog

機械学習

「仕事ではじめる機械学習」の「映画の推薦システムをつくる」を実践してみる

投稿日:


「仕事ではじめる機械学習」の映画の推薦システムをつくるを実践してみる

本書のソースコートは以下にあがっている。本記事はchap07が対象。

https://github.com/oreilly-japan/ml-at-work

事前準備

サンプルコードを実行できるように、あらかじめ以下をインストールしておく。Pythonは3系を使う想定。

参考:Mac環境へのPython3系インストール

jupyter notebook が用意されているから以下からソースの実行をすることができる

シナリオ

映画の推薦システムを作るために、MovieLensという映画のレーティングサイトのデータを用いて、ユーザーが評価した星の数を予測する。

MovieLens

推薦システムとは

  • AmazonなどのECサイトで表示される「この商品を買った人はこれも買っています」のような、関連する商品をオススメする
  • 5段階の星で示される評価値に基づいて楽曲がお薦めされる音楽アプリ

何かしらのユーザーの行動やアイテムの情報から、ユーザーが好むであろう関連アイテムを提示するのが目的

応用シーン

Eコマースにおける推薦システムの応用シーンは、運用目的に応じて以下の5つに整理されるとしてる。

  • 概要推薦
  • 利用者評価
  • 通知サービス
  • 関連アイテム推薦
  • パーソナライゼーション

概要推薦

今週の人気商品のような統計情報ベースのおすすめや、編集者のセレクトしたアイテムを薦める場合など、人によらず大まかに行う推薦で、システムを利用し始めたユーザーや、たまにしか利用しないユーザーに特に効果を発揮する。

利用者評価

ユーザーが☆を付けた評価やコメントを他のユーザーに見せたり、評価値の平均など統計情報として見せたりする。他者の情報をもとに判断する基準を与えることができる。

通知サービス

プッシュ通知やメールでユーザーが興味をもつアイテムを推薦することによりサイトへの再訪を促す。

関連アイテム推薦

関連アイテムやその情報を元のアイテムと同時に示すことで、アイテムを同時に購入したり別のアイテムと比較したりすることを助ける。

パーソナライゼーション

人気のアイテムリストや編集者のおすすめリストと並べて、ユーザーが好みそうなアイテムリストを表示することで、そのユーザーが気に入ったアイテムに出会えるようにする。また、検索結果を個人によってカスタマイズする方法もある。

推薦システムをもっと知ろう

データの設計と取得

推薦システムの入力データとなりうる情報はいくつか情報がある。

  • 嗜好データ
  • 検索クエリ
  • 批評
  • アイテム特徴
  • デモグラフィック特徴
  • コンテキスト特徴

嗜好データ

ユーザーのアイテムに対する「好き」という感情や5段階で「2」という評価など、その好みを表すもの

検索クエリ

レストラン検索時に「5000円以下の和食の店」と指定する検索キーワードの情報

批評

商品やお店に対する口コミなどを指す

アイテム特徴

商品説明文中の単語などの情報

デモグラフィック特徴

ユーザー自身の性別や年齢などの情報

コンテキスト特徴

推薦されたアイテムを使った日付や位置の情報、アイテムの在庫状況など、推薦に関連する文脈の情報。

なるべく正しい情報を多く集める工夫が必要で、そのためには、ユーザーがアイテムを評価するコストを下げるか、ユーザーの評価回数が少なくても良いような何らかの工夫が必要

  • 音楽の評価は大きなコストにならないので多く集まる
  • 式場や家の購入など、人生に何回もないようなイベントではアイテムの評価に対するコストが高いため、WebページのPVのような別の指標を使うなどの工夫が必要

明示的データと暗黙的データ

嗜好データを獲得する方法は大きく2つある

  • 明示的データ:ユーザーに直接好き嫌いや関心のあるなしを質問して回答してもらう
  • 暗黙的データ:利用者が商品を購入したり閲覧したりといったアイテムは関心があるとみなす

それぞれ長所と短所がある

嗜好データの獲得法による長所・短所

種類 明示的 暗黙的
データ量
データの正確さ
未評価と不支持の区別
利用者の認知
  • データ量
    • データ量は明示的データより暗黙的データの方が圧倒的に多くなる
    • 明示的データ数を増やすのは難しい
  • データの正確さ
    • 明示的データは正確なことが多い
    • 暗黙的データは正確性が低い場合が多く、質を担保するために、閲覧情報であれば滞在時間でフィルタリングするなどのデータの前処理が必要になる
  • 未評価と不支持の区別
    • 暗黙的データは未評価と不支持の区別ができない
    • 暗黙的データは「嫌い」に相当するネガティブな評価を取得できない
  • 利用者の認知
    • 明示的データはシステムが根拠のある出力を行っていると思ってもらえることから、ユーザーに好印象を与えやすくなる

推薦システムのアルゴリズム

推薦システムのアルゴリズムは、大きく以下の2つにわけられる

  • 協調フィルタリング
    • 映画の趣味が似ている人にオススメを聞くように、評価の似ている人を探したり、似たような評価をされる映画を探したりする
  • 内容ベースフィルタリング
    • 映画の監督名やジャンル、タイトル中の単語など内容が似た映画を探す

協調フィルタリングの分類

  • ユーザー間フィルタリング:似た人を探すアプローチ
  • アイテム間型協調フィルタリング:似たアイテムを探すアプローチ
    • これらはシステムを持っているデータを元に、直接近いユーザー/アイテムを提示するため、メモリベース協調フィルタリングの一種であると言われる
  • モデルベース協調フィルタリング:メモリベースと違うアプローチとして、回帰や分類などの予測モデルを学習する

ユーザ間型協調フィルタリング

ユーザ間型協調フィルタリングは、以下の流れで行う

  1. ユーザーの情報をベクトルで表現する
  2. ユーザー間がどれくらい似ているか(類似度)を決める
  3. 類似度にもとづいて評価値を算出する

代表的な類似度

  • ピアソンの相関係数
  • コサイン類似度
  • ジャッカード係数

ピアソンの相関係数

SciPyを使った場合

コサイン類似度

ジャッカード係数

アイテム間型協調フィルタリング

アイテム間型協調フィルタリングもメモリベースの手法で、ピアソンの相関係数やコサイン類似度が高いアイテムを見つけるという解き方をする。計算方法としてはユーザー間型協調フィルタリングと大きく変わらない。また、コサイン類似度を改良した調整済みコサイン類似度という類似度もある。

映画Mの評価ベクトルをm(評価値行列を縦に一列切り取ったもの)、映画Nの評価ベクトルをnとすると、アイテム間型協調フィルタリングのピアソンの相関係数は、pearson_coefficient(u, v)のu, vにそれぞれm, nを代入することで求めることができる。

アイテム間型協調フィルタリングでは、分母で映画Mの評価値の平均を引くが、その代わりにユーザーの評価値の平均で引いたものが、調整済みコサイン類似度。各ユーザーの平均評価値ベクトルをu_meanとすると、調整済みコサイン類似度は以下のように書ける。

映画Aと映画Cの類似度を計算する場合、m = np.array([5, 4, 0])と n = np.array([2, 1, 5]) となる。また、各ユーザの平均評価値は u_mean = np.array([2.333, 1.667, 3.0])となる。なお、評価値行列 rating を使って u_mean を計算する場合は以下のようにNumPyのmean関数を使うことができる。

ユーザーの評価値の平均を割り引くことで、高めの点数に評価をするユーザーと低めに評価をするユーザーのち外を除去することができ、予測性能が向上する。

  • ユーザーの評価値の平均を割り引くことで、高めの点数に評価をするユーザーと低めに評価をするユーザーの違いを除去することができ、予測性能が向上する
  • ユーザーベースとアイテムベースでは、どちらのデータの増加スピードが早いかが更新頻度の鍵になる
  • アイテムに対する類似アイテムを表示するのは、まだアクティビティが少ないユーザーに対しても提示できるため、登録してすぐのユーザーにもアプローチしやすい方法
  • 反面、人気のアイテムばかりが推薦されるという課題も顕著なため、意外性を出すには工夫が必要

モデルベース協調フィルタリング

モデルベース協調フィルタリングは、教師あり学習や教師なし学習のモデルを作ることで、既知のデータの規則性をもとに予測する方法で、ここでいうモデルは以下のようなものがある。

  • クラスタリングを使ったモデル
  • 評価値を回帰などで予測するモデル
  • トピックモデルを使った方法
  • 行列分解を使った方法

クラスタリングを使ったモデル

嗜好が似ているユーザーのグループを作成して、あるユーザーが所属するグループに好まれるものを推薦する方法

回帰を使った予測モデル

線形回帰などの回帰モデルを学習して評価値を予測する

トピックモデル

PLSAやLDAなど、評価行列を次元削減することで「アクションが好き」などの潜在的な意味を表現できるとされている手法で、暗黙的データでも予測ができるのが特徴

行列分解

Matrix Factorizationと呼ばれる方法が有名で、レーティングの評価行列をユーザーの行列をアイテムの行列で表現する

Matrix Factorizationは、確率的勾配法を最適化手法として使うことで大規模データに対しても学習ができる

内容ベースフィルタリング

映画のタイトルや監督、ジャンルや俳優、口コミなどアイテムを表現する情報に着目し、それらの過去のデータから推薦を行う

協調フィルタリングと内容ベースフィルタリングの得手・不得手

  • 協調フィルタリングの得手
    • ジャンルやテキストに含まれている単語が似ていなくても良い
    • 多様性のある推薦結果を得られる可能性が高い
  • 協調フィルタリングの不得手
    • 新規ユーザーや新アイテムに対する推薦がデータが少なくなりがちで推薦が困難(コールドスタート問題)
    • システムの利用者が少ないと良い推薦ができず、推薦が使われないと利用者が増えないという負のループにはまるリスクがある
  • 内容ベースフィルタリングの得手
    • 新しいサービスで行動データが蓄積されなくても、比較的適切な推薦をしやすい手法
  • 内容ベースフィルタリングの不得手
    • 日本語だと形態素解析をするため辞書をメンテナンスする必要があるなど、ドメインに特化した情報をどのように扱うかが課題となる

評価尺度

推薦にはいくつかの評価尺度がある。

  • 正解率
    • 5段階評価で4以上の評価値が付与されていた場合に適合するとみなして、予測結果とユーザーの評価値を比較する
  • 適合率、再現率
    • 予測結果に対する正解の割合である適合率、真の正解に対するカバー率である再現率を計算する

推薦の結果として、回帰で星の数などの点数を予測する場合は回帰用の評価尺度を用いる。

  • 平均絶対誤差
    • 回帰で利用する評価尺度で、予測値と実測値の差の雑体値を評価用データで算出する(ズレが大きいと平均雑体誤差の値は大きくなる)
  • 平均二乗誤差
    • 回帰で利用する評価尺度で、予測値と実測値の二乗した差をもとにしたデータ(ズレが大きいと平均二乗誤差の値は大きくなる)
  • 順位相関
    • 推薦するアイテムの並びを評価する指標で、順位を学習する場合に使うランキング学習を行った際によく利用される

これら以外にも、多様性を評価指標に取り入れる場合もあれば、全アイテムのうち評価値の予測が可能なアイテムの割合として被覆率を評価指標として使う場合もある。

MovieLensのデータの傾向を見る

データをダウンロードする。
また以降のソースコードは以下のオライリーのGitHubにあがっている。

https://github.com/oreilly-japan/ml-at-work/blob/master/chap07/Movie_recommendation.ipynb

ユーザー情報を読み込んでpandasのDataFrameに格納する

出力結果

評価値情報を読み込む

出力結果

映画情報を読み込む

出力結果

すべての表をマージする

全データの中で、最も評価された25作品を見てみると1位はスターウォーズの583件

出力結果

評価の数と平均を集計し、平均値の高い順に並べ替えをする

出力結果

評価件数が1件と少ないため評価の平均が高くなる映画が上位に来てしまう

これを防ぐために評価数の多いもののみで平均する

出力結果

評価回数の分布
テールにしたがって頻度が低くなるいわゆるロングテールな分布になる(ジップの法則)

出力結果

ユーザーごとの評価数と評価値の平均

評価値の平均に着目をすると、最低が平均1.49点の辛口のユーザーから4.87点の甘めのユーザーまで、ユーザーごとにバイアスがあることがわかる

出力結果

推薦システムの実装

MovieLensのデータを使って、映画の評価値を予測する

Factorization Machineを使った推薦

ここではFactorization Machinesを使って推薦する

  • Matrix Factorizationではユーザーとアイテムの情報しか扱えなかったが、Factorization Machinesはそれ以外の特徴量も扱うことができる
  • ロジスティック回帰などと異なり、Matrix Factorizationと同じく疎な行列を扱うことができる
  • 特徴量の間で影響を与え合う交互作用を考慮することができるので、相関関係がある特徴量も適切に扱うことができる

factFMを使う

fastFMの利用するアルゴリズム

  • ALS
    • 長所:予測が速い、パラメータがSGDより少ない
    • 短所:正則化が必須
  • SGD
    • 長所:予測が速い、大きなパラメータに対しても高速に学習ができる
    • 短所:正則化が必須
  • MCMC
    • 長所:予測が速い、大きなデータに対しても高速に学習ができる
    • 短所:正則化が必須、ハイパーパラメータの数が多い
  • マルコフチェインモンテカルロ法
    • 長所:ハイパーパラメータの数が少ない、自動で正則化できる
    • 短所:学習に一定の時間が必要

手始めにALSを使って学習と予測をしてみる

user, itemはstringとして渡したため、ダミー変数に変換された。ユーザーIDとアイテムIDを文字列で表現することで、カテゴリカル変数として扱う。

このダミーデータに対してALSを使って回帰をしてみる。

24歳のユーザーID 5がアイテムID 10の評価値を予測した場合、年齢も近く同じ商品を評価しているユーザー4の評価値に近い5段階評価のうち、3.6という評価を予測することができた。

いよいよFactorization Machineで学習する

全体の傾向が分かったので、実際に映画の評価値を予測してみる。MovieLensのデータには、ユーザーをうまく分けた開発データとテストデータが提供されているので、まずは、それを使って評価値の予測をしてみる。

データを読み込む関数を定義して、開発データua.baseとテストデータua.testを読み込む。

このとき、Factorization MachinesではユーザーIDと映画のIDをカテゴリカル変数として扱うため文字列型に変換し、DictVectorizerクラスを使ってダミー変数にしている。

次に開発データを訓練データと検証データに分ける。パラメータの調整には訓練データと検証データを使い、最終的な評価にはテストデータを使う。

  • X_train:訓練データ
  • y_train:その評価値
  • X_dev_test:検証データ
  • y_dev_test:その評価値

データの準備ができたので、Factorization Machinesを使って学習してみる。ここでは、ハイパーパラメータの少なさからMCMCを使って学習する。MCMCで学習をして、イテレーションの回数に対する平均二乗誤差とMCMCのハイパーパラメータ(alpha,lambda_w,mu_w)の推移を見てみる。

  • およそ100回イテレーションを繰り返すと、どのパラメータも収束して来る
  • 標準偏差は、回帰問題における平均二乗誤差のベンチマークとなる
  • 常に平均値を出力する予測モデルがあったとき、その平均二乗誤差は標準偏差に等しくなることが知られている
  • 検証データの標準偏差は1.12なのに対し、今回の予測した評価値の平均二乗誤差は0.89と低い値になった

次に、行列を圧縮する次数であるrank(Matrix Factorizationにおけるdと同じようなハイパーパラメータ)を大きくした時に性能がどう変わっていくかを見る。

rankは32になると平均二乗誤差の変化が落ち着いてくることが分かる。rankが大きくなればなるほど、考慮すべき交互作用が増えて学習対象となる重みの個数が増えるため、学習時間が長くなるので適当なサイズを見極めるのが重要

テストデータで評価してみる。

平均二乗誤差が0.921となった。ユーザーごとに評価値のバラ付きが出るのを対処するために、評価値の標準化をする。ここではシンプルにStandardScalerクラスを使う。StandardScalerクラスは平均を0に、標準偏差を1に合わせるように標準化する。

標準化の結果、平均二乗誤差が0.920と僅かだが小さくなる。

ユーザーと映画以外のコンテキストも加える

ユーザーID、映画IDはダミー変数に変換するため文字列に変換している。

それぞれの組み合わせをAからEと名付けた時、どの組み合わせがよいか実際に学習してみる。

結果より、CのユーザーID、映画ID、性別、評価年の組み合わせが良いことが分かる。平均二乗誤差も0.885と低めにおさえられている。こうしたユーザーとアイテム以外の情報を使ったレコメンドをContext-Aware Recommendationと呼ぶ。

まとめ

  • Factorization Machinesを使った評価値の予測では、ユーザーIDや映画ID以外にも適切な特徴量の組み合わせを用いて予測をすることで性能が改善されることが分かった。
  • 実際にシステムとして使う場合は、評価値がないため苦労することが多いが、評価値を取得するためのインタラクションはシステムとしてユーザーメリットがある形で組み込まなければデータとして集まらない
  • 予測対象とするデータはユーザーの嗜好が現れるデータを適切に利用するように心がける
  • 特に、その対象が最終的に予測したい値なのか、それとも特徴量として使える途中のデータなのかを切り分けることが重要

-機械学習
-,

執筆者:

関連記事

パーセプトロン – 機械学習におけるアルゴリズム

機械学習におけるアルゴリズムの一つであるパーセプトロンについて、仕事ではじめる機械学習を元に学習していく。 そもそもどのアルゴリズムを選ぶべきか 機械学習にはどんな種類があるか 分類(Classifi …

「AIPyハンズオン#1」開催レポート

第1回AIPyハンズオン勉強会を開催したのでその開催レポート AIPy (アイパイ) ハンズオン #1 (2018/04/12 19:30〜) この勉強会について 仕事で機械学習などを活用したいけど何 …

「Chainerで学習した対話用のボットSlackで使用Twitterから学習データを取得してファインチューニング」を試してみる

本記事は以下の勉強会用に作成した記事で現時点では最後まで動作確認できていない箇所があるのでご注意ください。問題解決したら更新します。 AIPy (アイパイ) ハンズオン #4 (2018/09/20 …

機械学習におけるアルゴリズム

前回のパーセプトロンに引き続きこの勉強会用に仕事ではじめる機械学習を元に機械学習におけるアルゴリズムをまとめる。 AIPy (アイパイ) ハンズオン #3 (2018/07/19 19:30〜) この …