BrainPad株式会社ブレインパッドのデータ活用に関する取り組みや製品・サービス開発の裏側、社員の日常などをご紹介します。デジタルマーケティングこんにちは、アナリティクスサービス本部の小田です。寒くなるとクシャミをするたびにギックリ腰の予感がします。このところ業務でレコメンデーションに触れることが多いので、本ブログではレコメンドについて、実際にRやPythonでコードを書きながら、ゆるゆると考察していきたいと思っています。今後複数回にわたってレコメンド手法の概念や実装方法を中心に、基礎的な内容から最近流行りの技術まで幅広く触れる予定です。手法以外にも、評価方法やコールドスタート問題に代表されるレコメンデーションの課題など、様々なトピックに触れたいと思っています。不定期に書いていく予定ですが、その辺はゆるふわということでご了承ください。今回はレコメンドアルゴリズムの基本とも言える「協調フィルタリング」について、機械学習手法のkNN回帰との比較を通して考察します。協調フィルタリングとはレコメンド手法を簡単に分類すると、以下のような図となります。その中で、協調フィルタリングは、広義にはユーザの利用履歴(トランザクションデータ、ユーザ・アイテム行列)を利用するレコメンド手法全体を指します。そのため、広義の意味での「協調フィルタリング」に含まれるアルゴリズムや手法は非常に多くなります。商品やユーザの属性情報を使ってレコメンドをする「内容ベースフィルタリング」との対比としてこの言葉は使われます。協調フィルタリングは更に、近傍ベース(メモリベース)とモデルベースに分類されます。2つの違いはレコメンド(推定)をする際にトランザクションデータをそのまま利用するのか、事前にモデル構築を行うのかにあります。狭義に協調フィルタリングといった場合、前者の近傍ベースアプローチを指すことが多いと思います。本ブログでフォーカスしているのも、この近傍ベース協調フィルタリングになります。近傍ベース協調フィルタリングのコンセプトは、「類似度」がキーになっています。過去の利用履歴から似たもの同士を明らかにし、この類似度を使ってオススメ商品を推定していきます。類似度といった場合、ユーザ同士の類似度と商品同士の類似度の2つが考えられますが、前者を使う協調フィルタリングをユーザベース、後者をアイテムベースと言って区別したりします。ユーザベースの協調フィルタリングで「類似度」というコンセプトを考えた場合「自分と好みや行動が似ているユーザさんは、私好みの商品を知っているはずだ。その人達にオススメを聞こう」というものです。これは日常我々も考えるような、ごく自然な発想です。近傍ベース協調フィルタリングは古くからある手法ですが、コンセプトも実装もシンプルでそこそこ良い精度が出るため現在も広く利用され、様々な改良が行われています。このような特徴から、各種手法を検討する際のベースラインとしても、よく使われます。協調フィルタリングの特筆すべき魅力は、利用履歴さえあれば、「どんなユーザなのか」や「どんな商品なのか」を知らなくてもレコメンドが可能な点です。あなたが明日突然知識が全くない事業分野でECサイトのマーケ担当者となっても、ユーザIDと商品IDからなる利用履歴のデータさえあれば、それなりのレコメンドシステムを構築することが可能です。極端な例ですが、原理としては商品名すら知る必要はありません。協調フィルタリングの課題面については後段で述べるとして、レコメンデーションシステムの体系的な分類や詳しい説明については、他に素晴らしい調査やまとめがありますので、詳細が気になる方は以下のようなサイトを参考にしてみてください。system"でググると色々出てきて良いかもしませんユーザベース協調フィルタリングのロジックここから、ユーザ同士の類似度にもとづいて、オススメを決定するユーザベース協調フィルタリングのロジックを、考察していきます。ユーザベース協調フィルタリングのロジックは、いわゆるkNN回帰という機械学習手法になります。kNN(k-Nearest-Neighbor、k近傍法)を簡単に説明すると、推定する対象に最も特徴が似ているk個の観測値を参考にし、値を推定しようというものです。kNNは一般に分類問題に適用されることが多いですが、オススメ度のような連続値を推定する場合、明示的にkNN回帰と呼んでいます。具体的な手順を見るため、映画のレビューサイトを題材として考えます。ユーザが自分が見た映画作品を評価付けできるサイトです。ここで、あるユーザ(鈴木さん)がまだ評価していない作品に対して協調フィルタリングを使って評価値を推定し、推定された評価の高い上位10作品(Top-Nレコメンド)をレコメンドするとしましょう。単純化すると、手順は以下のようになります。推定評価値の高い上位10の映画を抽出するこれが典型的なユーザベース協調フィルタリングによるTop-N(ここではN=10)リスト作成手順です。上記手順の1と2の部分が、kNN回帰による推定に該当します。具体的な評価値を用いて推定してみましょう。下記のような評価履歴(ユーザ-アイテムの評価値行列)があったとします。;Batman)に対する評価値はいくつと推定できるでしょうか。1とりあえずRでデータを入力し、評価値のヒートマップをプロットします。"gray90"))評価値行列のヒートマッププロット注:評価は1-5の5段階とします(大きいほど高評価)ぱっと見た感じ、鈴木さんの評価はユーザ2と似ている感じがしますが、どうでしょう。類似性を定量化するために、なんらかの類似度を算出する必要があります。ここではユークリッド類似度(距離)を用いて類似度を計算してみます。(一旦、ここでは類似度を単純に距離の逆数として、以下のように書きました。普通は分母に1を足すと思います。0.2182179確かにユーザ2が近いですね。鈴木さん自身との類似度はなぜか0です。Infじゃないのね...目安までにユークリッド距離に基づいた、鈴木さんと他のユーザ間の距離関係を図示しておきましょう。※各ユーザの円周上の位置(角度)はランダムなので意味はありません。類似度が出ましたので、この中から鈴木さんと類似度の高いユーザを3人(k=3)選んで、ダークナイトに対する評価を推定します。類似度の高い人の評価をより重視するために、類似度を重みとして3人の平均評価値(加重平均)をとります。4.045465めでたく評価値が推定できました。推定されたダークナイトの評価値は4.0と高めなので、結構オススメのようです。一応、今後の比較のため、類似度と推定方法を数式で書いておきます。neighbor)の集合とします。kNN回帰のライブラリでも計算してみる念のため、既存のkNN回帰のライブラリを使って、推定値が同じになるのか確かめてみます。RにkNN回帰を手軽にできそうなパッケージが見当たらなかったので、Pythonのscikit-learnを利用します。統一感がないですが、、、まあ、ゆるふわなのでご了承ください。4.04546516])同じになりました。協調フィルタリングとkNN回帰の実際の相違このように、協調フィルタリングとkNN回帰の基本的な考え方自体は同じです。それ故に、協調フィルタリングとkNNの特徴(長所、課題)も似通ったものとなります。計算コスト、スケーラビリティが課題ということになります。ここまで見たように、ロジックがシンプルで実装が比較的容易ですが、その割に精度もそこそこ良いです。model)、推定の都度、全データに対して計算を行うアプローチをとるため、データが大きくなった場合に計算コストが高くなります。計算量を効率よく減らすためのアルゴリズムの工夫などにより、この課題は改善されているようですが、他の手法に比べると依然課題として挙げられます。各種手法と精度比較する際のベースラインのような立ち位置にあることも、機械学習におけるkNNの立ち位置同様です。kNNとの差異さて協調フィルタリングとkNNのロジックの類似性を見てきましたが、一般的なkNNのライブラリを使って協調フィルタリングによるレコメンドシステムを実装できるかというと、これは多分結構面倒だと思います。レコメンデーションと一般的な教師あり機械学習モデルでは、想定されている問題設定が異なるため、色々とカスタマイズが必要になります。協調フィルタリングとkNNの主な差異kNNでの距離・類似度はユークリッド距離、マハラノビス距離を利用する事が多いと思いますが、協調フィルタリングではコサイン類似度、ピアソン相関、Jaccard係数が多いです。レコメンデーションの問題設定はもともと「大量の欠損値を含む」事を前提としてるので一般的な機械学習の前提と趣が異なっていて、この辺がスパース性やコールドスタート問題といったレコメンドシステムで特徴的な課題に直結しています。※kNNによる欠損値対処というアプローチもあるので、興味のある方はトライしてみるのも良いかもしれません。impute"とかでググると情報が多いです。基礎原理は以上ですが、実際のレコメンドでは、さらに以下のようなポイントを工夫していくことになるでしょう。ブログでは、今回紹介したユーザベース協調フィルタリングについて、実際に欠損の多い評価値行列に使って実装したり、協調フィルタリングを利用できるライブラリの使い方や、評価方法のまとめなどを確認できたらと思います。長くなってきましたのでこの辺で。●「レコメンドつれづれ」の連載記事blog.brainpad.co.jpblog.brainpad.co.jp当社では、データサイエンティストの皆さまを積極的に採用しています。ブログに興味を持った方はぜひご応募ください!データサイエンティストの他にもエンジニアやコンサルなどの職種も募集していますので、データ分析に興味のある方もぜひご応募ください。...強化学習入門の第3弾。採用ページスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。