Mahout in ActionのChapter2についての自分の理解をメモ。
推薦の定義
ユーザベース
・ユーザとアイテムの関連に基づく推薦。
・嗜好の似ている人が好きそうなものを推薦する。
・属性は考慮しない。
・Mahoutで適切に表現可能アイテムベース
・ユーザとアイテムの関連に基づく推薦。
・好きなアイテムに似ているアイテムを推薦する。
・属性は考慮しない。
・Mahoutで適切に表現可能コンテンツベース
・アイテムの属性に基づく推薦。
・Mahoutはあまりサポートしない。
・Mahoutと組み合わせて実現可能。
初めての推薦エンジン
- ここではユーザベースの推薦アルゴリズムを使用
- MahoutのインプットデータのIDは常に数字(整数)。嗜好度は大きい値がより嗜好度が強いことを意味すればどのような値でもよい。
CSV形式でインポートデータを用意。
Recommenderの作成
・DataModel:データの保持、データへのアクセス
・UserSimilarity:ユーザ間の類似度
・UserNeighborhood:ユーザの類似グループ
・Recommender:上記コンポーネントを元に推薦アイテムを抽出結果の分析
・現実はデータ量が膨大でノイズも含んでいる
・膨大なデータから正しい結果を素早く抽出することは重要
Recommenderの評価
- 実際のデータの一部を元にシミュレート可能
- 評価された結果と実際のデータの間での平均値の違いを計算可能
- 上記評価の値は小さいほど良い
- 上記値が0.0の場合、評価された値と本番データの差はないということ
- RecommenderEvaluatorはデータを評価用に分割し、DataModelとRecommenderを生成し、評価された値を実際のデータと比較する
- 例でevaluate()メソッドにRecommenderが渡されていないのは、メソッド内部で新たに作られたDataModelについてRecommenderを生成する必要があるため
- メソッドの呼び出し元からDataModelからRecommenderを生成するためのRecommenderBuilderを渡す必要がある。
- ここではこの章で前出の実装と同じものが生成される
- RandomUtils.useTestSeed()では毎回同じランダム値を取得する。本番コードで使ってはいけない。
- プログラム2.3の例では実行結果は1.0が返ってくるが、この値の意味は実装に寄って異なり、ここではAverageAbsoluteDefferenceRecommenderEvaluatorが使われている。
- 実行結果が異なるかもしれないが、それはデータセットの分割がランダムであり、実行の度にトレーニングセットの内容が異なることによるもの。
- root-means-square(二乗平均平方根)によるスコアリングに変更する場合は、AverageAbsoluteDifferenceRecommenderEvaluatorをRMSRecommenderEvaluatorに置き換える
- evaluate()メソッドにnullの代わりにDataModelBuilderを渡すことができ、それによってトレーニングデータからどのようにDataModelが作られるかを制御することが出来る。通常はデフォルトが良い。
- 例でevaluate()メソッドに渡されている1.0という値は入力データのどれぐらいの割合が使われるかということで、ここでは100%とという意味。
正確さと再現度の評価
- 正確さは上位の推薦結果の中の良い推薦の割合。
- 再現度は良い推薦の中の上位の推薦結果に含まれる割合。
- Mahoutはこれらの計算を極めて簡潔な方法で行うことが出来る。
- RandomUtils.useTestSeed()を使わない場合、ここではデータセットが小さいので、結果はデータセットのランダムな抽出に大きな影響を受ける。
- 推薦結果の良し悪しを分ける明確な境界が与えられていない場合、フレームワークがユーザごとに嗜好の平均に標準偏差を加算したものを使用する。
GroupLensのデータセットを評価する
- GroupLensとは実際のユーザの映画に対する評価のリサーチプロジェクトで、いくつかの種類の大きさのデータセットを提供している
- ここでは 100Kデータセットを使用 http://www.grouplens.org/node/73
- ダウンロードしたファイルを解凍した中に含まれている ua.base はタブ区切りのユーザID、アイテムID、評価、その他の追加の情報のファイル
- FileDataModelで扱うことができる。前出のintro.csvの代わりに使用
- Slope One Recommenderを使用してみる
- RecommenderBuilderでSlopeOneRecommenderを使用するようにすることで利用可能
- サンプルを実行すると非常に高速だが、Slope Oneアルゴリズムが常に高速というわけではない
- 計算の前処理に非常に時間がかかる場合がある
- この違いは実際のデータでテスト・評価することの大切さと、Mahoutを使うと比較的簡単に行えることを示している