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

リクルートを支える横断データ基盤と機械学習の適用事例
リクルートを支える横断データ基盤と機械学習の適用事例リクルートを支える横断データ基盤と機械学習の適用事例
リクルートを支える横断データ基盤と機械学習の適用事例Tetsutaro Watanabe
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情Yuta Kikuchi
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送Google Cloud Platform - Japan
 
マッチングサービスにおけるKPIの話
マッチングサービスにおけるKPIの話マッチングサービスにおけるKPIの話
マッチングサービスにおけるKPIの話cyberagent
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIShota Imai
 
ナレッジグラフとオントロジー
ナレッジグラフとオントロジーナレッジグラフとオントロジー
ナレッジグラフとオントロジーUniversity of Tsukuba
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRecruit Technologies
 
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)RyuichiKanoh
 
グラフ構造のデータモデルをPower BIで可視化してみた
グラフ構造のデータモデルをPower BIで可視化してみたグラフ構造のデータモデルをPower BIで可視化してみた
グラフ構造のデータモデルをPower BIで可視化してみたCData Software Japan
 
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...西岡 賢一郎
 
先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際Tetsutaro Watanabe
 
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-Deep Learning JP
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
ナレッジグラフ入門
ナレッジグラフ入門ナレッジグラフ入門
ナレッジグラフ入門KnowledgeGraph
 
因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説Shiga University, RIKEN
 
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
深層学習による自然言語処理入門: word2vecからBERT, GPT-3までYahoo!デベロッパーネットワーク
 
バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践智之 村上
 
大規模な組合せ最適化問題に対する発見的解法
大規模な組合せ最適化問題に対する発見的解法大規模な組合せ最適化問題に対する発見的解法
大規模な組合せ最適化問題に対する発見的解法Shunji Umetani
 

What's hot (20)

リクルートを支える横断データ基盤と機械学習の適用事例
リクルートを支える横断データ基盤と機械学習の適用事例リクルートを支える横断データ基盤と機械学習の適用事例
リクルートを支える横断データ基盤と機械学習の適用事例
 
最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情最近のDeep Learning (NLP) 界隈におけるAttention事情
最近のDeep Learning (NLP) 界隈におけるAttention事情
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送
 
マッチングサービスにおけるKPIの話
マッチングサービスにおけるKPIの話マッチングサービスにおけるKPIの話
マッチングサービスにおけるKPIの話
 
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
 
ナレッジグラフとオントロジー
ナレッジグラフとオントロジーナレッジグラフとオントロジー
ナレッジグラフとオントロジー
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
 
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)
 
グラフ構造のデータモデルをPower BIで可視化してみた
グラフ構造のデータモデルをPower BIで可視化してみたグラフ構造のデータモデルをPower BIで可視化してみた
グラフ構造のデータモデルをPower BIで可視化してみた
 
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
ブラックボックスからXAI (説明可能なAI) へ - LIME (Local Interpretable Model-agnostic Explanat...
 
先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際先駆者に学ぶ MLOpsの実際
先駆者に学ぶ MLOpsの実際
 
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
ナレッジグラフ入門
ナレッジグラフ入門ナレッジグラフ入門
ナレッジグラフ入門
 
因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説因果探索: 基本から最近の発展までを概説
因果探索: 基本から最近の発展までを概説
 
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
 
バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践
 
大規模な組合せ最適化問題に対する発見的解法
大規模な組合せ最適化問題に対する発見的解法大規模な組合せ最適化問題に対する発見的解法
大規模な組合せ最適化問題に対する発見的解法
 

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