LESSON

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分