SlideShare a Scribd company logo
1 of 68
Download to read offline
SQLで⾝につける!初めてのレコメンド
〜 基礎から応⽤まで 〜
■タイトル
⽥宮 直⼈ 加嵜⻑⾨
株式会社DMM.comラボ
ビッグデータ部
ビッグデータ活⽤基盤の構築に携わり、
SparkやSQL on Hadoopを⽤いた
レコメンド機能、ビッグデータ活⽤の
研究開発を担当
元株式会社DMM.comラボ
フリーランス
データ解析環境の設計・構築、
ログの設計、レコメンドAPIの作成など、
データに関連する業務全般を担当している。
■タイトル
Amazon
「SQL」「ビッグデータ」
両ワードで検索表⽰順1位獲得!
売れ筋ランキング
「データベース」
「プログラミング」
「情報学・情報科学」
の3カテゴリで1位獲得
■タイトル
前置き
■タイトル
⾃分の経験だけでは違いがあまりよくわからないものの中から、
どうしてもどれかを選ばなければならないということはよくある。
こうした時には、クチコミ、推薦状、新聞の書評や映画評、レストランガイド
などの他⼈からの推薦に頼ることを⽇常的に⾏っている。
推薦システムはこうした社会で普通に⾏われている⼀連の⾏為を補助したり、
促進したりする
Recommender Systemより
■タイトル
途中省略
■タイトル
以前、こんなことがありました。
■タイトル
レコメンドをやりたい
ディレクター エンジニアA エンジニアB
⼈によってレコメンドの解釈が異なる
ディレクターエンジニアA
どんなことやりたいの?
Amazonみたいなやつ
⾔った本⼈も定義が曖昧…
■タイトル
エンジニアA エンジニアB
どうやって作ればいいの?
さぁ…
どうやって作ればいいのかわからない
■タイトル
今回お話すること
■タイトル
レコメンドの定義を理解する
レコメンドの作り⽅を理解する
基礎編
レコメンドの評価指標を知る
レコメンドの改善ポイントを学ぶ
応⽤編
■タイトル
レコメンドの定義を理解する
■タイトル
レコメンドシステムを広義に捉える
モジュール 内容 表⽰例
リマインド ユーザーの過去の⾏動から、再度アイテムを
提案する
・最近⾒た商品
・もう⼀度買う
ランキング 閲覧数、購⼊数等に基づき、⼈気のあるアイテム
を提案する
・⼈気ランキング
・急上昇ランキング
コンテンツベース アイテムに付属する情報を元に、別のアイテムを
提案する
・この俳優が出演している
他の作品
レコメンド サービスを利⽤するユーザー全体の⾏動履歴から、
次に⾒るアイテム、関連するアイテムを推測し、
提案する
・この商品を⾒ている⼈は
こんな商品も⾒ています。
パーソナライズ
レコメンド
ユーザー個⼈の⾏動履歴から趣味嗜好を推測し、
興味のありそうなアイテムを提案する
・あなたへのオススメ
■タイトル
レコメンドシステムの効果
種類 内容 表⽰例
ダウンセル 価格が⾼く、購⼊を悩んでいるユーザーにより
安いアイテムを提案し、購⼊数を上げる
過去モデルで価格が安い
商品があります
アップセル より上位のモデルや⾼機能なアイテムを提案し、
購⼊単価を上げる
この商品には新しいモデルが
あります。
クロスセル 付属品、関連商品を⼀緒に購⼊してもらうことに
より、購⼊単価を上げる
⼀緒に購⼊されている商品
■タイトル
レコメンドを⼤きく2つに分ける
種類 内容 表⽰例
Item to Item アイテムに関連した、別のアイテムを提案する ・この商品を⾒ている⼈は
こんな商品も⾒ています。
User to Item ユーザー個⼈に最適化したアイテムを提案する ・あなたへのオススメ
■タイトル
Item to Itemでどっちのレコメンドを表⽰したいか
データソース 内容 データソース
閲覧ログ あるアイテムに類似したアイテムが提案
されやすく、選択肢を多く与える効果がある
テントに対して、
サイズ、形状、⾊の異なるもの
を提案する
購⼊ログ クロスセル可能なアイテムが提案されやすく、
購⼊単価を引き上げる効果がある
テントに対して、
⼀緒に利⽤するランタンを
提案する
■タイトル
データ獲得⽅法の違い
種類 内容 データソース
暗黙的なデータ獲得 ユーザーの⾏動から、好みを推測する。
データ量は多いが、評価の正確性に⽋ける。
・購⼊データ
・閲覧ログ
明⽰的なデータ獲得 ユーザーに好みを聞く。
データ量は少なくなるが、評価に段階を
設けることができ、評価の正確さは⾼い。
・クチコミ時の評価点
CD:◯◯
CD:△△
超好み!!
好きじゃない…
★★★★★
★★☆☆☆
買いたい商品が
決まっている
× △ ◯ ◯
選択肢を与える
◯ ◯ × ×
クロスセル
× △ ◯ ◯
■タイトル
トップページ 詳細ページ カート画⾯ 購⼊完了画⾯
どこに何を表⽰するのか考えてみる
Item to Item ⼀度閲覧したものや
購⼊したものをベース
に商品を提⽰する
閲覧ログを⽤いて
選択肢を提⽰するか、
購⼊ログを⽤いて
クロスセルを狙うか
⼀緒に購⼊される商品
を提⽰して、クロスセ
ルを狙う
⼀緒に購⼊される商品
を提⽰して、クロスセ
ルを狙う
User to Item ふらっと訪問した
ユーザーに⾏動の起点
となるきっかけを与え
る
次の買い物に繋がる
きっかけを与える
■タイトル
レコメンドの作り⽅を理解する
Item to Item レコメンドをSQLで実装してみる
ある商品Aを購⼊した⼈が、他に買っている商品Bを⾒つける
購⼊
Step 1
Item to Item レコメンドをSQLで実装してみる
ある商品Aを購⼊した⼈が、他に買っている商品Bを⾒つける
購⼊
Step 1
Item to Item レコメンドをSQLで実装してみる
ある商品Aを購⼊した⼈が、他に買っている商品Bを⾒つける
商品Aと商品Bを同時に購⼊している⼈の数をスコアとして、
スコアの⾼い商品順に並べる
購⼊
Step 1
Step 2
Item to Item レコメンド 〜 データの持ち⽅
レコメンドの説明でよく⽤いられるデータ構造
商品A 商品B 商品C 商品D 商品E …
ユーザA 0 1 0 0 1
ユーザB 0 0 1 1 0
ユーザC 0 1 0 1 0
ユーザD 0 1 0 1 1
ユーザE 1 1 1 1 1
… ユーザー×商品の相関マトリックス
ユーザと商品の相関を数値で表現する
(例えば、購⼊した商品を1、購⼊していない商品を0とする)
Item to Item レコメンド 〜 データの持ち⽅
レコメンドの説明でよく⽤いられるデータ構造
ユーザー×商品の相関マトリックス
列(カラム)が不定となるデータは扱いづらい
ほとんどの値が0となるため、データに無駄が多い
SQLで扱う場合の注意点
商品A 商品B 商品C 商品D 商品E …
ユーザA 0 1 0 0 1
ユーザB 0 0 1 1 0
ユーザC 0 1 0 1 0
ユーザD 0 1 0 1 1
ユーザE 1 1 1 1 1
…
商品A 商品B 商品C 商品D 商品E …
ユーザA 0 1 0 0 1
ユーザB 0 0 1 1 0
ユーザC 0 1 0 1 0
ユーザD 0 1 0 1 1
ユーザE 1 1 1 1 1
…
Item to Item レコメンド 〜 データの持ち⽅
商品数やユーザー数が増えても対応できる
値が0となる⾏は保持しない(データ量・計算量の削減)
ユーザ 商品 値
ユーザA 商品B 1
ユーザA 商品E 1
ユーザB 商品C 1
ユーザB 商品D 1
ユーザD 商品B 1
ユーザD 商品D 1
ユーザD 商品E 1
ユーザE 商品A 1
…
…
…
ユーザー×商品の相関マトリックス SQLでの表現
Item to Item レコメンド 〜 スコアの計算
ratingsテーブルに、ユーザと商品の組み
合わせに対するスコアを格納
SQLによるレコメンド計算
SELECT
user
, item
, score
FROM
ratings
;
user item score
ユーザA 商品B 1
ユーザA 商品E 1
ユーザB 商品C 1
ユーザB 商品D 1
ユーザD 商品B 1
ユーザD 商品D 1
ユーザD 商品E 1
ユーザE 商品A 1
…
…
…
Item to Item レコメンド 〜 スコアの計算
ratingsテーブルをユーザで⾃⼰結合
SQLによるレコメンド計算
SELECT
r1.user
, r1.item AS item1
, r2.item AS item2
FROM
ratings AS r1
JOIN
ratings AS r2
ON r1.user = r2.user
;
user item1 item2
ユーザA 商品B 商品B
ユーザA 商品B 商品E
ユーザA 商品E 商品B
ユーザA 商品E 商品E
ユーザB 商品C 商品C
ユーザB 商品C 商品D
ユーザB 商品D 商品C
ユーザB 商品D 商品D
…
…
…
Item to Item レコメンド 〜 スコアの計算
同じ商品の組み合わせは削除
SQLによるレコメンド計算
SELECT
r1.user
, r1.item AS item1
, r2.item AS item2
FROM
ratings AS r1
JOIN
ratings AS r2
ON r1.user = r2.user
WHERE
r1.item <> r2.item
;
user item1 item2
ユーザA 商品B 商品E
ユーザA 商品E 商品B
ユーザB 商品C 商品D
ユーザB 商品D 商品C
ユーザD 商品B 商品D
ユーザD 商品B 商品E
ユーザD 商品D 商品B
ユーザD 商品D 商品E
…
…
…
Item to Item レコメンド 〜 スコアの計算
商品のペアでGROUP BY
商品ペアの同時購⼊ユーザー数をCOUNT
SQLによるレコメンド計算
SELECT
r1.item AS item1
, r2.item AS item2
, COUNT(1) AS cnt
FROM
ratings AS r1
JOIN
ratings AS r2
ON r1.user = r2.user
WHERE
r1.item <> r2.item
GROUP BY
r1.item, r2.item
;
item1 item2 cnt
商品B 商品E 3
商品E 商品B 3
商品C 商品D 2
商品D 商品C 2
商品B 商品D 3
商品B 商品E 2
商品D 商品B 3
商品D 商品E 2
…
…
…
Item to Item レコメンド 〜 スコアの計算
cntの値で並べ替えてランクを付ける
SQLによるレコメンド計算
SELECT
r1.item AS target
, ROW_NUMBER()
OVER(PARTITION BY r1.item
ORDER BY COUNT(1) DESC)
AS rank
, r2.item AS recommend
, COUNT(1) AS cnt
FROM
ratings AS r1
JOIN
ratings AS r2
ON r1.user = r2.user
WHERE
r1.item <> r2.item
GROUP BY
r1.item, r2.item
;
target rank recommend cnt
商品B 1 商品D 3
商品B 2 商品E 3
商品B 3 商品C 1
商品B 4 商品A 1
商品C 1 商品B 2
商品C 2 商品D 2
商品C 3 商品E 1
商品C 4 商品A 1
…
…
…
…
Item to Item レコメンド 〜 スコアの計算
同時購⼊ユーザー数の計算
→ 数学的には、ベクトルの内積計算に相当
商品A 商品B 商品C 商品D 商品E …
ユーザA 0 1 0 0 1
ユーザB 0 0 1 1 0
ユーザC 0 1 0 1 0
ユーザD 0 1 0 1 1
ユーザE 1 1 1 1 1
商品B = (1 0 1 1 1)
商品D = (0 1 1 1 1)
商品B・商品D
= 1×0 + 0×1 + 1×1 + 1×1 + 1×1
= 3
Item to Item レコメンド 〜 スコアの計算
内積による相関量計算
→ 単純な内積では、ベクトルの⼤きさによって値が左右される
→ 購⼊者の多い商品ほど、内積の値も⼤きくなりやすい
商品X = (1 0 1 0 1 0 1 0 1)
商品Y = (1 0 1 0 1 0 1 0 0)
商品Z = (1 1 1 1 1 1 1 1 1)
商品X・商品Y = 4
商品X・商品Y = 5
感覚的には商品Xと商品Yの組み合わせが傾向が似ていそうだが、
商品Zはすべての商品と相関が⾼く出てしまう。
Item to Item レコメンド 〜 スコア計算の⼯夫
商品の購⼊者数(⼈気度)に関わらず、購⼊者の傾向が似ている商品を出したい
→ ベクトルの正規化
代表的なものは、2ノルム正規化
→ ベクトルの⻑さ(ノルム)を1に揃える
→ ベクトルの⻑さで各値を割り算する
|商品X| 5101010101 222222222
=++++++++=
|商品Y| 4001010101 222222222
=++++++++=
|商品Z| 9111111111 222222222
=++++++++=
Item to Item レコメンド 〜 スコア計算の⼯夫
商品の購⼊者数(⼈気度)に関わらず、購⼊者の傾向が似ている商品を出したい
→ ベクトルの正規化
代表的なものは、2ノルム正規化
→ ベクトルの⻑さ(ノルム)を1に揃える
→ ベクトルの⻑さで各値を割り算する
|商品X|
商品X
)
5
1
5
0
5
1
5
0
5
1
5
0
5
1
5
0
5
1
(=
|商品Y|
商品Y
)
4
0
4
0
4
1
4
0
4
1
4
0
4
1
4
0
4
1
(=
|商品Z|
商品Z
)
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
9
1
(=
Item to Item レコメンド 〜 スコア計算の⼯夫
商品の購⼊者数(⼈気度)に関わらず、購⼊者の傾向が似ている商品を出したい
→ ベクトルの正規化
代表的なものは、2ノルム正規化
→ ベクトルの⻑さ(ノルム)を1に揃える
→ ベクトルの⻑さで各値を割り算する
|商品X|
商品X
|商品X|
商品X
|商品X|
商品X
|商品X|
商品X
|商品Y|
商品Y
|商品Z|
商品Z
= 1.0
= 0.894…
= 0.745…
・
・
・
商品Xと商品Yの組み合わせの
スコアのほうが⾼くなる
⾃⼰相関は必ず1になる
正規化したベクトルの内積
→ コサイン類似度と呼ばれる
Item to Item レコメンド 〜 スコア計算の⼯夫
SQLによるベクトル正規化
ratingsテーブルに、ユーザと商品の組み
合わせに対するスコアを格納
SELECT
user
, item
, score
FROM
ratings
;
user item score
ユーザA 商品X 1
ユーザC 商品X 1
ユーザE 商品X 1
ユーザG 商品X 1
ユーザI 商品X 1
ユーザA 商品Y 1
ユーザC 商品Y 1
ユーザE 商品Y 1
…
…
…
Item to Item レコメンド 〜 スコア計算の⼯夫
SQLによるベクトル正規化
商品ごとのスコアの合計とノルムを計算
SELECT
item
, SUM(score) AS sum
, SQRT(SUM(score)) AS norm
FROM
ratings
GROUP BY item
;
item sum norm
商品X 5 2.2360…
商品X 4 2
商品X 9 3
Item to Item レコメンド 〜 スコア計算の⼯夫
SQLによるベクトル正規化
ウィンドウ関数を⽤いて、ノルムでベクト
ルの値を割り算
SELECT
user
, item
, SQRT(SUM(score)
OVER(PARTITION BY item))
AS norm
, score / SQRT(SUM(score)
OVER(PARTITION BY item))
AS nscore
FROM
ratings
;
user item norm nsocre
ユーザA 商品X 2.2360… 0.4472…
ユーザC 商品X 2.2360… 0.4472…
ユーザE 商品X 2.2360… 0.4472…
ユーザG 商品X 2.2360… 0.4472…
ユーザI 商品X 2.2360… 0.4472…
ユーザA 商品Y 2 0.5
ユーザC 商品Y 2 0.5
ユーザE 商品Y 2 0.5
…
…
…
…
Item to Item レコメンド 〜 スコア計算の⼯夫
SQLによるベクトル正規化
WITH
norm_ratings AS (
SELECT user, item
, score / SQRT(SUM(score)
OVER(PARTITION BY item)) AS nscore
FROM ratings
)
SELECT
r1.item AS target
, r2.item AS recommend
, SUM(r1.nscore*r2.nscore) AS score
FROM
norm_ratings AS r1
JOIN
norm_ratings AS r2
ON r1.user = r2.user
GROUP BY
r1.item, r2.item
;
正規化したベクトルで内積計算
item1 item2 score
商品X 商品X 1
商品X 商品Y 0.8944…
商品X 商品Z 0.7453…
商品Y 商品X 0.8944…
商品Y 商品Y 1
商品Y 商品Z 0.6666…
商品Z 商品X 0.7453…
商品Z 商品Y 0.6666…
…
…
…
■タイトル
レコメンドの評価指標を知る
■タイトル
とりあえず、レコメンドのリストを作成することが
できましたが、ここから問題点の解決や指標について
お話したいと思います。
■タイトル
商品A 商品B
多くのユーザーが購⼊する商品は
関連性に納得感がある
⼈気のない商品だと、
本当に関連があると⾔えるのか
商品X 商品Y
友達に頼まれて買っただけかもしれない
最低n⼈が閲覧・購⼊している商品だけ
レコメンドするようにしよう
最低n⼈が閲覧・購⼊している商品だけレコメンドするようにしよう
n(⾜切りライン)をいくつに設定すれば?
どうなれば、それらしいレコメンドと⾔えるのか
nを⼤きくする
関連はもっともらしくなる
対象が少なくなる
nを⼩さくする
対象は増える
関連が怪しくなる
対象の確認 関連の確認
レコメンドシステムをリリースする前に
・Item Space Coverage
・User Space Coverage
・スピアマンの順位相関係数
・適合率
対象の確認
指標 内容
Item Space Coverage アイテム全体のうち、何割のアイテムにレコメンド可能か
User Space Coverage ユーザー全体のうち、何割のユーザーにレコメンド可能か
30%
95%
Item Space Coverage
PageView
30%しかレコメンド可能な
商品がなかったとしても…
サービス内において、
その30%のレコメンド可能商品で
商品閲覧PVの95%をカバーできれば、
「問題ないのではないか」と
⾔う判断ができる。
関連の確認
レコメンドをリリースして、評価指標をどうするのか。
レコメンドのCTR、レコメンド経由のCVRとする
やってみないとわからない状態
事前にある程度、わからないものか…
適合率スピアマンの
順位相関係数
どんな結果となれば、嬉しいのか、
予め、アイテムに対して、理想的な結果、順位を
⼈⼿で定義して、その結果や順位を⽐較して、
レコメンドのリストが理想とどのぐらい近いかを
計算する
適合率スピアマンの
順位相関係数
レコメンドの結果 理想的な順位
この2つのランキングがどれほど類似しているかを計算する
keyword | rank | item
---------+------+---------
sql | 1 | book001
sql | 2 | book005
sql | 3 | book012
sql | 4 | book004
sql | 5 | book003
sql | 6 | book010
sql | 7 | book024
sql | 8 | book025
sql | 9 | book050
sql | 10 | book100
postgres | 1 | book002
postgres | 2 | book004
postgres | 3 | book012
postgres | 4 | book008
postgres | 5 | book003
postgres | 6 | book010
postgres | 7 | book035
postgres | 8 | book040
postgres | 9 | book077
postgres | 10 | book100
hive | 1 | book200
keyword | item
---------+---------
sql | book003
sql | book005
sql | book008
sql | book010
sql | book025
sql | book100
postgres | book008
postgres | book010
postgres | book030
postgres | book055
postgres | book066
postgres | book100
hive | book200
redshift | book300
スピアマンの順位相関係数
あるランキングとあるランキングの類似度を計算する。
2つのランキングの順位が完全に⼀致している場合は、 1.0
2つのランキングの順位が全く⼀致していない場合は、-1.0
となる
diff=両者の順位差の2乗
1-(6.0 * SUM(POWER(rankA - rankB))
/ (POWER(レコード数, 3) - レコード数))
適合率
結果の中から、何割のアイテムが正しく返却されたかを⽰す。
Web検索のような、膨⼤で重複を含む情報から、関連する情報を
素早く獲得したい場⾯で重視される。
再現率
ユーザーが欲しいと思うアイテム中、何割のアイテムが正しく
返却されたかを⽰す。法律系や医療系を対象とした検索など、
結果に漏れがあると困る場⾯で重視される。
適合率の計算⽅法
順位 item_id 正解アイテム precision
1 book002 0.00
2 book004 0.00
3 book012 0.00
4 book008 ○ 25.00
5 book003 20.00
6 book010 ○ 33.33
7 book035 28.57
8 book040 25.00
9 book077 22.22
10 book100 ○ 30.00
× book030 ○ 0.00
× book055 ○ 0.00
× book066 ○ 0.00
4個中1個正解
5個中1個正解
6個中2個正解
正解アイテムとして定義したが、
結果に含まれなかった
各検索結果の順位までに、何割の正解アイテムが含まれているかを計算する
P@n
順位 item_id 正解アイテム precision
1 book002 0.00
2 book004 0.00
3 book012 0.00
4 book008 ○ 25.00
5 book003 20.00
4個中1個正解
5個中1個正解
検索結果上位n件における適合率
P@5 = 20.00%
レコメンド元
item_id
P@10
book001 20.00
book002 15.00
book003 33.33
book004 25.00
... ...
個々のアイテムに対してのP@10を求める
全体としてどう評価してよいのか判断しにくい
P@nの値の平均を取って、
ロジックの良し悪しを判断する
適合率の問題点
検索結果のランキング順位が考慮されていない状態
順位 正解アイテム
1 ○
2 ○
3 ○
4 ○
5
6
7
8
9
10
順位 正解アイテム
1
2
3
4
5
6
7 ○
8 ○
9 ○
10 ○
P@10=40% P@10=40%
MAP(Mean Average Precision)を⽤いて計算する。
MAP(Mean Average Precision)
正解アイテムごとの適合率を計算し、その平均を求める
順位 適合率
1 100.00
2 100.00
3 100.00
4 100.00
- 0.00
- 0.00
- 0.00
- 0.00
- 0.00
- 0.00
順位 適合率
7 14.29
8 25.00
9 33.00
10 40.00
- 0.00
- 0.00
- 0.00
- 0.00
- 0.00
- 0.00
MAP=40% MAP=11.26%
1個中1個正解
2個中2個正解
7個中1個正解
8個中2個正解
■タイトル
レコメンドの改善ポイントを学ぶ
レコメンドの改善を考える
「購⼊した・購⼊していない」の単純な2値では、細かなニュアンスを表現できない
例えば、1⽇前に購⼊した商品と、1ヶ⽉前に購⼊した商品を同列に扱ってよいのか?
→ ⽇付による重みの減衰率を導⼊
商品A 商品B 商品C 商品D 商品E …
ユーザA 0 1 0 0 1
ユーザB 0 0 1 1 0
ユーザC 0 1 0 1 0
ユーザD 0 1 0 1 1
ユーザE 1 1 1 1 1
…
ユーザー×商品の相関マトリックス
⽇付による重みの減衰率
減衰率として、対数の逆数を利⽤
対数は、⼈間の直観を表すためによく使われる
日数差の対数の逆数による重みのグラフ(a=0,	0.05,	0.1,	0.5,	1)
https://www.desmos.com/calculator/cvj9gxzhj8
⽇付による重みの減衰率
purchase_logテーブルに、ユーザの商品
購⼊⽇付を格納
SQLによる減衰率の計算
SELECT
user
, item
, date
FROM
purchase_log
;
user item date
ユーザA 商品B 2017-04-23
ユーザA 商品E 2017-04-24
ユーザB 商品C 2017-04-14
ユーザB 商品D 2017-04-24
ユーザD 商品B 2017-01-12
ユーザD 商品D 2017-01-13
ユーザD 商品E 2017-01-14
ユーザE 商品A 2017-03-25
…
…
…
⽇付による重みの減衰率
今⽇の⽇付(2017-04-24)との⽇数差
(diff)を計算
※ 処理系に応じて⽇付計算の⽅法は異なります
(上記はPostgreSQLの例)
SQLによる減衰率の計算
SELECT
user
, item
, date
, '2017-04-24'::date - date AS diff
FROM
purchase_log
;
user item date diff
ユーザA 商品B 2017-04-23 1
ユーザA 商品E 2017-04-24 0
ユーザB 商品C 2017-04-14 10
ユーザB 商品D 2017-04-24 0
ユーザD 商品B 2017-01-12 102
ユーザD 商品D 2017-01-13 101
ユーザD 商品E 2017-01-14 100
ユーザE 商品A 2017-03-25 30
…
…
…
⽇付による重みの減衰率
対数(log)を⽤いて⽇付による減衰率を適
⽤したスコアを計算する
SQLによる減衰率の計算
SELECT
user
, item
, '2017-04-24'::date - date AS diff
, 1.0
/ log(2
, 0.1 * ('2017-04-24'::date - d)
+ 2) AS score
FROM
purchase_log
;
user item diff score
ユーザA 商品B 1 0.934…
ユーザA 商品E 0 1.000…
ユーザB 商品C 10 0.630…
ユーザB 商品D 0 1.000…
ユーザD 商品B 102 0.277…
ユーザD 商品D 101 0.278…
ユーザD 商品E 100 0.278…
ユーザE 商品A 30 0.430…
…
…
…
…
レコメンドの改善を考える
購⼊ログ以外のログを組み合わせる
(閲覧ログ、お気に⼊り登録等)
user item 閲覧数 お気に⼊
り登録数
購⼊数 ダウンロー
ド数
ユーザA 商品B 2 0 1 2
ユーザA 商品E 16 1 0 0
ユーザB 商品C 14 0 0 0
ユーザB 商品D 15 1 0 0
ユーザD 商品B 21 0 1 4
…
…
…
…
…
…
アクションの種類によって、それぞれの値の意味が異なる
■ 購⼊、お気に⼊り登録など → 1商品につき、通常は1回だけ実⾏する
■ 閲覧、ダウンロードなど →1商品につき、何度でも実⾏できる
→ 性質の違う値を正規化して、同列に扱う⼯夫が必要
性質の違う値を正規化して、同列に扱う⼯夫
最⼩値と最⼤値を求め、最⼩値が0、最⼤値が1になるように値を変形
各値から最⼩値を引き算し、最⼤値と最⼩値の差で割る
Min-Max正規化
シグモイド関数の利⽤
シグモイド関数(S字型のカーブを描く単調増加関数)を、下記のとおり
⼊⼒が0のときに出⼒が0、⼊⼒が∞のときに出⼒が1となるように変形
パラメタaを変えることで曲率を変えられる
https://www.desmos.com/calculator/etwiqljcwi
性質の違う値を正規化して、同列に扱う⼯夫
action_countテーブルに、ユーザの商品
閲覧数/購⼊数を格納する
SQLによるシグモイド関数の計算
SELECT
user
, item
, view
, purchase
FROM
action_count
;
user item view purchase
ユーザA 商品B 2 1
ユーザA 商品E 16 0
ユーザB 商品C 14 0
ユーザB 商品D 15 0
ユーザD 商品B 21 1
ユーザD 商品D 10 1
ユーザD 商品E 28 0
ユーザE 商品A 28 1
…
…
…
…
性質の違う値を正規化して、同列に扱う⼯夫
商品閲覧数/購⼊数をシグモイド関数で0
〜1の値に正規化する
SQLによるシグモイド関数の計算
SELECT
user
, item
-- ゲイン0.1のシグモイド関数
, 2.0
/ (1 + exp( -0.1 * view))
- 1.0
AS sigm_v
-- ゲイン10のシグモイド関数
, 2.0
/ (1 + exp(-10.0 * purchase))
- 1.0
AS sigm_p
FROM
action_count
;
user item sigm_v sigm_p
ユーザA 商品B 0.0996 0.9999
ユーザA 商品E 0.6640 0.0000
ユーザB 商品C 0.6043 0.0000
ユーザB 商品D 0.6351 0.0000
ユーザD 商品B 0.7818 0.9999
ユーザD 商品D 0.7818 0.9999
ユーザD 商品E 0.8853 0.0000
ユーザE 商品A 0.8853 0.9999
…
…
…
…
性質の違う値を正規化して、同列に扱う⼯夫
正規化した商品閲覧数/購⼊数のうち⼤き
な⽅をスコアとする
SQLによるシグモイド関数の計算
SELECT
user
, item
, greatest(
-- ゲイン0.1のシグモイド関数
2.0
/ (1 + exp( -0.1 * view))
- 1.0
-- ゲイン10のシグモイド関数
, 2.0
/ (1 + exp(-10.0 * purchase))
- 1.0
) AS score
FROM
action_count
;
user item score
ユーザA 商品B 0.9999
ユーザA 商品E 0.6640
ユーザB 商品C 0.6043
ユーザB 商品D 0.6351
ユーザD 商品B 0.9999
ユーザD 商品D 0.9999
ユーザD 商品E 0.8853
ユーザE 商品A 0.9999
…
…
…
■タイトル
レコメンドの定義を理解する レコメンドの作り⽅を理解する
レコメンドの評価指標を知る レコメンドの改善ポイントを学ぶ
まとめ
なぜレコメンドを⼀から実装したのか?
既存のツールやライブラリを使えば、それらしいレコメンド結果は簡単に得られる
しかし、⾃サービスに特化してチューニングしたり、改善したりといった⼯夫は、
レコメンドの原理を理解していないと難しい
最終的にライブラリを使うとしても、レコメンドアルゴリズムのデータフローを⼿
で理解しておくと、チューニングの⽬処を付けやすい
アルゴリズムやデータ獲得の種類 Item to ItemをSQLで実装
順位相関、適合率、MAPなど 経過⽇数の考慮や異なるログの組み合わせ
ご清聴ありがとうございました。
Amazon ビッグデータ SQL
検索

More Related Content

What's hot

バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践智之 村上
 
レコメンドアルゴリズムの基本と周辺知識と実装方法
レコメンドアルゴリズムの基本と周辺知識と実装方法レコメンドアルゴリズムの基本と周辺知識と実装方法
レコメンドアルゴリズムの基本と周辺知識と実装方法Takeshi Mikami
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 
グラフデータベース入門
グラフデータベース入門グラフデータベース入門
グラフデータベース入門Masaya Dake
 
AWSで作る分析基盤
AWSで作る分析基盤AWSで作る分析基盤
AWSで作る分析基盤Yu Otsubo
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRecruit Technologies
 
協調フィルタリングを利用した推薦システム構築
協調フィルタリングを利用した推薦システム構築協調フィルタリングを利用した推薦システム構築
協調フィルタリングを利用した推薦システム構築Masayuki Ota
 
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送Google Cloud Platform - Japan
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)Kentaro Minami
 
