ホーム  >   ブログ  >   推薦システムのためのOSSたち

2017-05-14

推薦システムのためのOSSたち

情報推薦=機械学習 ではない。

もちろん機械学習アルゴリズムを使えば精度は高くなるかもしれないが、実際は推薦理由の説明が必要であったり、膨大なデータサイズや要求されるパフォーマンスに応えるために、『いかに機械学習をしない選択をするか』も重要になる。

さらに、RecSys2016のLinkedInとQuoraのチュートリアルで語られたように、現実の推薦システムはヒューリスティクスに基づく単純な手法から深層学習まで、複数のものを組み合わせた ハイブリッド なものであることが多い。

  • ヒューリスティクス/機械学習の混在したハイブリッドな推薦手法
  • 適切な指標による精度の評価とモデルの改善
  • サービスごとに異なる多様なデータフォーマットの扱い

ということを考えると、推薦システム専用の実装 というものが必要になってくる。というわけで、推薦システム構築に使える/参考になるOSSをいくつか紹介する。

※チョイスは個人の経験に拠るものなのであしからず。この他にもGitHub上には無数にライブラリが存在するので、他にイケてるものがあればぜひ教えてください。

MyMediaLite (C#)

実装が C# というのがネックだけど、推薦アルゴリズムのオープンソース実装で最も有名なのはおそらくこれ。2010年秋ごろから開発されていて、このあと挙げるような他のライブラリはみんな論文でMyMediaLiteを引用している。

対応しているアルゴリズムは協調フィルタリング、Matrix Factorization系が中心。Average Rating や Most Popular のような機械学習をしないベースライン手法も選べる。

他のライブラリの実装を見るとみんな似たり寄ったりな感じで、「このライブラリはMyMediaLiteチルドレンなんだなー」と気付くこともしばしば。

残念ながらここ数年は開発が滞り気味。

ちなみに論文はFactorization Machinesの作者のRendle先生も共著者に入っている。

LibRec (Java)

2014年から開発されているJavaの推薦アルゴリズム実装で、先日『Java製の推薦システム用ライブラリ LibRec を動かしてみる』でも言及した。

僕が知る中で今最も盛んに開発が行われているライブラリで、つい最近 version 2.0 になってからはドキュメントとかもグッと良くなった。

MyMediaLiteを参考にしつつも、よく練られた設計や豊富な対応アルゴリズムによって独自の地位を築いている印象がある。

似たようなJava製ライブラリだと PREA があるけど、こっちはもう全く更新されていない様子。

LensKit (Java)

2010年ごろから開発されているJava製のライブラリ。ミネソタ大学のチーム GroupLens に以前在籍していたMichael Ekstrand先生が中心になって開発している。これ自体が彼の博士研究の一貫でもあった。

アルゴリズムは協調フィルタリングとMatrix Factorizationがメインで極めてシンプル。

実装はともかく、論文に関しては一読の価値がある。(今やほとんど聞かないけど)Dependency Injection的な思想で、どのようにコンポーネントを切り分けて推薦ライブラリを実装するか、ということを解説している。このあたりはLibRecの設計に近い印象を受けた。

なお、Ekstrand先生にはCourseraの推薦システムのコースで会えます。

Apache Mahout あるいは Hivemall (Java)

先に挙げたライブラリとは少し毛色が違うけど、Spark, Hadoop上で情報推薦を実現する際は Apache MahoutHivemall が選択肢になる。

特にMahoutは推薦アルゴリズムの実装・利用に力を入れていて、『Introduction to Cooccurrence Recommenders with Spark』などにそのことが細かく紹介されている。そういえば、以前読んだフリー書籍の "Practical Machine Learning" はMahoutを使った推薦システムの構築を激推しする内容だった。

あと、つい先日開催された GPU Technology Conference Silicon Valley のセッション "Apache Mahout's new recommendation algorithm and using GPUs to speed model creation" がすごく気になる。引き続きウォッチしていきたい。

一方、Hivemallはクエリを組み上げていくことで協調フィルタリングMatrix FactorizationFactorization Machinesによる推薦(予測)ができる。さらに、Factorization Machinesの拡張版で未だオープンソース実装が少ないField-aware Factorization Machinesまでサポートされている点はポイントが高い。しかし、『クエリで行う情報推薦』が嬉しいかどうかはあなた次第。

なお、Hivemallでアイテム推薦については『MacのローカルにHivemallを導入してアイテム推薦をするまで』も参照されたい。

そうそう、Sparkで推薦といえば MLlib を忘れてはいけない。Pythonインタフェースがあるのも嬉しい。これについては Collaborative Filtering - RDD-based API から。

fastFM (Python)

Factorization Machinesに特化したPythonライブラリで、Rendle先生の昔の所属先の博士学生(?)のBayer氏が開発している。

scikit-learnに準ずるインタフェースを提供しつつ、コア部分を完全に分離してC言語 (Cython) で実装している点はお見事。

Factorization Machines自体は汎用的な予測モデルなので推薦限定というわけではないけれど、背景を鑑みると、やっぱりこのライブラリの主な用途は推薦になるんだと思う。

評価値予測なら二乗損失によるRegression、アイテム推薦ならBayesian Personalized Rankingによるランキング予測を行う。

実は、Python製のまともな推薦システム特化型ライブラリというのはかなりレアな存在。既存ライブラリの中で人気なのは Surprise だろうか。(お恥ずかしながら僕は最近これを知りました。)

LL言語でみんな簡単に独自実装できるので、推薦システムという広い文脈では“全部入り”なライブラリの需要があまりないのかなぁ、と思う。推薦システム専用の実装が欲しければ自分で書けばいいじゃない、という空気感。

Pythonなら、fastFMのようにあるアルゴリズムや機能に特化したライブラリのほうが使ってもらえそう。

まとめ

これまでに何度も実装を参考にしたり、頻繁に名前を聞いたようなOSSライブラリをまとめた。

Spark, Hadoopは例外だけど、紹介したライブラリの主なユースケースは、

  • プロダクション用の推薦ロジックの研究開発段階で利用する
  • 研究者が論文の評価実験のために使う

になるんだろうなぁと思ってる。でも実際のところ、どうなんだろう。「LibRec使って書いたコードを夜間バッチで走らせてます」みたいな事例があったら知りたいけど。

そして余談だけど、僕も修士研究のときに推薦アルゴリズムの実装をライブラリ化した:

しかしこれらはまだまだ実用レベルに達していないので、もっと頑張る必要がある。

推薦アルゴリズムの実装は、汎用的なものにしようとすると意外と考えることが多くて難しい。けどそれが楽しい :)

  シェアする

