🛒

リアルタイム推薦ライブラリrtrecについて発表@DBEM6

に公開

Database Engineering Meetup #6: Data + AI

友人でScalar CTOの山田さんに誘われて先日行われた「第6回Database Engineering Meetup: Data + AI」で、OSSのリアルタイム推薦ライブラリrtrecについて発表してきました。

DBEMは、@frsyukiが登壇していた第一回以来の久々の参加です。

主にデータベース技術者やデータエンジニア向けの技術ミートアップですが、今回はDB界隈出身で今はAI関連開発されているNEC小山田さんと最近Turingに移籍した高橋さんと共に、今回はテーマは「Data + AI」というテーマでDB研究コミュニティで今はAI/機械学習に携わっている人たちの話を聞くというテーマでした。参加者数は、当日の会場の参加者が58名、オンラインでの聴講登録が163名でした。

発表内容

弊社の顧客データプラットフォーム(Customer Data Platform)のリアルタイムパーソナライゼーション強化の一環として、研究開発したリアルタイムレコメンドエンジンrtrecについて発表しました。

データエンジニアの方が主な聴衆と見込まれることもあり、推薦アルゴリズム入門的な内容も兼ねていて、「推薦アルゴリズム チョットワカル」というようになって貰えばというtakeawayでした。

畑違いのところに踏み込んだ内容でしたが、それなりに反響を貰えたのでよかったです。

OSS化

rtrecについては、予備調査的な内容ですし、Treasure Data(TD)としてはSaaSでアプリレイヤで違いを生むので、オープンソースソフトウェアとして広く公開しています。実務家からのフィードバック歓迎します[1]。第三者に利用して貰うことで自分では見つけられなかった課題も出ると思いますので、実用性を高めていけたらと思います。TDはSaaSなので顧客データやユースケースは沢山あるが、自分自身で実運用はあまりできないという事情もあるので、もし実務家の方で導入に向けて詳しく話を聞きたい方がいれば社内講演とかもできますので、DM等で声をかけて頂ければと思います。

rtrecの使い方

環境構築

インストールは pip install rtrec して頂ければ使えるはずです。

開発する方は、CIを参考にuvでビルドしてください。

私は普段は、devcontainerを利用してVSCode環境で開発しています[2]

rtrecの利用例

rtrecでは、Pandas Dataframeを入力としてとるHigh-level APIとプリミティブなRaw-level APIを用意しています。テスト・評価段階では、Dataframeを使って、実運用ではRaw-level APIを使うことになるかと思います。

体験頂くには、以下のボタンよりGoogle Colabで触って頂くのが、最も手取り早いです。

Open In Colab

# Movielensの1Mデータセットをロードします。いくつかのpublicデータセットをサポートしていますので、詳細はload_datasetの中をご覧ください。
from rtrec.experiments.datasets import load_dataset
df = load_dataset(name='movielens_1m')

# temporal user splitでデータフレームを分割します。
# ここでは、70%を訓練、30%を評価に用いることとします。
# rtrec.experiments.splitでは、ランダム分割やTemporal Global Split等もサポートしています。
from rtrec.experiments.split import temporal_user_split
train_df, test_df = temporal_user_split(df, test_frac=0.3)
from rtrec.recommender import Recommender
from rtrec.models import SLIM

#model = SLIM() 
model = SLIM(nn_feature_selection=50)
# decay_in_daysは評価値の半減期を指定することができます。指定しない場合は、decayなしです。
#model = SLIM(min_value=0, max_value=15, decay_in_days=180, nn_feature_selection=50)

# 抽象化を行なってハイレベルなAPIを提供するのがRecommenderクラスがです。
recommender = Recommender(model)

# Bulk fit
recommender.bulk_fit(train_df)

# recommender.fit(train_df)が差分更新を行うpartial_fit()に相当します。

# 代表的な評価尺度での評価にはevaluateメソッドを呼び出します。
metrics = recommender.evaluate(test_df, recommend_size=10, filter_interacted=True)
print(metrics)

さいごに

rtrecはまだまだ発展途上のライブラリです。至らないところも多いと思いますが、気軽にgithub issues等で質問やフィードバック頂ければと思います。

脚注
  1. 日本語でも良いので、お気軽にgithub issueなどにfeedbackどうぞ。レコメンドサービスをSaaSで汎用に提供する都合もあり、間口を広げた最大公約数的なアプローチをとる必要があり、TwoTowerモデルなどは採用していませんが、スライドに書いたようにハイブリッドアプローチも有効です。 ↩︎

  2. Dockerfileはこちら↩︎

Discussion