あなたのECサイト、もっとユーザーに響く推薦はできていますか?
どうもニコイチです。これまでのシリーズで基礎から推薦エンジンの作り方を学んできましたが、最終回の今回は『予測モデルの改善』にフォーカス。
Python初心者でも安心して取り組める、データ分割の新アプローチとLightGBMのearly stoppingを活用した学習パラメータ調整法をご紹介します。
これにより、無駄を省いたデータ活用と精度向上が実現でき、あなたのECサイトの購買率アップに直結するはずです。さあ、次の一歩を踏み出しましょう!
はじめに
これまでのシリーズでは、
- データの読み込みと確認
- ユーザーと商品の行動分析
- モデリングのための特徴量作成
- ユーザーに商品を推薦するモデル作成
という流れで推薦エンジンの基礎を構築してきました。
今回第5回目は、予測モデルの改善:データ量の調整と学習パラメータの調整 についてです。
ECサイトの運営者として、過去のユーザー行動データをもとに「どのユーザーが将来どの商品を購入しやすいか」を予測できれば、推薦エンジンの精度向上に直結します。
ここでは、与えられたデータ(今回のデモデータは sate_demo_test.tsv
と sate_demo_train.tsv
です)から、できるだけ無駄なく学習データを活用する方法と、モデル学習時にearly stopping を適用して過学習を防ぐ方法を解説します。
学習データの量を増やすためのデータ分割
前回はデータを期間で半分に分割して学習用と検証用にしていましたが、今回は全体の期間を3等分することで、データの無駄を減らし、学習用と検証用のデータの期間を重複させる(もしくは調整する)方法を取ります。
以下のコードは、pandasを用いてデータを読み込み、time_stamp
カラムを datetime 型に変換した上で、全体期間を3等分し、学習用データと検証用データを抽出する例です。
# pandasをpdとしてインポート
import pandas as pd
# ファイル'sate_demo_train.tsv'(タブ区切り)の読み込み
data = pd.read_csv("sate_demo_train.tsv", sep="\t")
# 'time_stamp'カラムをdatetime型に変換
data['time_stamp'] = pd.to_datetime(data['time_stamp'])
# データ全体の期間の開始時刻と終了時刻を取得
start = data['time_stamp'].min()
end = data['time_stamp'].max()
# 全期間を3等分したときの期間(interval)を計算
interval = (end - start) / 3
# 学習用データの抽出: 最初の期間+中間の期間(全体の最初から2/3まで)
data_train = data[data['time_stamp'] <= start + interval * 2]
# 検証用データの抽出: 中間から終了まで
data_val = data[data['time_stamp'] >= start + interval]
解説
- 期間の計算:
interval
には、全体の期間を3等分した1区間の長さが格納されます。 - 学習用データ:
最初の2区間分のデータを使用することで、学習データの量を最大化しつつ、後半のデータを検証に利用します。 - 検証用データ:
中間以降のデータを検証用とすることで、実際の予測時に近い状況でモデルの性能を評価できます。
この方法により、無駄なく多くのデータを学習に活用することが可能になります。
LightGBMのearly stoppingによる学習パラメータの調整
機械学習モデルでは、学習用データに対してあまりに高い精度を出しすぎると、未知のデータ(検証用データや実運用データ)に対して精度が低下する「過学習(オーバーフィッティング)」のリスクがあります。
LightGBMでは、early_stopping_rounds
オプションを使うことで、検証用データに対する評価指標(例:ndcg)が改善しなくなった時点で学習を打ち切ることができます。
以下は、LightGBMのランク学習モデルにおいて、early_stopping_rounds
を1に指定して学習を早期終了させる例です。
import lightgbm as lgb
# LGBMRankerモデルのインスタンス化
model = lgb.LGBMRanker()
# early stoppingを適用して学習
# ※X_train, y_train, query_list, X_val, y_val, query_list_valは前のタスクで作成済みとします。
model.fit(
X_train, y_train,
group=list(query_list),
eval_set=[(X_val, y_val)],
eval_group=[list(query_list_val)],
early_stopping_rounds=1 # ここでearly stoppingの回数を指定
)
解説
- early_stopping_rounds の指定:
このパラメータにより、指定回数分(ここでは1回)連続して検証用データで評価指標が改善しない場合、学習を自動的に停止します。 - メリット:
- モデルの学習が過度になり、未知のデータへの適応が悪化することを防げます。
- 早期に最適なモデルを選択するため、学習時間の短縮にもつながります。
また、early stoppingを適用した場合、predict
メソッドを使って予測するときは、検証用データに対して最高の精度を出したモデルが自動的に使用されます。
以下は、ユーザーID 'U1127'
に対する予測結果の比較例です。なお、ndcg
関数は評価指標を計算するための関数(詳細は別途実装)とします。
# early stopping適用時の予測
pred = model.predict(X_val.loc['U1127'])
pred_products = pd.Series(pred, index=X_val.loc['U1127'].index)
# 予測スコアの降順にソートして上位20の商品を選択
products = pred_products.sort_values(ascending=False).index
output = list(products)[:20]
print('\nno early stopping:')
print(ndcg(output_0, y_val.loc['U1127']))
print('early stopping:')
print(ndcg(output, y_val.loc['U1127']))
ポイント
- 評価結果の比較:
上記のコード例では、early stoppingを適用した場合と適用していない場合の評価指標(ndcg)の違いを確認しています。 - パラメータ調整の実験:
early_stopping_rounds
の値を変えてみたり、他の学習パラメータ(例:learning_rate、max_depthなど)も調整することで、モデルの精度がどのように変わるか試してみることが推奨されます。
より詳細なパラメータのチューニング方法については、LightGBMの公式ドキュメント(LightGBM Parameters Tuning)を参考にしてください。
まとめ
今回は、ECサイトにおけるユーザー行動データを最大限に活用するためのデータ分割方法と、LightGBMのearly stoppingを用いた学習パラメータの調整方法を学びました。
- データ分割:
全期間を3等分し、学習用データと検証用データの期間を調整することで、より多くの学習データを利用可能にしました。 - early stopping:
過学習を防ぐため、検証用データの評価指標が改善しなくなった時点で学習を終了させ、最適なモデルを選択しました。
これらのテクニックを活用し、さらに実験を重ねることで、より高精度な推薦エンジンの構築が期待できます。次回は、他の学習パラメータの調整方法やモデル改善のアイデアについてさらに深堀りしていきましょう。
コメント