LightFMによるハイブリッド推薦
「協調フィルタリングとコンテンツベースにはそれぞれ弱点がある。組み合わせたらどうなる?」
田中VPoEがLightFMのドキュメントを指す。
「LightFMはユーザー/アイテムの特徴量を協調フィルタリングに組み込めるハイブリッドモデルだ。特にコールドスタート問題に強い。」
LightFMの仕組み
従来の行列分解:
予測スコア = ユーザー潜在ベクトル ・ アイテム潜在ベクトル
LightFM:
ユーザー潜在ベクトル = Σ(ユーザー特徴量の埋め込み)
アイテム潜在ベクトル = Σ(アイテム特徴量の埋め込み)
予測スコア = ユーザー潜在ベクトル ・ アイテム潜在ベクトル + バイアス
| 特徴 | 説明 |
|---|---|
| 入力 | インタラクション行列 + ユーザー/アイテム特徴量 |
| 損失関数 | WARP, BPR, logistic |
| 強み | コールドスタート対応、特徴量の活用 |
| 弱み | 大規模データでの学習速度 |
実装
from lightfm import LightFM
from lightfm.data import Dataset
from lightfm.evaluation import precision_at_k, auc_score
import numpy as np
# データセットの構築
dataset = Dataset()
dataset.fit(
users=user_ids,
items=item_ids,
user_features=user_feature_labels,
item_features=item_feature_labels,
)
# インタラクション行列
interactions, weights = dataset.build_interactions(
[(uid, iid, rating) for uid, iid, rating in interaction_data]
)
# ユーザー特徴量
user_features = dataset.build_user_features(
[(uid, features) for uid, features in user_feature_data]
)
# アイテム特徴量
item_features = dataset.build_item_features(
[(iid, features) for iid, features in item_feature_data]
)
# モデル学習
model = LightFM(
no_components=64, # 潜在次元数
loss='warp', # WARP損失(ランキング最適化)
learning_rate=0.05,
item_alpha=1e-6, # L2正則化
user_alpha=1e-6,
)
model.fit(
interactions,
user_features=user_features,
item_features=item_features,
epochs=30,
num_threads=4,
)
# 評価
train_precision = precision_at_k(
model, interactions,
user_features=user_features,
item_features=item_features,
k=10,
).mean()
print(f"Precision@10: {train_precision:.4f}")
損失関数の比較
| 損失関数 | 特徴 | 適用場面 |
|---|---|---|
| WARP | ランキング最適化、上位の精度を重視 | Top-N推薦 |
| BPR | ペアワイズランキング学習 | 暗黙的フィードバック |
| logistic | ポイントワイズ、確率出力 | 評価値予測 |
推薦の生成
def recommend_items(model, user_id, user_features, item_features,
n_items, known_items=None):
"""ユーザーへの推薦アイテムを生成"""
n_total_items = item_features.shape[0]
scores = model.predict(
user_ids=user_id,
item_ids=np.arange(n_total_items),
user_features=user_features,
item_features=item_features,
)
# 既知のアイテムを除外
if known_items is not None:
scores[known_items] = -np.inf
# 上位N件を取得
top_items = np.argsort(-scores)[:n_items]
return [
{'item_id': int(item), 'score': float(scores[item])}
for item in top_items
]
まとめ
| 項目 | ポイント |
|---|---|
| LightFM | 特徴量を埋め込みに変換するハイブリッドモデル |
| WARP損失 | ランキング最適化に最適 |
| コールドスタート | 特徴量があれば新規ユーザー/アイテムにも推薦可能 |
| 実装 | lightfm.Datasetで特徴量行列を構築 |
チェックリスト
- LightFMのハイブリッドアプローチを説明できる
- WARP損失の利点を理解した
- ユーザー/アイテム特徴量の構築方法を実装できる
- 推薦結果の生成と評価ができる
次のステップへ
LightFMを理解した。次はTwo-Towerモデルを学ぼう。
推定読了時間: 30分