本記事は、LightFMの本家サイト「Welcome to LightFM’s documentation!」 を翻訳(適宜意訳)したものです。
誤り等あればご指摘いただけたら幸いです。
はじめに
LightFMは、Pythonで実装された明示的なフィードバック1と暗黙的なフィードバック2の両方を持つレコメンデーションアルゴリズムです。
また、アイテムメタデータとユーザメタデータの両方を伝統的な行列分解アルゴリズムに組み込むことも可能です。これは、各ユーザとアイテムをその特徴の表現の合計として表します。これによって、新しいアイテム(アイテムの特徴を介して)と新しいユーザ(ユーザの特徴を介して)についてレコメンドすることができます。
このアプローチの詳細については、LightFMの記事(arXivで入手可能)を参照してください。
クイックスタート
もし、いますぐ実装を始めたい場合は、映画レコメンデーション(Movielens quickstart)へお進みください。
インストール
PyPI
pipを使用して、pypiからインストールします。
pip install lightfm
Linux上や、Homebrew Pythonを使用するOSX、Minicondaを使用するWindowsで動作するはずです。
以下、OSXおよびWindows環境の場合の注意事項です。
LightFMは、デフォルトでOSXおよびWindows上でOpenMPを使用しないため、すべてのモデルフィッティングがシングルスレッドになります。これは、Clang(およびMiniconda)がOpenMPをサポートしていないことと、OpenMP対応バージョンのgccをインストールすることが複雑で労力がかかるためです。これらのプラットフォームでLightFMのマルチスレッド機能を使用する場合は、次のセクションで説明するDocker経由で使用するようにしてください。
なお、OSXに含まれるデフォルトのPythonディストリビューションを使ったビルドもサポートしていません。HomebrewまたはAnacondaからバージョンで試してください。
Dockerを利用する場合
多くのシステムでは、DockerコンテナでLightFMを試してみる方が便利です。 このリポジトリは、LightFMとその例を実行するのに十分な小さなDockerfileを提供します。 それを実行するには:
- Dockerをインストールし、docker deamon/仮想マシンを起動します。
git clone git@github.com:lyst/lightfm.git && cd lightfm
該当リポジトリをクローンして、カレントディレクトリを移動します。docker-compose build lightfm
を実行してビルドし、コンテナを構築します。
これで、コンテナを使用できるようになります。Dockerコンテナでは、次のことができます:
- テストを実行する
docker-compose run lightfm py.test -x tests/
- movielensサンプルを実行する。
docker-compose run lightfm jupyter notebook examples/movielens/example.ipynb --ip=0.0.0.0
ノートブックはコンテナのIPアドレス、8888番ポートからアクセスできます。
使いかた
モデルのフィッティング3は、LightFMクラスを使用すると非常に簡単です。
潜在的な次元を持つモデルインスタンスを作成します。
from lightfm import LightFM model = LightFM(no_components=30)
train
が(no_users、no_items)行列であると仮定すると(1は正、-1は負の相互作用を表す)、次のように呼び出すことで伝統的な行列分解モデルを適合させることができます。
model.fit(train, epochs=20)
ユーザーやアイテムの機能が提供されていないため、従来のMFモデルを訓練します。
予測を取得するには、model.predictを呼び出します。
predictions = model.predict(test_user_ids, test_item_ids)
ユーザとアイテムの特徴は、fit
メソッドに渡すことでトレーニングに組み込むことができます。user_features
が(no_users、no_user_features)疎行列(item_features
の場合も同様)であると仮定すると、以下のように記述することができます。
model.fit(train, user_features=user_features, item_features=item_features, epochs=20) predictions = model.predict(test_user_ids, test_item_ids, user_features=user_features, item_features=item_features)
上記によって、モデルをトレーニングし、予測を得ます。
処理スピードを出すために、トレーニングと予測の両方を以下のように記述できます。
model.fit(train, epochs=20, num_threads=4) predictions = model.predict(test_user_ids, test_item_ids, num_threads=4)
この実装では、非同期確率勾配降下[6]を使用してトレーニングを行います。これは、相互作用行列(または特徴行列)が非常に密であり、多数のスレッドが使用されている場合、精度が低下する可能性があります。しかし、実際には、20スレッドのデータセットでトレーニングを行っても、測定可能な精度の低下はありません。
暗黙のフィードバック設定では、BPR、WARP、またはk-OS WARP損失関数を使用できます。 train
が肯定的な相互作用を表す正の項目を含む疎な行列である場合、モデルは以下のように訓練することができます。
model = LightFM(no_components=30, loss='warp') model.fit(train, epochs=20)