Collaborative Filtering With R
Ver 1.1
Teito Nakagawa
目次
• 協調フィルタリング
• メモリベースの協調フィルタリング
• 協調フィルタリングの評価
• Rでの実行例
• まとめ
• 自己紹介
協調フィルタリング
協調フィルタリング
• ユーザの類似性に
基づいてアイテムを
レコメンドする方法
• AmazonやNetflixの
例が有名
• Tescoが3年ほど前に
DMで実践
画像:Wikipdiaより
協調フィルタリングの分類
レコメンデーション
システム
協調
フィルタリング
メモリベース
協調フィルタリング
アイテムベース
協調フィルタリング
ユーザベース
協調フィルタリング
モデルベース
協調フィルタリング
コンテンツベース
フィルタリング
• 実際には組み合わせて使うことが多いらしい。
ハイブリッド型
協調フィルタリング
メモリベース協調フィルタリング
1.ユーザ(アイテム)間の類似性の計算
2.ユーザ評価の予測、レコメンド
















5312
44
423
124
55?4
jiw ,
2,1P 3.95
2
アクティブ
ユーザ
1
レコメンデーション
方式
①用いる
類似性
②予測に
用いる集
計
ユーザース
Top-N
ユーザ間
類似性
ユーザ評
価の重み
付き和
アイテムベース
Top-N
アイテム
間類似性
単純重み
付き和
• アイテムもしくはユーザの類似性に基づき、
ユーザ評価を集計するレコメンド手法
ユーザアイテム行列
ユーザの評価
モデルベース協調フィルタリング
• 用いられる統計的アルゴリズム
– ベイジアンネットワーク
– クラスタリング
– 回帰モデル
– MDP
– 潜在意味解析
統計的モデルを構築してユーザの評価を予測する方法
ハイブリッド型協調フィルタリング
• コンテンツベースレコメンデーション・・・商品の属性情報(キーワー
ド、URL、ジャンルに基づくフィルタリング)
例:コンテンツブーステッド協調フィルタリング:ナイーブベイズ手法を
用いて、ユーザの属性情報(年齢、性別等)とユーザアイテムマト
リックスを用いて欠損値を補い、擬似評価マトリックスを作成する
協調フィルタリングの手法
デモグラフィックス
ユーザ評価
















5312
44
423
124
554














24
28
43
33
24
1
0
1
0
1
性 年
ユーザ評価
欠損値の評価
協調フィルタリングの混合
協調フィルタリングの課題
1. データのスパース性・・・データが圧倒的に疎であること。以下の
ような問題を引き起こす。
– コールドスタート問題・・・新しいアイテムやユーザが追加された時に
類似のアイテムを見つけるのが難しい問題。
– 少カバー率問題・・・ユーザの評価が少ないアイテムは類似するアイ
テム等のレコメンデーションの提示が不可能になること。
– 同類推移問題・・・スパースなデータベースの場合、類似のユーザで
あっても、全く同じアイテムを共に評価しないと類似であると判別され
ない問題。
2. スケーラビリティ・・・ユーザ・アイテム行列は直ぐに巨大なものに
なること。
3. シノニム・・・ほとんど同じだけど異なるとされている商品がレコメ
ンド精度を下げる。
4. 灰色の羊・・・複数のタイプの人と一致するあいまいなユーザ、レ
コメンドの恩恵にあずかれない人々
5. シリングアタック・・・不正な商品に対する利益目的の評価を指す。
協調フィルタリングを
実装しているライブラリ
ソフトウェア名 言語 URL
Apache Mahout Java http://mahout.apache.org 並列分散処理
Cofi Java http://www.nongnu.org/cofi/ オワタ
Crab Python https://github.com/murioca/cra
b
お手軽
Easyrec Java http://easyrec.org 登録必要
LensKit Java http://lenslit.grouplens.org/ 新しい
MyMediaLite C# http://mloss.org/software/view
/282/
シンプルらしい
SVDFeature C++ http://mloss.org/software/view
/333
特異値分解に特化
Vogoo PHP LIB PJP http://sourceforge.net/projects/
vogoo/
日本語情報多数
DB要
メモリベース
協調フィルタリング
1.レコメンデーションの計算手順
1.1.ユーザ(アイテム)間の類似性の
計算
1.2.ユーザ評価の予測(レコメンデー
ション)
2.レコメンデーションアルゴリズム
2.1.ユーザベースTop-N
レコメンデーション
2.2.アイテムベースTop-N
レコメンデーション
メモリベース協調フィルタリング
• アイテムもしくはユーザの類似性に基づき、
購買履歴を集計するレコメンド手法
















