0facebook0twittertはてぶ0こんにちは!木内です。一般的にパーソナルリコメンド(Amazonの「この商品を購入した人はこのような商品にも興味を持っています」のようなもの)の実装には大規模なデータセットを元に、機械学習のテクニックを駆使して実装する必要がありました。Neo4jを活用することで同じようなことを、より小規模なリソースで実装することができます。加えて今までのバッチ処理では難しかった、リアルタイムのリコメンドも可能にします。解説内容と同じではありません。)で実際に体験してみてください。リコメンドがもたらすもの(リテール、eコマースなどの業界では)パーソナライズされた商品リコメンドによって、コンバージョンレートの増加、売上の増大、顧客満足度の向上を期待することができます。Neo4jによって実現できるパーソナルリコメンドは、従来のバッチ処理によるような処理ではなくリアルタイムのリコメンド結果を期待することができます。以降の記述では、デモ用の映画データセットを使用してパーソナルリコメンドを実装していきますが、同じ考え方を異なる製品(例えば商品の小売など)に適用することも可能です。グラフデータを活用することによるパーソナルリコメンドのメリットパーソナルリコメンドの実装はグラフデータベースの用途として一般的です。グラフデータベースを使用してパーソナルリコメンドを実装することには以下のようなメリットがあります。Neo4jではグラフデータそのものはオンメモリで探索することが可能です。このグラフ構造を探索することによって、従来のリレーショナルデータベースでは大量のデータをスキャンしなければいけなかった分析とは異なる手法で、リアルタイムのリコメンドを生成することができるようになります。これによりパーソナルリコメンドの用途がさらに広がることが期待できます。プロパティグラフモデルは、複数のデータセットからのデータ結合を容易に実現することができます。データベースの抜粋から構成されたグラフデータベースを元に、映画のリコメンドを実装してみます。開きながら記事を読んでいただけると、より実感がわくと思います。アイテムベースフィルタリングリコメンドに用いられる手法は大きく2種類に分類されます。アイテムベースのフィルタリングを実装してみます。一般的にリコメンドされるアイテム(今回の例では映画)は、ユーザが以前に見ていたり、高く評価していたり、購入しているアイテムと似ていることが多いです。ジャンル、監督、出演者が同じの映画を抽出します。これがアイテムベースフィルタリングの原型になります。Neo4jにおいてこのクエリは非常に高速に処理されます。50見た映画と同じジャンルの映画を抽出してみます。インセプション)と同じジャンルの映画の一覧を抽出します。genresデータの中に、"映画を見た(=評価した)"という情報が含まれているのであれば、「自分が見た映画と同じジャンルのまだ見ていない映画のうち、評価の高い順に10件表示する」ことも可能になります。以下のクエリがその処理例になります。Freeman"がまだ評価していない映画につけられた評価合計の高い順から10個の映画を返します。10見た映画のジャンルの偏り(好み)を考慮する場合、以下のようなクエリになります。10上記の2つのクエリの結果は興味深く示唆をもたらします。下側のクエリはより結果が安定しています。開発においては検証しやすく、テストしやすいという特性を持ちます。ユーザの側に立ってみれば、毎回結果が変わらないリコメンドは魅力的に見えないかもしれません。変わり映えしないリコメンド内容に飽きが来て、結果的にリコメンドが利用されないという結果を招くかもしれません。上側のクエリは視聴ジャンル傾向を考慮していないためランダム性があり、毎回リコメンドの結果が異なります。リコメンドの基準が曖昧になっているため、合っているような合っていないような、少し不思議な感覚にとらわれます。ユーザにとって見れば、毎回リコメンドを見るたびに新たな出会いがあり、リコメンドの内容に興味をひかれるかもしれません。このようにリコメンドの利用シーンにおいては精度が高ければよりよいリコメンドとは限りません。ユーザに探索の余地を残しておくのもエンジニアの腕の見せどころかもしれません。っぽく振る舞うような面白さがあります。Jaccard係数リコメンドを算出する複数の要素に係数をかけ、重み付けをしてもいいかもしれません。以下の例ではジャンル、俳優、監督それぞれが同じである別の映画に対して、ジャンル、俳優、監督それぞれに異なる係数をかけたスコアを算出しています。100集合間の類似性を恣意的な係数ではなく、より一般的な指標で示すことも可能です。インセプション)と同じジャンルにある映画それぞれに対してジャンル類似性を示すJaccard係数を計算し、類似性の高い順に表示するクエリです。100ジャンルではなく他の要素(出演俳優、監督など)に対してもJaccard係数は算出することができます。協調フィルタリング次はリコメンドの定番とも言える協調フィルタリングをやってみましょう。協調フィルタリングはAmazon.comの「おすすめ商品」の例があまりに有名です。多くのユーザの嗜好情報を蓄積し、あるユーザと嗜好の類似した他のユーザの情報を用いて自動的に推論を行います。次の例はもっとも原始的な協調フィルタリングの例です。自分と似たユーザが買っているアイテムは、自分に合うかもしれないため、リコメンドの対象になります。クリムゾン・タイド)に評価を与えたユーザが評価した映画を抽出します。25つまり協調フィルタリングでは2人のユーザ、2つのアイテムがどの程度類似しているかを定量化します。2つの人・モノの間の類似性は以下のように示すことができます。Freeman"に最も近い好みを持つユーザを抽出し、類似性と評価に基づき映画をスコアリングしてユーザに提示します。kNN)を使うのもいいアイデアかもしれません。25さいごにNeo4jを活用して作成したグラフデータをもとに、いろいろなリコメンドができることを示しました。リコメンド自体は今ではある程度確立されたジャンルであり「この方法でなければできない」というようなものではなく、様々なユースケースに応じた工夫ができるということも魅力ではないかと思います。上記に述べた例だけではなく、他の機械学習アルゴリズムと組み合わせて、その人・サービスならではの味付けをすることもできます。170,000と小規模なものですが、Neo4j自体はノード数、リレーションシップ数が数千万、といった大規模なグラフデータでも高速に動作します。様々なユースケースに応用が効くと言えるでしょう。紹介記事を書いていきますのでご期待ください。LABの情報を逃さずチェックしよう!メールアドレスを登録すると記事が投稿されるとメールで通知します。※登録後メールに記載しているリンクをクリックして認証してください。#28に、弊社エンジニア細見・李が登壇します。LABの情報を逃さずチェックしよう!メールアドレスを登録すると記事が投稿されるとメールで通知します。※登録後メールに記載しているリンクをクリックして認証してください。