🔖

レコメンドシステム——協調フィルタリング(Collaborative Filtering)

2023/09/25に公開

シーリズの目次

レコメンドシステムのシーリズをここにまとめています。
https://zenn.dev/datasciencekun/articles/dc0f61c0ca7f8d

無料相談コース(未経験OK)

  • 機械学習やレコメンド分野に悩んでいる人
  • 機械学習やレコメンド分野に携わりたい人

ぜひ下記の無料コースへお申し込みください!
機械学習エンジニア、レコメンドエンジニアになるためのサポート

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

レコメンドシステムの主な問題点は何ですか?

情報技術とインターネットの発展に伴い、私たちは情報過多の時代に入っています。この時代には、情報消費者や情報生産者は大きな挑戦にぶつかっています。

  • 情報消費者:大量の情報の中から自分の興味のある情報をどうやって見つけるのですか?
  • 情報の生産者:どのようにして自分の作った情報を差別化し、より多くのユーザーの注目を集めるのでしょうか。

レコメンデーションシステムが解決する問題は、「情報過多」の中で、いかにユーザーが興味のある情報を効率的に入手できるかということです。

情報消費者が自分にとって価値のある情報を発見するのを助ける一方で、情報生産者の生産した情報をそれに興味を持つユーザーの前に見せることができます。

レコメンドシステムの論理構成

そもそもレコメンデーションが扱うのは「人」と「情報」の関係です。「人」と「情報」をもとに、興味のある「情報」を見つける方法を構築したのです。そこで問題の中で重要な3つのポイントを抽象化しました。

  1. コンテンツ情報(Item)
    「メッセージ」の具体的な意味は、場面によって千差万別です。たとえば、商品のレコメンデーションでは「商品情報」、動画のレコメンデーションでは「動画情報」、ニュースのレコメンデーションでは「ニュース情報」を、便宜上「モノ情報」と呼んでいます。

  2. ユーザ情報(User)
    レコメンデーションシステムは、「人」の視点から、「人」の興味関心をより確実に推測するために、「人」に関する情報を大量に活用したいと考えています。過去の行動、人口属性、関係ネットワークなどを総称して「ユーザー情報」と呼びます。

  3. コンテキスト(Context)
    具体的なレコメンデーションシーンにおけるユーザの最終的な選択は、一般的に「コンテキスト情報」とも呼ばれる、時間、場所、ユーザの状態などの一連の環境情報に影響されます。

抽象化された3つのキーワードをもとにレコメンドシステムの論理構造を定義しました。

つまり、レコメンドシステムが行うことは、一言で言えば、どのような人が、どのような場面で、どのようなモノに興味を持っているかを表す「関数」を定義することであり、その定義の仕方を一般的には「レコメンデーションのアルゴリズム」と呼んでいます。

協調フィルタリング