このエントリーをはてなブックマークに追加

  カテゴリ

情報推薦 機械学習 プログラミング

  あわせて読みたい

2017-11-23
筋トレ、登山、昨今の推薦システムのトレンドなどについて話しました
2017-11-17
Podcast "Data Skeptic" の推薦システム回が良すぎて3回聞いた
2017-04-23
Java製の推薦システム用ライブラリ LibRec を動かしてみる

  もっと見る

最終更新日: 2022-01-18

  書いた人: たくち

Takuya Kitazawaたくち)です。長野県出身、カナダ・バンクーバー在住のソフトウェアエンジニア。これまでB2B/B2Cの各領域で、Web技術・データサイエンス・機械学習のプロダクト化および顧客への導入支援・コンサルティング、そして関連分野の啓蒙活動に携わってきました。現在は主に北米(カナダ)、アジア(日本)、アフリカ(マラウイ)の個人および企業を対象にフリーランスとして活動中。詳しい経歴はレジュメ を参照ください。いろいろなまちを走って、時に自然と戯れながら、その時間その場所の「日常」を生きています。ご意見・ご感想およびお仕事のご相談は [email protected] まで。

  近況   一杯のコーヒーを贈る

  免責事項

  • Amazonのアソシエイトとして、当サイトは amazon.co.jp 上の適格販売により収入を得ています。
  • 当サイトおよび関連するメディア上での発言はすべて私個人の見解であり、所属する(あるいは過去に所属した)組織のいかなる見解を代表するものでもありません。
  • 当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、個人ブログという性質上、誤情報や客観性を欠いた意見が入り込んでいることもございます。いかなる場合でも、当サイトおよびリンク先に掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。
  • その他、記事の内容や掲載画像などに問題がございましたら、直接メールでご連絡ください。確認の後、対応させていただきます。