5312
44
423
124
55?4
vuw ,
1
2,1P 3.95
ユーザ1の
評価は3.95
2
アクティブ
ユーザ
1.1.ユーザ(アイテム)間
類似性の計算







Uu
viv
Uu
uiu
Ii
vivuiu
vu
rrrr
rrrr
w
2
,
2
,
,,
,
)()(
))((
1.ピアソン相関係数類似性
2.コサインベクトル類似性






Ii
iv
Ii
iu
Ii
iviu
vu
rr
rr
w
2
,
2
,
,,
,
)(
例:ユーザ間の類似性の計算
















5312
44
423
124
55?4
vuw ,
1
アクティブ
ユーザ
Uu
Ii 
予測に用いる、基礎データとして類似性を計測する
1.2.集計による予測






Uu
ua
Uu
uauiu
aia
w
wrr
rP
||
)(
,
,,
,
1.他者評価の重み付き和(ユーザベースの協調フィルタリング)
類似性の高い
ユーザを高く評
価している。
2.単純重み付き和
(アイテムベースの協調フィルタリング)





Ij
ji
Ij
jija
ia
w
wr
P
|| ,
,,
,
















5312
44
423
124
55?4アクティブ
ユーザ
類似性の高い
アイテムを高く
評価している。
アクティブユーザの特定商品への評価を
集計により予測する。
Uu
Ii 
2,1P 3.95
2
1.2.集計による予測






Uu
ua
Uu
uauiu
ia
w
wrr
P
||
)(
,
,,
,
1.他者評価の重み付き和(ユーザベースの協調フィルタリング)
類似性の高い
ユーザを高く評
価している。
















5312
44
423
124
55?4アクティブ
ユーザ
Uu
Ii 
2,1P 3.95
2
12,1 w
04,1 w
756.05,1 w
アクティブユーザの特定商品への評価を
集計により予測する。
あなたにおすすめの商品は
2.1.ユーザベースTop-N
レコメンデーション
• ユーザの類似性に基づいて、TopN個まで推薦可能な商品を提示する。
• 「あなたと似たユーザはこんな商品も買っています。」
1.ユーザaと他のユーザ間の類似性を計算
2.予測
似ているユーザk人を抽出
他者評価の重み付き和
0.75 0 -1 -1
類似性
k=2

 7.27.07.17.0 






5312
423
3.Top-Nの商品を推薦する。
メリット:ユーザに無条件でアイテムを
サジェスト出来る。
デメリット:計算量が大きい
N=3
あなたにおすすめの商品は
2.2.アイテムベースTop-N
レコメンデーション
• アイテムの類似性に基づいて、TopN個まで推薦可能な商品を提示する。
• 「この商品を買ったユーザはこんな商品も買っています。」
1.アイテムaと他のアイテム間の類似性を計算
2.予測
似ているアイテムk個を抽出
単純重み付き和
0.75 0.18 0
類似性
3.Top-Nの商品を推薦する。
メリット:事前にアイテム間類似性を計
算しておけば、計算量は早い
デメリット:アイテムを選択するアクショ
ンが必要
・・・

)33.333.4( 
上位N個
 35
協調フィルタリングの
評価
協調フィルタリングの評価の枠組み
• k-given法を用いたTop-Nレコメンデーションの
場合
1. データを2値判別問題と考える(goodRatingで
2値の閾を作成)。
2. データセットを学習セットと検証セットに分割
(methodで分割方法を指定する。)
3. 検証セットデータのk個のデータを除外して、
これを入力とする。
4. 入力と学習セットを用いてレコメンドを実施す
る。
5. 除外したk個に対して、レコメンドによる予測
と実績を比較する。
6. ROC曲線などパターン認識の評価の枠組み
を用いて評価する。
協調フィルタリングの評価の枠組み
• k-given法を用いたTop-Nレコメンデーションの
場合
1. データを2値判別問題と考える(goodRatingで
2値の閾を作成)。
2. データセットを学習セットと検証セットに分割
(methodで分割方法を指定する。)
3. 検証セットデータのk個のデータを除外して、
これを入力とする。
4. 入力と学習セットを用いてレコメンドを実施す
る。
5. 除外したk個に対して、レコメンドによる予測
と実績を比較する。
6. ROC曲線などパターン認識の評価の枠組み
を用いて評価する。
k-given法による評価
• 2-given法の場合
















5312
44
423
124
55?4






PPNN
PPP






NNP
PP
学習セット
検証セット
元データ
k-given法による評価
• 2-given法の場合






PPNN
PPP






NNP
PP






PN
PP
??
?
学習セット
2アイテムに
対する評価
は与えられ
ている。
検証セット(実績)
検証セット(入力)
k-given法による評価
• 2-given法の場合






PPNN
PPP






NNP
PP






PNPN
PPP
学習セット
結果の評価
検証セット(実績)
検証セット(入力+出力)
レコメンドの
実施
協調フィルタリングの
評価指標
協調フィルタリングの評価の枠組み
• k-given法を用いたTop-Nレコメンデーションの
場合
1. データを2値判別問題と考える(goodRatingで
2値の閾を作成)。
2. データセットを学習セットと検証セットに分割
(methodで分割方法を指定する。)
3. 検証セットデータのk個のデータを除外して、
これを入力とする。
4. 入力と学習セットを用いてレコメンドを実施す
る。
5. 除外したk個に対して、レコメンドによる予測
と実績を比較する。
6. ROC曲線などパターン認識の評価の枠組み
を用いて評価する。
MAE
MAE(誤り率):予測が間違っていた
割合
MAE=(b+c)/(a+b+c+d)
実/予 良い 悪い
良い a b
悪い c d
実/予 良い 悪い
良い a b
悪い c d
Precision、Recall
Precision(再生率):良いと予測され
たものの中で、実績が良いもの。
Precision=(a)/(a+c)
Recall(再認率):良いという実績の中
で予測が良いとなっているもの
Recall=(a)/(a+b)
実/予 良い 悪い
良い a b
悪い c d
実/予 良い 悪い
良い a b
悪い c d
実/予 良い 悪い
良い a b
悪い c d
TPR、FPR
TPR(陽性率):興味のあるクラスに
関して、正しく判別できた割合
TPR=(a)/(a+c)
FPR(偽陽性率):興味のないクラス
に関して、正しく判別できなかった
割合
FPR=(b)/(b+d)
実/予 良い 悪い
良い a b
悪い c d
実/予 良い 悪い
良い a b
悪い c d
実/予 良い 悪い
良い a b
悪い c d
ROC曲線
• (0,0)、(1,1)を結ぶ
• 直角が理想的
• 対角線だと完全にラン
ダム
• 傾きは常に正
• 横軸との面積=AUC、
判別器の指標となる。
2値判別に関して、判別器のパラメータCを-∞から∞まで動かし
た時の、(FPR(C),TPR(C))のプロット。
FPR
TPR
Rでの実行例
RecommendarLab
• 持っている機能
– レコメンデーションアルゴリ
ズム
– レコメンデーションの評価
– レコメンド用データの整形
• 軽量にレコメンデーション
を試してみたい場合はい
いかも
• 公開されているpdfの質が
良いので試してみよう。
評価対象データおよびその整形
ratingMatrix
結果評価の枠組み
RecommendarLabの構成概念図
binaryRatingMatrix
realRatingMatrix
evaluationScheme
evaluationResultList
実験済結果セット
evaluationResult
個別の結果セット
confusionMatrix
evaluate
plot
結果の
可視化
レコメンデーション
Recommender
レコメンドモデル
topNList
推薦するアイテム
predict
binarize
normalize
データの
可視化
image
hist
Jester5k
• ジョークのレコメンデーションシステム
• 5000人分のジョークに対する評価が含まれている。
• http://eigentaste.berkeley.edu/user/index.php
#サンプルデータの読み込み
data(Jester5k)
Jester5k
as(Jester5k[1:10], "matrix")[1:2, 1:2]
# j1 j2
# u2841 7.91 9.17
# u15547 -3.20 -3.50
Recommendelabに含まれるユーザ×ジョークのサンプルデータセット
データの整形
as(Jester5k[1:10], "matrix")[1:2, 1:2]
# j1 j2
# u2841 7.91 9.17
# u15547 -3.20 -3.50
#二値データ化
as(binarize(Jester5k[1:10], minRating=-3.2), "matrix")[1:2, 1:2]
# j1 j2
# [1,] 1 1
# [2,] 1 0
as(binarize(Jester5k[1:10], minRating=-3.5), "matrix")[1:2, 1:2]
# j1 j2
# [1,] 1 1
# [2,] 1 1
#正規化を行う
as(normalize(Jester5k[1:10], method="center", row=TRUE), "matrix")[1:2, 1:2]
#j1 j2
#u2841 4.0548148 5.3148148
#u15547 -0.4180282 -0.7180282
ユーザ2841と15547のジョー
ク1,2に対する評価を確認
binarize
二値行列化
normalize
正規化
基本計算
##############基本計算##############
#データより、サンプル1000件を取得
ratings<-sample(Jester5k, 1000)
#ユーザ1の評価の平均
rowMeans(ratings[1,])
# u18940
# -2.439
#ジョーク1の評価の集計
colCounts(ratings[,1])
#j1
#655
#類似性の計算 method="cosine", "pearson", "jaccard"
similarity(x=Jester5k[1:10], method="Jaccard")
# u2841 u15547 u15221 u15573 u21505 u15994 u238 u5809 u16636
# u15547 0.8536585
# u15221 0.8100000 0.7100000
# u15573 0.8100000 0.7100000 1.0000000
# u21505 0.8433735 0.9324324 0.7200000 0.7200000
…
sample
サンプルを取得
rowMeans, colCounts
行、列に対する集計
similarity
類似性の計算
可視化
#ヒストグラムによる基本統計量の確認
#全ジョークの評価
hist(getRatings(ratings), breaks=100)
#正規化した全ジョークの評価
hist(getRatings(normalize(ratings)), breaks=100)
可視化
#Z得点化した全ジョークの評価
hist(getRatings(normalize(ratings,method="Z-score")), breaks=100)
#ユーザ別評価数
hist(rowCounts(ratings), breaks=50)
データの可視化
#ジョーク別評価平均
hist(colMeans(ratings), breaks=50)
#ヒートマップによる可視化
image(ratings[1:100,])
基本の計算
############レコメンデーション################
#実数タイプのユーザ評価マトリックスのレジストリを取得する。
recommenderRegistry$get_entries(dataType="realRatingMatrix")
# ......
# $UBCF_realRatingMatrix
# Recommender method: UBCF
# Description: Recommender based on user-based collaborative filtering (real data).
#Recommenderクラスの生成
recom<-Recommender(Jester5k[1:1000], method="POPULAR")
names(getModel(recom))
#[1] "topN" "ratings" "normalize" "aggregation"
#モデルrecomにより、Top-10レコメンデーションを作成
pred.recom<-predict(recom, Jester5k[1001:1003])
#レコメンデーションを表示する。
as(bestN(pred.recom, n=11), "list")
# [[1]]
# [1] "j89" "j72" "j47" "j93" "j76" "j10" "j96" "j83" "j81" "j87"
#
# [[2]]
# [1] "j89" "j93" "j76" "j88" "j96" "j83" "j81" "j87" "j91" "j78"
recommenderRegistry
レコメンデーション
アルゴリズムのセット
Recommender
レコメンドクラスの作成
predict
与えたデータに対して
予測を行う
レコメンデーションの評価
#評価スキーマを作成する(K交差検証法を行う)
es<-evaluationScheme(Jester5k[1:1000], method="cross", k=4, goodRating=5)
results<-evaluate(es, method="POPULAR", n=c(1,3,5,10,15,20))
# POPULAR run
# 1 [0.03sec/0.59sec]
# 2 [0.04sec/0.61sec]
# 3 [0.03sec/0.59sec]
# 4 [0.03sec/0.56sec]
#混同行列の取得
getConfusionMatrix(results)[[1]]
# n TP FP FN TN PP recall precision FPR TPR
# 1 0.452 0.548 17.712 78.288 1 0.02488439 0.4520 0.006951139 0.02488439
# 3 1.200 1.800 16.964 77.036 3 0.06606474 0.4000 0.022832209 0.06606474
# 5 2.024 2.976 16.140 75.860 5 0.11142920 0.4048 0.037749252 0.11142920
# 10 3.868 6.132 14.296 72.704 10 0.21294869 0.3868 0.077781724 0.21294869
# 15 5.652 9.348 12.512 69.488 15 0.31116494 0.3768 0.118575270 0.31116494
# 20 7.204 12.796 10.960 66.040 20 0.39660868 0.3602 0.162311634 0.39660868
evaluationScheme
評価スキーマを作成
method
split データを分割
cross k交差検証法
bootstrap ブートストラップ
evaluate
評価の実行
getConfusion
Matrix
混同行列の
作成
レコメンデーションの評価
#評価スキーマを作成する(3つのアルゴリズムを比較する。)
es2<-evaluationScheme(Jester5k[1:1000], method="split", k=4, train=0.85, goodRating=5)
algorithms <- list(
"random items" = list(name="RANDOM", param=NULL),
"popular items" = list(name="POPULAR", param=NULL),
"user-based CF" = list(name="UBCF", param=list(method="Cosine",nn=50, minRating=5))
)
#結果を評価する。
results2<-evaluate(es2, algorithms, n=c(1:8))
# RANDOM run
# 1 [0sec/0.39sec]
# 2 [0sec/0.36sec]
# 3 [0sec/0.39sec]
# 4 [0.01sec/0.39sec] POPULAR run
# 1 [0.04sec/0.34sec]
# 2 [0.03sec/0.33sec]
# 3 [0.04sec/0.32sec]
# 4 [0.04sec/0.33sec] UBCF run
# 1 [0.01sec/5.59sec]
# 2 [0.01sec/5.43sec]
# 3 [0.02sec/5.42sec]
# 4 [0.03sec/5.43sec]
比較結果の可視化
#ROC曲線を表示する。
plot(results2, "ROC")
#再生と再認をグラフ表示する。
plot(results2, "prec/rec")
まとめ
• 協調フィルタリングには、メモリベース、モデ
ルベース、ハイブリッドの3タイプ存在する。
• メモリベースの協調フィルタリングは、ユーザ
とアイテムの類似性よりレコメンドするアイテ
ムを決定するアルゴリズムである。
• 協調フィルタリングの評価には、誤り率、ROC
曲線などを用いる。
• Recommenderlabを用いると、Rで簡単に協調
フィルタリングの実行と、評価が実装できる。
まとめ
カテゴリ 代表的な手法 長所 短所
メモリベース協調
フィルタリング
•類似ユーザベース協調フィルタリング
•Top-Nレコメンデーション
•実装が容易
•データの追加が簡単
•コンテンツの内容について
の考慮が不要
•共に評価されたアイテムの
スケーリングが容易
•人の評価への依存
•疎なデータでの性能悪さ
•新ユーザとアイテムをレコメ
ンデーションが不可能
•スケーラビリティ
モデルベース協
調フィルタリング
•ベイジアンネットワーク協調フィルタリング
•クラスタリング協調フィルタリング
•潜在意味協調フィルタリング
•粗因子分析
•次元削減を用いた協調フィルタリング
•疎なデータへの対応がよい
•予測性能の向上
•直感的な説明を与える
•モデルの構築が複雑
•予測性能とパフォーマンス
のトレードオフ
•次元削減により有益な情報
を失う
ハイブリッド協調
フィルタリング
•コンテントベース協調フィルタリング
•コンテントブーステッド協調フィルタリング
•メモリベースとモデルベースのハイブリッ
ド協調フィルタリング
•それぞれの協調フィルタリ
ングの問題を克服可能
•予測性能の古城
•データのスパース性や灰色
の羊に対応可能
•実装が複雑
•外部の情報が必要
参考
• 協調フィルタリングのサーベイ論文
– A Survey of Collaborative Filtering Techniques
(Xiaoyuan Su and Taghi M. Khoshgoftaar,Advances in Artificial Intelligence
Volume 2009 (2009), Article ID 421425,)
• Recommenderlabの作者によるチュートリアル
http://cran.r-
project.org/web/packages/recommenderlab/vignettes/recommenderlab.pdf

Collaborativefilteringwith r

Editor's Notes