オントロジーとは?
オントロジーとは?オントロジーとは?
オントロジーとは?Kouji Kozaki
 
If文から機械学習への道
If文から機械学習への道If文から機械学習への道
If文から機械学習への道nishio
 
BigQuery で 150万円 使ったときの話
BigQuery で 150万円 使ったときの話BigQuery で 150万円 使ったときの話
BigQuery で 150万円 使ったときの話itkr
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターンSoudai Sone
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装infinite_loop
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話Yoshitaka Kawashima
 
リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介Recruit Technologies
 
因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説Shiga University, RIKEN
 

What's hot (20)

バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践
 
レコメンドアルゴリズムの基本と周辺知識と実装方法
レコメンドアルゴリズムの基本と周辺知識と実装方法レコメンドアルゴリズムの基本と周辺知識と実装方法
レコメンドアルゴリズムの基本と周辺知識と実装方法
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
グラフデータベース入門
グラフデータベース入門グラフデータベース入門
グラフデータベース入門
 
AWSで作る分析基盤
AWSで作る分析基盤AWSで作る分析基盤
AWSで作る分析基盤
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
 
協調フィルタリングを利用した推薦システム構築
協調フィルタリングを利用した推薦システム構築協調フィルタリングを利用した推薦システム構築
協調フィルタリングを利用した推薦システム構築
 
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
モデルベース協調フィルタリングにおける推薦の透明性に関する検討
モデルベース協調フィルタリングにおける推薦の透明性に関する検討モデルベース協調フィルタリングにおける推薦の透明性に関する検討
モデルベース協調フィルタリングにおける推薦の透明性に関する検討
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)差分プライバシーとは何か? (定義 & 解釈編)
差分プライバシーとは何か? (定義 & 解釈編)
 
オントロジーとは?
オントロジーとは?オントロジーとは?
オントロジーとは?
 
If文から機械学習への道
If文から機械学習への道If文から機械学習への道
If文から機械学習への道
 
BigQuery で 150万円 使ったときの話
BigQuery で 150万円 使ったときの話BigQuery で 150万円 使ったときの話
BigQuery で 150万円 使ったときの話
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
 
リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介
 
因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説
 

SQLで身につける!初めてのレコメンド 〜 基礎から応用まで ~