協調フィルタリング「Collaborative Filtering」とは、過去の好みや趣味に近いユーザーの選択に基づいて、ユーザーにモノを推薦するという考え方です(ユーザーの履歴行動データをマイニングして好みの偏りを発見し、一般的には、ユーザーの行動データ(評価、購入、ダウンロードなど)のみに基づき、アイテムの付加情報(アイテム自体の特徴)やユーザーの付加情報(年齢、性別など)には一切依存しません。現在広く使われている協調フィルタリングアルゴリズムは、近傍を用いたものですが、主に次の2つのアルゴリズムがあります。

  • ユーザー協調フィルタリングアルゴリズム(UserCF)に基づいて:ユーザーと趣味が似ている他のユーザーの好きな製品をユーザーに推薦します。
  • アイテム協調フィルタリングアルゴリズム(ItemCF)に基づいて:ユーザーが以前気に入っていたものと似たものを推薦します。

ユーザー協調フィルタリングアルゴリズム(UserCF)

UserCFは1993年に遡る非常に古いアルゴリズムですが、これは単純な考え方です。ユーザーAがパーソナライズされたレコメンデーションを必要としているときに、自分と似たような趣味を持つ他のユーザーを見つけて、ユーザーAさんが聞いたことのないモノをおすすめします。

ユーザーベースの協調フィルタリングアルゴリズムには主に2つのステップがあります:

  1. 対象となるユーザーの関心に似た集合を見つけること、すなわち各ユーザー間の類似度を計算することです。
  2. このコレクションの中でユーザーが気に入ったもの、ターゲットユーザーが聞いたことのないものを探してユーザーに紹介します。

アイテム協調フィルタリングアルゴリズム(ItemCF)

アイテム協調フィルタリング(ItemCF)の基本的な考え方は、すべてのユーザの過去の嗜好データからモノ同士の類似性をあらかじめ計算しておき、ユーザが好むモノと類似性のあるモノをユーザに推薦するというものです。たとえば、モノaとcがよく似ていて、aが好きなユーザーはcも好きで、ユーザーaはaが好きだから、cをユーザーaに推薦する、という具合です。

ItemCFは、モノのコンテンツ属性を利用して類似度を求めるのではなく、主にユーザーの行動履歴を分析して類似度を求めるアルゴリズムで、モノaとモノcの類似度が高いのは、モノaを好むユーザーがモノcを好むからだと考えます。

モノをベースにした協調フィルタリングアルゴリズムは、主に2つのステップに分けられます。

  1. モノ同士の類似度を計算する
  2. 商品の類似度やユーザーの履歴行動からおすすめリスト(その商品を購入したユーザーがよく購入している他の商品)を作成します。

よくある類似度計算の手法

類似度とは、2つの事象の類似性を比較することです。一般的に物事の特徴の間の距離を計算することによって、距離が小さければ、類似度は大きいです;距離が大きければ、類似度は小さくなります。ここでは、集中的によく見られる類似度の算出方法を例に挙げてみます。

  • ユークリッド距離(Euclidean Distance)
    平面幾何学や立体幾何学での距離は、通常はユークリッド距離ですから、ユークリッド距離が一番わかりやすいです。

  • コサイン類似度(Cosine Similarity)
    2つの属性ベクトルAとBが与えられると、そのコサイン類似性θは以下のように点積とベクトル長さによって与えられる。

    コサインの類似度は、高次元の場合でも「同じときは1、直交するときは0、反対のときは-1」という性質を持ちますが、ヨーロッパ的な距離の数値は次元の影響を受けて範囲が一定ではなく、意味も曖昧です。しかし、ベクトルの長さを正規化するとピアソン相関係数になります。この場合、ヨーロッパ式の距離とコサインの類似度は単調な関係になります。

  • ピアソン相関係数(Pearson Correlation)
    ピアソン相関係数は共分散を2つの変数の標準偏差で割ったものですが、ピアソン相関係数はコサインの類似度よりも独立したスコアをユーザ平均を使って補正することで、ユーザスコアのバイアスの影響を少なくしています。公式は次の通りです。

一般的には、データを正規化して、指標間の次元の影響を排除する必要があるので、協調フィルタリングのほとんどの場面では、ヨーロッパ式の距離やコサインの類似度を使えばいいのです。ヨーロッパ式の距離は数値の絶対的な違いを示し、コサインの距離は方向の相対的な違いを示せばいいのです。具体的な問題には具体的な分析が必要です例えば:

  1. 2つのドラマのユーザの視聴行動を集計すると、ユーザAの視聴ベクトルは(0,1)、ユーザBは(1,0)となり、このとき両者のコサインの距離は大きく、ヨーロピカル距離は小さくなります。コサイン距離を使用することは明らかですが、相対的な差異に焦点を当てて、異なるビデオに関する2人のユーザの好みを分析します。

  2. ログイン回数と平均視聴時間を特徴とするアクティブ度を分析したとき、コサイン距離は(1,10)と(10,100)の2人のユーザーの距離が近いと考えられますが、明らかに大きな違いがあります。ここでは絶対的な数値の差に注目して、ヨーロッパ式の距離を使います。

協調フィルタアルゴリズムの比較

UserCF ItemCF
性能 利用者が少ない場合に適しています。ユーザー数が多ければユーザー類似度行列の計算にはコストがかかります モノの数がユーザー数より明らかに少ない場合に適していますが、モノが多い場合は類似度行列が大きくなります。
適用領域 実効性が高く、ユーザーの興味の偏りが少ない分野に適しています。 ロングテールのアイテムが豊富で、ユーザーの個性化が強い分野に向いています。
リアルタイム性 ユーザーの新しい行動がレコメンデーション結果に変化をもたらすとは限りません ユーザーの新しい行動は、必ずレコメンデーション結果に変化をもたらします。
コールドスタート 新規ユーザーがわずかなモノに行動を起こしても、すぐにパーソナライズされたレコメンドをすることはできません。ユーザー類似度テーブルは、一定期間ごとにオフラインで計算している新規ユーザーが、あるモノに行動を起こすと、そのモノに関連した別のモノをレコメンドしてくれるからです。 新しいモノが登場してからしばらく経つと、行動を起こしたユーザーと同じような興味を持った他のユーザーにおすすめすることはできますが、オフラインで類似度リストを更新せずにおすすめすることはできません。
推荐理由 ユーザーが納得するような説明をするのは難しいです ユーザーの過去の行動を使って、ユーザーに説明を推奨することで、ユーザーを納得させることができます。

実例


Aliceはアイテム5を何点つけるか知りたいでしたら...

アイテム協調フィルタリングアルゴリズム(ItemCF)の実現

ステップ1:モノ5と他のモノの類似度を計算します。ここではピアソン相関係数を使って比較します。正規化しません。

類似度行列はnumpyを使って簡単に算出できます。

import numpy as np
import pandas as pd

# items[i] アイテムi+1, その中でi=0,1,2,3,4
items = np.array([
    [3, 4, 3, 1],
    [1, 3, 3, 5],
    [2, 4, 1, 5],
    [3, 3, 5, 2],
    [3, 5, 4, 1]]
)
cols = ['item' + str(idx) for idx in range(1, 6)]
pd.DataFrame(data=np.corrcoef(items), columns=cols, index=cols)

ステップ2:モノ5に一番近いn個のモノを探します。ここはモノが少ないので、n=2とします。
ステップ1で計算した類似度の行列で、モノ5とモノ1,4が似ていることがわかりました。

ステップ3:Aliceの最も近いn個のモノの採点からモノ5の採点を計算する。
一般的には、ユーザー類似度と類似したユーザーの評価を加重平均して、ユーザーの評価を予測します。

しかし、高い点数をつける人もいれば、低い点数をつける人もいます。このようにユーザーのスコアの偏りが明らかな場合は、モノのスコアとそのユーザーのすべてのスコアの差を加重平均して解消するという式が必要です。

モノ5とモノ1,4の類似度は0.97と0.58、モノ1,4の平均は16/5=3.2と17/5=3.4、モノ5の平均は13/4=3.25。結果は下記のようになります。

ユーザー協調フィルタリングアルゴリズム(UserCF)の実現

ステップ1:ユーザー5と他のユーザーのピアソン相関係数を計算します。

import numpy as np
import pandas as pd

# items[i] アイテムi+1,その中でi=0,1,2,3,4
users = np.array([
    [3, 1, 2, 3,],
    [4, 3, 4, 3,],
    [3, 3, 1, 5,],
    [1, 5, 5, 2,],
    [5, 3, 4, 4]]
)
cols = ['user' + str(idx) for idx in range(1, 6)]
pd.DataFrame(data=np.corrcoef(users), columns=cols, index=cols)


ステップ2:ユーザー5に最も近いn人のユーザーを探します。ここでもn=2とします。
最も近い2人のユーザーはユーザー1、2です。

ステップ3:Aliceの最も近いn人のユーザーの採点から、モノ5の採点を計算します。
ユーザー5とユーザー1,2の類似度は0.85と0.71、ユーザー1,2の平均は12/5=2.4と19/5=3.8、ユーザー5の平均は16/4=4。
結果は下記のようになります。

まとめ

この記事の主な分析と紹介した協同フィルタリングアルゴリズムの基本原理は、このアルゴリズムは比較的古いですが、思想と原理は私たちを研究する価値があります。結局のところ、このアルゴリズムは、任意のアイテム自体やユーザー自身の属性に依存していませんが、ユーザーとアイテムの相互作用情報だけで推薦タスクを完了することができます。そのモデルは汎用性が強くて、説明が強くて、対応するデータ分野の専門知識があまり必要なくて、工程の実現は簡単で、効果も悪くありません。これはまさにこのモデルが初期の流行の原因です。

同時にもっと前の一種類の経典の推薦のアルゴリズムを使うとして,それは後のほかの伝統的な模型のアルゴリズムの進化と深さの模型のアルゴリズムの進化に対してすべて啓下の作用があります。

コード実例

協調フィルタリングの簡単なコードは下記のリンクで見てください!
https://github.com/datasciencekun/starmie/blob/master/recall/collaborative_filtering_demo.ipynb

Discussion