パーソナライズレコメンドについて、実例をまじえて紹介してみる | SiTest (サイテスト) ブログ

メニューボタン閉じるボタン

パーソナライズレコメンドについて、実例をまじえて紹介してみる

レコメンドとは、 Web サイトを訪れたユーザの行動履歴を基にユーザの興味関心に関連するアイテムを奨める技術です。
このようなレコメンドの仕組みを取り入れることによって、ユーザの Web サイトの閲覧動機を促進したり、また、それに付帯する Web サイトの閲覧追加やコンバージョンアップに貢献することにつながります。
特にユーザーの行動履歴を基に、そのユーザーの嗜好を把握してアイテムを推奨するパーソナライズレコメンドは、重要だと考えられます。
今回は、マッチングサイトでのパーソナライズレコメンドでの実例を簡単にご紹介したいと思います。

  • ■ 適応したパーソナライズレコメンドの手法

パーソナライズレコメンドの手法としては、色々考えられますが、今回ご紹介するマッチングサイトでのパーソナライズレコメンドはベイジアンネットワークに基づく手法を採用しました。
また、トラフィック量が多いサイトなので、計算量が多大になるので、ベイジアンネットワークは単純な2部グラフとしています。
タスクとしては、以下のようになります。

■ 学習タスク

  1. 構造学習
     • 初期教師データの各変数間の確率分布を基に、平均相互情報量により各変数間の依存関係を学習します。
     • 親側の変数の組が子の変数に対して同時に影響していると仮定したベイジアンネットのモデルを構築します。
     
  2. CPT 学習
     • 観測されたデータを基に条件付き確率のテーブルを構築します。
     
  3. 定期学習
     •構造学習と CPT 学習を履歴データを基に定期的に学習します。

■ 予測タスク
  
1. 尤度を求める
 • CPT (条件付き確率表) から P(対象変数|親側の同時確率)を求め、確率分布を取得します。
    
2. スコアリング
 • 求められた尤度より、対象となる集合にスコア付けを行い、尤もらしいマッチング結果を提示します。

このように、個々のユーザに対して、そのユーザ側とアイテム側の変数同士の関連性に対して、より強い重みをつけて
そこから得られた CPT (条件付き確率表) から、ユーザの嗜好性にマッチするアイテムを推奨します。
また、ユーザの履歴データからベイジアンネットのモデルの構造と CPT (条件付き確率表) を追加学習してパーソナライズレコメンドの精度を高めていく手法です。

  • ■ 検証

それでは、実際に行った検証データを見てみましょう。

以下の各メンバーが持つ変数に対して検証を行いました。

my @domain_list = (
               'city',           # 現在居住地の都道府県
               'birthday',           # 誕生日(年代)
               'style',          # 体格
               'height',             # 身長
               'weight',             # 体重
               'bloodtype',          # 血液型
               'income',             # 収入
               'academic_background',# 学歴
               'cigarette',          # タバコ
               'alcohol',            # アルコール
               'marital_status',          # 結婚歴
               'contact_type',       # まずはじめに
               'hobby_category',           # 趣味
               'occupation',         # 職業
               'gamble',             # ギャンブル
               'profile_proof',      # 証明の有無
               );

レコメンド予測

・CPTから P(対象変数|親側の同時確率)を求める。
・上記で求められた尤度より、対象となるメンバ集合にスコア付けを行い、
 尤もらしいマッチング結果を提示しています。

score(W=w) = Σαi * log(p(Ci))
※ αiは各変数の重み,Wは直近ログインしたN人の集合

