【徹底解説】LightGBMで実践!Python初心者のためのECサイト推薦エンジン構築法

PR表記

※アフィリエイト広告を利用しています

どうもニコイチです。以下は、Python初学者向けに解説した「ユーザーに商品を推薦するモデル作成」の記事です。
このパートは全5回のシリーズの第4回目です。前回までにデータの読み込みや特徴量作成(Task1~3)を終えている前提で、ここではLightGBMのランク学習機能を用いて、ユーザーごとに商品を推薦するモデルを作成・予測し、その結果を評価・保存する流れを学びます。

目次

はじめに

ECサイト運営者として、ユーザーの行動履歴データから将来購入してくれる可能性が高い商品を推薦できれば、サイトの購買率向上に大きく貢献します。
今回の記事では、すでに前タスクで作成した特徴量データ(目的変数データ)を基に、以下の内容を実装していきます。

  • 各ユーザーごとの商品数(クエリリスト)の作成
  • 学習データ(train_all)の整形(インデックスの設定とソート)および、特徴量データ (X_train) と目的変数 (y_train) の抽出
  • LightGBMのLGBMRankerを用いたランク学習モデルの構築と学習
  • 特定ユーザー(例:'U1127')に対する予測、nDCGによる評価、及び上位推薦商品の抽出
  • 複数ユーザーに対して予測結果を出力し、TSV形式で保存する処理

実際のデモデータ(sate_demo_train.tsvsate_demo_test.tsv)を使って実装してみましょう。

データの準備

まず、前回作成した特徴量データと目的変数データの整形を行います。
ユーザーごとのクエリリスト(各ユーザーが何件の商品データを持っているか)を作成し、user_idproduct_idをインデックスに設定、その上でソートを実施します。

以下のコード例では、データフレーム train_all に対して処理を行っています。

# クエリリスト作成:各ユーザーが持つ商品数をカウント
query_list = train_all["user_id"].value_counts()

# user_idとproduct_idをインデックスに設定
train_all = train_all.set_index(['user_id', 'product_id'])

# クエリリストとtrain_allをインデックスでソート
query_list = query_list.sort_index()
train_all = train_all.sort_index()

# 特徴量データとして、指定のカラムのみ抽出
X_train = train_all[['p_u', 'p_pv', 'p_ca', 'p_cl', 'p_cv',
                     'u_p', 'u_d', 'u_pv', 'u_p_pv', 'u_p_ca', 'u_p_cl', 'u_p_cv']]

# 目的変数(関連度)の抽出
y_train = train_all["y"]

ポイント解説

  • クエリリスト作成
    ユーザーごとに存在する商品の数を value_counts で集計しています。
  • インデックスの設定とソート
    機械学習モデルでは、ユーザーや商品のIDが説明変数として扱われてしまわないよう、インデックスに設定した上で、順序を揃えるためにソートしています。

LightGBMによるランク学習モデルの構築

次に、LightGBMライブラリを用いてランク学習モデルを構築します。
ここでは、ランク学習用のモデルである LGBMRanker を使い、学習データと検証データを指定して学習させます。
(※検証用データとして X_valy_valquery_list_val が用意されているものとします。)

import lightgbm as lgb

# LGBMRankerモデルの作成
model = lgb.LGBMRanker()

# モデルの学習(group引数にはクエリリストの値をリスト化して指定)
model.fit(X_train, y_train, group=list(query_list),
          eval_set=[(X_val, y_val)], eval_group=[list(query_list_val)])

ポイント解説

  • group引数の利用
    ランク学習では、各クエリ(ここではユーザー)ごとのサンプル数が必要です。list(query_list) により、インデックスを取り除いたリストを渡します。
  • eval_setとeval_group
    学習中に検証データで評価を行うことで、モデルの過学習を防ぎながら精度向上を狙います。

特定ユーザーに対する予測と評価

ここでは、学習済みモデルを用いて、特定のユーザー(例:'U1127')に対して商品推薦の予測を行います。
予測結果は、ユーザーに対応する特徴量データ(X_val.loc['U1127'])から取得し、商品IDとの紐付けやソートを実施して、関連度が高い上位5件を抽出します。

# ユーザーID 'U1127' に対する予測結果を取得
pred = model.predict(X_val.loc['U1127'])

