Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Collaborativefilteringwith r

This is written in Japenese.
What is Collaborative filtering.
How to use it using R.

  • Soyez le premier à commenter

Collaborativefilteringwith r

  1. 1. Collaborative Filtering With RVer 1.1Teito Nakagawa
  2. 2. 目次• 協調フィルタリング• メモリベースの協調フィルタリング• 協調フィルタリングの評価• Rでの実行例• まとめ• 自己紹介
  3. 3. 協調フィルタリング
  4. 4. 協調フィルタリング• ユーザの類似性に基づいてアイテムをレコメンドする方法• AmazonやNetflixの例が有名• Tescoが3年ほど前にDMで実践画像:Wikipdiaより
  5. 5. 協調フィルタリングの分類レコメンデーションシステム協調フィルタリングメモリベース協調フィルタリングアイテムベース協調フィルタリングユーザベース協調フィルタリングモデルベース協調フィルタリングコンテンツベースフィルタリング• 実際には組み合わせて使うことが多いらしい。ハイブリッド型協調フィルタリング
  6. 6. メモリベース協調フィルタリング1.ユーザ(アイテム)間の類似性の計算2.ユーザ評価の予測、レコメンド53124442312455?4jiw ,2,1P 3.952アクティブユーザ1レコメンデーション方式①用いる類似性②予測に用いる集計ユーザースTop-Nユーザ間類似性ユーザ評価の重み付き和アイテムベースTop-Nアイテム間類似性単純重み付き和• アイテムもしくはユーザの類似性に基づき、ユーザ評価を集計するレコメンド手法ユーザアイテム行列ユーザの評価
  7. 7. モデルベース協調フィルタリング• 用いられる統計的アルゴリズム– ベイジアンネットワーク– クラスタリング– 回帰モデル– MDP– 潜在意味解析統計的モデルを構築してユーザの評価を予測する方法
  8. 8. ハイブリッド型協調フィルタリング• コンテンツベースレコメンデーション・・・商品の属性情報(キーワード、URL、ジャンルに基づくフィルタリング)例:コンテンツブーステッド協調フィルタリング:ナイーブベイズ手法を用いて、ユーザの属性情報(年齢、性別等)とユーザアイテムマトリックスを用いて欠損値を補い、擬似評価マトリックスを作成する協調フィルタリングの手法デモグラフィックスユーザ評価531244423124554242843332410101性 年ユーザ評価欠損値の評価協調フィルタリングの混合
  9. 9. 協調フィルタリングの課題1. データのスパース性・・・データが圧倒的に疎であること。以下のような問題を引き起こす。– コールドスタート問題・・・新しいアイテムやユーザが追加された時に類似のアイテムを見つけるのが難しい問題。– 少カバー率問題・・・ユーザの評価が少ないアイテムは類似するアイテム等のレコメンデーションの提示が不可能になること。– 同類推移問題・・・スパースなデータベースの場合、類似のユーザであっても、全く同じアイテムを共に評価しないと類似であると判別されない問題。2. スケーラビリティ・・・ユーザ・アイテム行列は直ぐに巨大なものになること。3. シノニム・・・ほとんど同じだけど異なるとされている商品がレコメンド精度を下げる。4. 灰色の羊・・・複数のタイプの人と一致するあいまいなユーザ、レコメンドの恩恵にあずかれない人々5. シリングアタック・・・不正な商品に対する利益目的の評価を指す。
  10. 10. 協調フィルタリングを実装しているライブラリソフトウェア名 言語 URLApache Mahout Java http://mahout.apache.org 並列分散処理Cofi Java http://www.nongnu.org/cofi/ オワタCrab Python https://github.com/murioca/crabお手軽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要
  11. 11. メモリベース協調フィルタリング
  12. 12. 1.レコメンデーションの計算手順1.1.ユーザ(アイテム)間の類似性の計算1.2.ユーザ評価の予測(レコメンデーション)2.レコメンデーションアルゴリズム2.1.ユーザベースTop-Nレコメンデーション2.2.アイテムベースTop-Nレコメンデーションメモリベース協調フィルタリング• アイテムもしくはユーザの類似性に基づき、購買履歴を集計するレコメンド手法53124442312455?4vuw ,12,1P 3.95ユーザ1の評価は3.952アクティブユーザ
  13. 13. 1.1.ユーザ(アイテム)間類似性の計算UuvivUuuiuIivivuiuvurrrrrrrrw2,2,,,,)()())((1.ピアソン相関係数類似性2.コサインベクトル類似性IiivIiiuIiiviuvurrrrw2,2,,,,)(例:ユーザ間の類似性の計算53124442312455?4vuw ,1アクティブユーザUuIi 予測に用いる、基礎データとして類似性を計測する
  14. 14. 1.2.集計による予測UuuaUuuauiuaiawwrrrP||)(,,,,1.他者評価の重み付き和(ユーザベースの協調フィルタリング)類似性の高いユーザを高く評価している。2.単純重み付き和(アイテムベースの協調フィルタリング)IjjiIjjijaiawwrP|| ,,,,53124442312455?4アクティブユーザ類似性の高いアイテムを高く評価している。アクティブユーザの特定商品への評価を集計により予測する。UuIi 2,1P 3.952
  15. 15. 1.2.集計による予測UuuaUuuauiuiawwrrP||)(,,,,1.他者評価の重み付き和(ユーザベースの協調フィルタリング)類似性の高いユーザを高く評価している。53124442312455?4アクティブユーザUuIi 2,1P 3.95212,1 w04,1 w756.05,1 wアクティブユーザの特定商品への評価を集計により予測する。
  16. 16. あなたにおすすめの商品は2.1.ユーザベースTop-Nレコメンデーション• ユーザの類似性に基づいて、TopN個まで推薦可能な商品を提示する。• 「あなたと似たユーザはこんな商品も買っています。」1.ユーザaと他のユーザ間の類似性を計算2.予測似ているユーザk人を抽出他者評価の重み付き和0.75 0 -1 -1類似性k=2 7.27.07.17.0 53124233.Top-Nの商品を推薦する。メリット:ユーザに無条件でアイテムをサジェスト出来る。デメリット:計算量が大きいN=3
  17. 17. あなたにおすすめの商品は2.2.アイテムベースTop-Nレコメンデーション• アイテムの類似性に基づいて、TopN個まで推薦可能な商品を提示する。• 「この商品を買ったユーザはこんな商品も買っています。」1.アイテムaと他のアイテム間の類似性を計算2.予測似ているアイテムk個を抽出単純重み付き和0.75 0.18 0類似性3.Top-Nの商品を推薦する。メリット:事前にアイテム間類似性を計算しておけば、計算量は早いデメリット:アイテムを選択するアクションが必要・・・)33.333.4( 上位N個 35
  18. 18. 協調フィルタリングの評価
  19. 19. 協調フィルタリングの評価の枠組み• k-given法を用いたTop-Nレコメンデーションの場合1. データを2値判別問題と考える(goodRatingで2値の閾を作成)。2. データセットを学習セットと検証セットに分割(methodで分割方法を指定する。)3. 検証セットデータのk個のデータを除外して、これを入力とする。4. 入力と学習セットを用いてレコメンドを実施する。5. 除外したk個に対して、レコメンドによる予測と実績を比較する。6. ROC曲線などパターン認識の評価の枠組みを用いて評価する。
  20. 20. 協調フィルタリングの評価の枠組み• k-given法を用いたTop-Nレコメンデーションの場合1. データを2値判別問題と考える(goodRatingで2値の閾を作成)。2. データセットを学習セットと検証セットに分割(methodで分割方法を指定する。)3. 検証セットデータのk個のデータを除外して、これを入力とする。4. 入力と学習セットを用いてレコメンドを実施する。5. 除外したk個に対して、レコメンドによる予測と実績を比較する。6. ROC曲線などパターン認識の評価の枠組みを用いて評価する。
  21. 21. k-given法による評価• 2-given法の場合53124442312455?4PPNNPPPNNPPP学習セット検証セット元データ
  22. 22. k-given法による評価• 2-given法の場合PPNNPPPNNPPPPNPP???学習セット2アイテムに対する評価は与えられている。検証セット(実績)検証セット(入力)
  23. 23. k-given法による評価• 2-given法の場合PPNNPPPNNPPPPNPNPPP学習セット結果の評価検証セット(実績)検証セット(入力+出力)レコメンドの実施
  24. 24. 協調フィルタリングの評価指標
  25. 25. 協調フィルタリングの評価の枠組み• k-given法を用いたTop-Nレコメンデーションの場合1. データを2値判別問題と考える(goodRatingで2値の閾を作成)。2. データセットを学習セットと検証セットに分割(methodで分割方法を指定する。)3. 検証セットデータのk個のデータを除外して、これを入力とする。4. 入力と学習セットを用いてレコメンドを実施する。5. 除外したk個に対して、レコメンドによる予測と実績を比較する。6. ROC曲線などパターン認識の評価の枠組みを用いて評価する。
  26. 26. MAEMAE(誤り率):予測が間違っていた割合MAE=(b+c)/(a+b+c+d)実/予 良い 悪い良い a b悪い c d実/予 良い 悪い良い a b悪い c d
  27. 27. Precision、RecallPrecision(再生率):良いと予測されたものの中で、実績が良いもの。Precision=(a)/(a+c)Recall(再認率):良いという実績の中で予測が良いとなっているものRecall=(a)/(a+b)実/予 良い 悪い良い a b悪い c d実/予 良い 悪い良い a b悪い c d実/予 良い 悪い良い a b悪い c d
  28. 28. TPR、FPRTPR(陽性率):興味のあるクラスに関して、正しく判別できた割合TPR=(a)/(a+c)FPR(偽陽性率):興味のないクラスに関して、正しく判別できなかった割合FPR=(b)/(b+d)実/予 良い 悪い良い a b悪い c d実/予 良い 悪い良い a b悪い c d実/予 良い 悪い良い a b悪い c d
  29. 29. ROC曲線• (0,0)、(1,1)を結ぶ• 直角が理想的• 対角線だと完全にランダム• 傾きは常に正• 横軸との面積=AUC、判別器の指標となる。2値判別に関して、判別器のパラメータCを-∞から∞まで動かした時の、(FPR(C),TPR(C))のプロット。FPRTPR
  30. 30. Rでの実行例
  31. 31. RecommendarLab• 持っている機能– レコメンデーションアルゴリズム– レコメンデーションの評価– レコメンド用データの整形• 軽量にレコメンデーションを試してみたい場合はいいかも• 公開されているpdfの質が良いので試してみよう。
  32. 32. 評価対象データおよびその整形ratingMatrix結果評価の枠組みRecommendarLabの構成概念図binaryRatingMatrixrealRatingMatrixevaluationSchemeevaluationResultList実験済結果セットevaluationResult個別の結果セットconfusionMatrixevaluateplot結果の可視化レコメンデーションRecommenderレコメンドモデルtopNList推薦するアイテムpredictbinarizenormalizeデータの可視化imagehist
  33. 33. Jester5k• ジョークのレコメンデーションシステム• 5000人分のジョークに対する評価が含まれている。• http://eigentaste.berkeley.edu/user/index.php#サンプルデータの読み込みdata(Jester5k)Jester5kas(Jester5k[1:10], "matrix")[1:2, 1:2]# j1 j2# u2841 7.91 9.17# u15547 -3.20 -3.50Recommendelabに含まれるユーザ×ジョークのサンプルデータセット
  34. 34. データの整形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 0as(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正規化
  35. 35. 基本計算##############基本計算###############データより、サンプル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類似性の計算
  36. 36. 可視化#ヒストグラムによる基本統計量の確認#全ジョークの評価hist(getRatings(ratings), breaks=100)#正規化した全ジョークの評価hist(getRatings(normalize(ratings)), breaks=100)
  37. 37. 可視化#Z得点化した全ジョークの評価hist(getRatings(normalize(ratings,method="Z-score")), breaks=100)#ユーザ別評価数hist(rowCounts(ratings), breaks=50)
  38. 38. データの可視化#ジョーク別評価平均hist(colMeans(ratings), breaks=50)#ヒートマップによる可視化image(ratings[1:100,])
  39. 39. 基本の計算############レコメンデーション#################実数タイプのユーザ評価マトリックスのレジストリを取得する。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与えたデータに対して予測を行う
  40. 40. レコメンデーションの評価#評価スキーマを作成する(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.39660868evaluationScheme評価スキーマを作成methodsplit データを分割cross k交差検証法bootstrap ブートストラップevaluate評価の実行getConfusionMatrix混同行列の作成
  41. 41. レコメンデーションの評価#評価スキーマを作成する(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]
  42. 42. 比較結果の可視化#ROC曲線を表示する。plot(results2, "ROC")#再生と再認をグラフ表示する。plot(results2, "prec/rec")
  43. 43. まとめ• 協調フィルタリングには、メモリベース、モデルベース、ハイブリッドの3タイプ存在する。• メモリベースの協調フィルタリングは、ユーザとアイテムの類似性よりレコメンドするアイテムを決定するアルゴリズムである。• 協調フィルタリングの評価には、誤り率、ROC曲線などを用いる。• Recommenderlabを用いると、Rで簡単に協調フィルタリングの実行と、評価が実装できる。
  44. 44. まとめカテゴリ 代表的な手法 長所 短所メモリベース協調フィルタリング•類似ユーザベース協調フィルタリング•Top-Nレコメンデーション•実装が容易•データの追加が簡単•コンテンツの内容についての考慮が不要•共に評価されたアイテムのスケーリングが容易•人の評価への依存•疎なデータでの性能悪さ•新ユーザとアイテムをレコメンデーションが不可能•スケーラビリティモデルベース協調フィルタリング•ベイジアンネットワーク協調フィルタリング•クラスタリング協調フィルタリング•潜在意味協調フィルタリング•粗因子分析•次元削減を用いた協調フィルタリング•疎なデータへの対応がよい•予測性能の向上•直感的な説明を与える•モデルの構築が複雑•予測性能とパフォーマンスのトレードオフ•次元削減により有益な情報を失うハイブリッド協調フィルタリング•コンテントベース協調フィルタリング•コンテントブーステッド協調フィルタリング•メモリベースとモデルベースのハイブリッド協調フィルタリング•それぞれの協調フィルタリングの問題を克服可能•予測性能の古城•データのスパース性や灰色の羊に対応可能•実装が複雑•外部の情報が必要
  45. 45. 参考• 協調フィルタリングのサーベイ論文– A Survey of Collaborative Filtering Techniques(Xiaoyuan Su and Taghi M. Khoshgoftaar,Advances in Artificial IntelligenceVolume 2009 (2009), Article ID 421425,)• Recommenderlabの作者によるチュートリアルhttp://cran.r-project.org/web/packages/recommenderlab/vignettes/recommenderlab.pdf

×