どうもニコイチです。以下は、Python初学者向けに解説した「ユーザーに商品を推薦するモデル作成」の記事です。
このパートは全5回のシリーズの第4回目です。前回までにデータの読み込みや特徴量作成(Task1~3)を終えている前提で、ここではLightGBMのランク学習機能を用いて、ユーザーごとに商品を推薦するモデルを作成・予測し、その結果を評価・保存する流れを学びます。
はじめに
ECサイト運営者として、ユーザーの行動履歴データから将来購入してくれる可能性が高い商品を推薦できれば、サイトの購買率向上に大きく貢献します。
今回の記事では、すでに前タスクで作成した特徴量データ(目的変数データ)を基に、以下の内容を実装していきます。
- 各ユーザーごとの商品数(クエリリスト)の作成
- 学習データ(
train_all
)の整形(インデックスの設定とソート)および、特徴量データ (X_train
) と目的変数 (y_train
) の抽出 - LightGBMのLGBMRankerを用いたランク学習モデルの構築と学習
- 特定ユーザー(例:
'U1127'
)に対する予測、nDCGによる評価、及び上位推薦商品の抽出 - 複数ユーザーに対して予測結果を出力し、TSV形式で保存する処理
実際のデモデータ(sate_demo_train.tsv
、sate_demo_test.tsv
)を使って実装してみましょう。
データの準備
まず、前回作成した特徴量データと目的変数データの整形を行います。
ユーザーごとのクエリリスト(各ユーザーが何件の商品データを持っているか)を作成し、user_id
とproduct_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_val
、y_val
、query_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のランク学習を用いて商品推薦モデルを作成する方法を学びました。
具体的には、以下のステップを実装しました。
- クエリリスト作成とデータ整形
・user_id
とproduct_id
をインデックスに設定し、ソートする
・特徴量データ (X_train
) と目的変数 (y_train
) の抽出 - ランク学習モデルの構築
・LightGBMのLGBMRanker
を用いたモデルの作成と学習 - 個別ユーザーへの予測と評価
・特定のユーザーに対して予測を行い、nDCGを用いて推薦精度を評価 - 複数ユーザーに対する予測結果の出力とファイル保存
・ユーザー一覧から各ユーザーに対して予測を行い、結果をTSV形式で保存
この一連の流れを理解することで、推薦エンジンの構築における重要な要素—データ前処理、モデル学習、予測・評価、結果の出力—を実践的に学ぶことができます。
次回は、予測モデルの改善(データ量の調整や学習パラメータの最適化)について学び、さらに精度の高いモデルの実現に挑戦していきましょう。
このサンプルコードと解説を参考に、実際にデモデータを用いて自分自身で実装を試みてください。
Python初学者の方でも、手順に沿ってコードを実行することで、推薦エンジン構築の基礎をしっかりと身につけることができます。
コメント