※ レコメンド例(和歌山県在住、30代、男の場合)
+-----------+-----+------+----------+-------+--------+--------+-----------+--------+---------------------+-----------+---------+----------------+--------------+----------------+------------+--------+
| member_id | sex | city | birthday | style | height | weight | bloodtype | income | academic_background | cigarette | alcohol | marital_status | contact_type | hobby_category | occupation | gamble |
+-----------+-----+------+----------+-------+--------+--------+-----------+--------+---------------------+-----------+---------+----------------+--------------+----------------+------------+--------+
| xxxxxxxxxx  | M   | 30   | 2        | 1     | 3      | 99     | A         | 2      | 6                   | 99        | 99      | 1              | 2            | 99             | 99         | 99     |
+-----------+-----+------+----------+-------+--------+--------+-----------+--------+---------------------+-----------+---------+----------------+--------------+----------------+------------+--------+

      'city' => {
                  '27' => '0.263157894736842',
                  '36' => '0.0526315789473684',
                  '24' => '0.0526315789473684',
                  '30' => '0.473684210526316',
                  '14' => '0.157894736842105'
                },
      'marital_status' => {
                            '6' => '0.00370275791624106',
                            '1' => '0.80649897854954',
                            '4' => '0.0115551583248212',
                            '3' => '0.102847293156282',
                            '7' => '0.000383043922369765',
                            '2' => '0.0730337078651685',
                            '5' => '0.00197906026557712'
                          },
      'contact_type' => {
                          '1' => '0.196428571428571',
                          '4' => '0.0357142857142857',
                          '3' => '0.0892857142857143',
                          '9' => '0.125',
                          '2' => '0.553571428571429'
                        },
      'style' => {
                   '6' => '0.037037037037037',
                   '8' => '0.0740740740740741',
                   '1' => '0.654320987654321',
                   '3' => '0.0740740740740741',
                   '7' => '0.123456790123457',
                   '2' => '0.037037037037037'
                 },
      'occupation' => {
                        '22' => '0.1',
                        '25' => '0.1',
                        '1' => '0.1',
                        '24' => '0.2',
                        '13' => '0.1',
                        '23' => '0.3',
                        '14' => '0.1'
                      },
      'birthday' => {
                      '1' => '0.228879859300139',
                      '4' => '0.00345685002122627',
                      '0' => '0.000606464916004609',
                      '3' => '0.104736490993996',
                      '9' => '0.000424525441203226',
                      '2' => '0.661774516344229',
                      '5' => '0.000121292983200922'
                    },
      'academic_background' => {
                                 '6' => '0.24',
                                 '3' => '0.24',
                                 '2' => '0.36',
                                 '5' => '0.16'
                               }
    };

それでは次に、ユーザの行動履歴のデータを追加してみましょう。

      'city' => {
                  '27' => '0.000554385186827808',
                  '1' => '0.332631112096685',
                  '36' => '0.000110877037365562',
                  '24' => '0.000110877037365562',
                  '30' => '0.000997893336290054',
                  '13' => '0.66526222419337',
                  '14' => '0.000332631112096685'
                },
      'marital_status' => {
                            '6' => '1.31053780856387e-05',
                            '1' => '0.335008034952495',
                            '4' => '0.189842925265',
                            '3' => '0.0952650268976587',
                            '7' => '1.35572876747986e-06',
                            '2' => '0.379862547179361',
                            '5' => '7.00459863197929e-06'
                          },
      'contact_type' => {
                          '1' => '0.133723498233216',
                          '4' => '0.0333480565371025',
                          '3' => '0.0336793286219081',
                          '9' => '0.464553886925795',
                          '2' => '0.334695229681979'
                        },
      'style' => {
                   '6' => '0.000330360092500826',
                   '8' => '0.000660720185001652',
                   '1' => '0.336196454135007',
                   '3' => '0.000660720185001652',
                   '7' => '0.661821385309988',
                   '2' => '0.000330360092500826'
                 },
      'occupation' => {
                        '25' => '0.000389105058365759',
                        '11' => '0.124513618677043',
                        '21' => '0.124513618677043',
                        '3' => '0.0622568093385214',
                        '14' => '0.000389105058365759',
                        '20' => '0.124513618677043',
                        '22' => '0.000389105058365759',
                        '1' => '0.000389105058365759',
                        '4' => '0.124513618677043',
                        '18' => '0.124513618677043',
                        '24' => '0.000778210116731518',
                        '23' => '0.12568093385214',
                        '13' => '0.0626459143968872',
                        '16' => '0.124513618677043'
                      },
      'birthday' => {
                      '1' => '0.33314231293356',
                      '4' => '0.665453814672208',
                      '0' => '1.10907915486838e-06',
                      '3' => '0.000191537970045768',
                      '9' => '7.76355408407863e-07',
                      '2' => '0.00121022717379237',
                      '5' => '2.21815830973675e-07'
                    },
      'academic_background' => {
                                 '6' => '0.378897451096621',
                                 '1' => '0.0687611144042679',
                                 '3' => '0.241375222288085',
                                 '7' => '0.034380557202134',
                                 '2' => '0.138589211618257',
                                 '5' => '0.137996443390634'
                               }

ユーザの嗜好により近い確率分布に変化していることがわかります。

■ 最後に

今回は、マッチングサイトでのパーソナライズレコメンドでの実例についてご紹介しました。
この実例は、パーソナライズレコメンドの一つの例に過ぎず、世の中には様々な手法にて、新たなレコメンドの技術が生まれています。
その流れに追いつけるよう、新たな手法を研究していきたいと思います。