# 商品IDと予測結果を紐付け(pandasのSeriesにより実施)
pred_products = pd.Series(pred, index=X_val.loc['U1127'].index)

# 予測結果を関連度が高い順に並び替え
products = pred_products.sort_values(ascending=False).index

# 上位5件を抽出
output = list(products)[:5]

# nDCGを用いて予測精度を評価(ndcg関数は事前に定義済みとする)
print(ndcg(output, y_val.loc['U1127']))

# 予測結果と正解データの確認
print('\nprediction:')
print(output)

print('\nground truth:')
print(list(y_val.loc['U1127'].sort_values(ascending=False).index))

ポイント解説

  • 予測と商品IDの紐付け
    model.predict により得られた数値(関連度スコア)と、もともとの商品ID(X_val のインデックス)を pd.Series で対応付けます。
  • ソートと上位抽出
    sort_values(ascending=False) により、関連度が高い順に並び替え、上位5件のみ抽出しています。
  • nDCG評価
    nDCGは推薦精度評価の代表的な指標で、0~1の値を取り、値が高いほど理想に近い推薦ができていることを意味します。

複数ユーザーに対する予測結果の出力と保存

次は、すべてのユーザーに対して予測を実施し、その結果(ユーザーID、商品ID、ランキング)をTSVファイルとして保存する方法です。
ここでは、ユーザー一覧が記載されたファイル users.tsv を読み込み、各ユーザーごとに上位20件の予測結果を出力します。

# ユーザー一覧ファイルを読み込み
users = pd.read_csv('users.tsv', sep='\t', header=None)

user_ids = []
product_ids = []
ranks = []

# 各ユーザーに対して予測処理を実施
for user in users[0]:
    # 各ユーザーの特徴量データに対して予測
    pred = model.predict(X_val.loc[user])
    pred_products = pd.Series(pred, index=X_val.loc[user].index)
    
    # 予測結果を関連度が高い順に並び替え
    products = pred_products.sort_values(ascending=False).index
    
    # 上位20件に絞る
    output = list(products)[:20]
    
    # ユーザーID、商品ID、ランキングをそれぞれリストに追加
    user_ids += [user] * len(output)
    product_ids += output
    ranks += list(range(1, len(output) + 1))

# 結果をDataFrameにまとめる
results = pd.DataFrame({'user_id': user_ids, 'product_id': product_ids, 'rank': ranks})

# 結果の一部を表示して確認
print(results.head())

# 'results.tsv'としてヘッダー・インデックスなしで保存
results.to_csv('results.tsv', sep="\t", header=None, index=None)

ポイント解説

  • ループ処理による予測
    for文を用いて、各ユーザーごとに予測を行い、上位20件を抽出。
  • DataFrameの作成と保存
    ユーザーID、商品ID、ランキングの各リストをまとめ、to_csv を用いてTSVファイルに保存しています。

まとめ

今回の記事では、ECサイト上のユーザー行動データから、LightGBMのランク学習を用いて商品推薦モデルを作成する方法を学びました。
具体的には、以下のステップを実装しました。

  1. クエリリスト作成とデータ整形
    user_idproduct_idをインデックスに設定し、ソートする
    ・特徴量データ (X_train) と目的変数 (y_train) の抽出
  2. ランク学習モデルの構築
    ・LightGBMの LGBMRanker を用いたモデルの作成と学習
  3. 個別ユーザーへの予測と評価
    ・特定のユーザーに対して予測を行い、nDCGを用いて推薦精度を評価
  4. 複数ユーザーに対する予測結果の出力とファイル保存
    ・ユーザー一覧から各ユーザーに対して予測を行い、結果をTSV形式で保存

この一連の流れを理解することで、推薦エンジンの構築における重要な要素—データ前処理、モデル学習、予測・評価、結果の出力—を実践的に学ぶことができます。
次回は、予測モデルの改善(データ量の調整や学習パラメータの最適化)について学び、さらに精度の高いモデルの実現に挑戦していきましょう。

このサンプルコードと解説を参考に、実際にデモデータを用いて自分自身で実装を試みてください。
Python初学者の方でも、手順に沿ってコードを実行することで、推薦エンジン構築の基礎をしっかりと身につけることができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次