推薦システムを作るときに気をつけたいデータの「スパース性」
こんにちは,Caratの斎藤( @saitoxu )です.
今回は推薦システムを構築するときに,その手法を決定する判断材料の1つとなる,データの「スパース性」について取り上げます.
推薦システムを構築する際に,
スパース性とは何か?
スパース性がレコメンドに与える影響について
あたりのことがステークホルダーで共有されていると議論を進めやすいと思ったので今回書いてみました.
参考になれば幸いです.
スパース性とは?
スパース性(sparsity)とは,平たくと言うとデータのスカスカ具合です.
よくあるレコメンドの問題設定として,ユーザのアイテムに対する評価値行列を入力として,ユーザが未評価のアイテムの評価値を予測します(図1).
※そして,予測した評価値の高い順にアイテムを推薦します.
データのスパース性が高いとは,図1の評価値行列における,入力済みの評価の数が少ない状態を指します.
推薦の研究では下の式でデータのスパース性が計算されたりします.
$$
\text{sparsity} = \Big( 1- \frac{\text{ratings}}{\text{users} \times \text{items}}\Big) \times 100 \text{(\%)}
$$
ここで,ratingsは評価値の数,usersとitemsはそれぞれユーザとアイテムの数を表します.図1の例だとsparsityは42% (= (1 - 7 / (3 x 4)) x 100) となります.
直感的にはスパース性が高いとユーザの嗜好がよく分からないという状態なので,レコメンドもうまくできなさそうという気がします.
そこで,データのスパース性を人為的に変更してみて,それがレコメンドにどのような影響を与えるのか実験してみました.
実験方法
MovieLensという映画の評価サイトで得られたMovieLens 100K Datasetというデータセットを用いて実験を行います.
このデータセットには,図1のようなユーザの映画に対する1から5までの5段階評価が含まれています.
ユーザ数943,映画数1682,評価数が100,000あるので,sparsityを計算すると93.7%になります.研究用に収集されたデータなので,これはかなりsparsityが低い方だと思います.
今回は,好意的な評価と考えられる4以上の評価値のみを利用して推薦モデルを学習し,ユーザが未評価の映画の中で4以上の評価をつけるであろう映画を予測する設定で実験を行います.
スパース性の影響を調べるため,学習データを指定した割合だけランダムに間引いて推薦モデルを学習させ,推薦精度の評価を行いました.
間引く割合は$${\{0.0, 0.1, 0.2, \dots, 0.9\}}$$の10段階で変化させて実験しました.
その他の細かい実験設定は下記になります(読み飛ばしてもらっても問題ありません).
推薦モデルは「Collaborative Filtering for Implicit Feedback Datasets (ICDM'08)」で提案されたImplicit Matrix Factorizationを使用
評価指標はPrecision@10, Recall@10, nDCG@10を採用.結果の傾向が同じだったため,実験結果にはnDCG@10のみ表示
5-Fold Cross Validationの平均値を評価値として採用
実験結果
図2が実験結果になります.
横軸が学習データを間引いた割合で,縦軸が学習データを間引かなかったとき(= 間引きの割合が0.0)の評価値に対する相対的な評価値を表しています.
グラフを見ると分かるように,学習データを間引くと(= スパース性が上がると)それに伴って推薦精度も悪化することが分かります.
以上から,スパース性が高いと推薦が難しくなるということが言えると思います.
おわりに
今回はスパース性がレコメンドに与える影響について簡単な実験を行い,スパース性が高いと推薦は難しくなるということを確認しました.
スパース性が高い場合はコンテンツベースの手法など,他の手法も検討すると良いと思います.
今回の実験で使用したコードは以下に公開しているので良かったら参考にしてください.
最後に,弊社では日本の仕事探しにおける負を一緒に解決してくれる仲間を募集しています.
下記の募集ポジションまたは,その他少しでも興味を持たれた方は斎藤のTwitterまでお気軽にご連絡ください.