共著書籍「データ分析の進め方 及び AI・機械学習の導入の指南」が出版されました

機械学習レコメンドアルゴリズム「LightFM」を始めよう(翻訳)

機械学習レコメンドアルゴリズム「LightFM」を始めよう(翻訳) AI・機械学習・ディープラーニング
機械学習レコメンドアルゴリズム「LightFM」を始めよう(翻訳)

本記事は、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を提供します。 それを実行するには:

  1. Dockerをインストールし、docker deamon/仮想マシンを起動します。
  2. git clone git@github.com:lyst/lightfm.git && cd lightfm
    該当リポジトリをクローンして、カレントディレクトリを移動します。
  3. docker-compose build lightfm
    を実行してビルドし、コンテナを構築します。

これで、コンテナを使用できるようになります。Dockerコンテナでは、次のことができます:

  1. テストを実行する
    docker-compose run lightfm py.test -x tests/
  2. 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)

  1. Explicit Feedback

  2. Implicit Feedback

  3. Model fitting

【ロカラボからのお知らせ】
自社事業にAIを活用しようとする前にこれだけは押さえておいてください。

【無料ダウンロード】成功するAIプロジェクトに共通する3つの最重要ポイント

事業でAIを活用する企業様が多くなってきました。
弊社でも主に製造業・医療業を中心にAIシステムの開発や導入支援をおこなってきました。

その中で見えてきた、成功するAIプロジェクトに共通する最重要ポイントをまとめたPDFファイルを無料で配布しています。

AI導入プロジェクトをスタートする際には是非ご参考にいただけたらと思います。
こちらのページからダウンロードしてください。

Profile
荒井豊

メイドインジャパンを盛り上げる!日本のモノづくりを全力で応援しています。IT内製化コンサルタント/PM/ITセミナー講師。理詰めで考えて泥臭く行動するのが性に合ってるみたいです。嫁と娘を溺愛。将棋観戦が好き AI / IoT / DX

ロカラボをフォローする
AI・機械学習・ディープラーニング
ロカラボをフォローする
株式会社ロカラボ