LightGBMでランキング学習
LightGBMにはランキング学習するためのアルゴリズムが実装されているのでその使い方を簡単に紹介します
公式のドキュメントやすばらしい日本語記事もあるのですが、Python APIを用いた例が紹介されているものは少なかったのでここにまとめます。実際、データをファイルから読み取って使用するより、Pythonでデータ整形してからそのデータをnp.arrayやpd.DataFrameとして渡すほうが使用頻度として多いと思います。
そもそもランキング学習がよくわかってない場合やLightGBMの基本的な使い方がわかってない場合は別の記事を参照してください。
- LightGBM公式ドキュメント : https://github.com/microsoft/LightGBM/tree/master/examples/lambdarank
- 世界一わかりやすいLGBMでのランキング学習の解説記事 : http://szdr.hatenablog.com/entry/2018/12/05/001732
- 世界一わかりやすいランキング学習解説ブログ : http://szdr.hatenablog.com/
- LightGBMの基本的な使い方 : https://blog.amedama.jp/entry/2018/05/01/081842
※ LightGBMのランキング学習アルゴリズムはlambdarankとrank_xendcgが実装されていますが、基本的な使い方は同じなので今回はlambdarankを用います
パラメータ
パラメータのobjectiveをlambdarankにすることでランキング学習のアルゴリズムに設定されます。評価指標(metric)はndcg, mapなどがあります。ndcg_eval_atに設定した値によってvalidデータのndcgやmapが算出されます。例えば、今回のような[3, 5]
を渡した設定だと、ndcg@3とndcg@5が算出されます。
params = {
'objective': 'lambdarank',
'metric': 'ndcg',
'ndcg_eval_at': [3, 5],
'boosting_type': 'gbdt',
}
データセット
最も重要なのはデータセットにクエリデータを渡さなければいけないことです。先程参照した解説記事ではクエリファイルを渡すか、クエリコラムを渡すかといった方法が紹介されていますが、データをファイルから読み込まない今回の設定ではうまくいきません。group_column
というパラメータはデータをファイルから読み込むときにしか使えないので注意が必要です。そのため今回のようにデータをnp.arrayやpd.DataFrameのようなデータで渡す場合は、下のようにDatasetクラスの引数として、group
にクエリデータを渡します。
dtrain = lgb.Dataset(train, group=train_query)
dval = lgb.Dataset(test, reference=dtrain, group=test_query)
moodel = lgb.train(params, dtrain, valid_sets=dval)
このクエリデータとは何行が同じクエリかということを表しており、例えば下のような配列になります。最初の3行が同じクエリに属する、次の13行が同じクエリに属する、...といったことを表しています。ここで、また注意しなければならないのはDatasetクラスにわたすデータはクエリごとに連続して配置されていなければなりません。
[3, 13, 5, 8, 19,....]
学習は通常どおり行えば問題ないです。
予測
学習させたあとは予測です。この際にmodel.predict()
関数にクエリデータをわたす引数がないぞと思う方がいるかも知れませんが、予測の際にはクエリデータは必要ありません。lambdarankはランキングからスコア算出モデルを学習させる方法であって、ランキングをそのまま予測するモデルではない$^{※1}$ので予測にクエリデータ必要ありません$^{※2※3}$。
pred = model.predict(test, num_iteration=model.best_iteration)
※1 : もちろん予測スコアでソートすればそれがそのままランキングになります
※2 : validデータのクエリを渡しているのは、予測のためではなくvalidデータのndcgやmapを算出するのにクエリデータが必要だからです
※3 : LightGBMも公式examplesでは予測の際にもrank.test.queryというクエリを渡していますが、いらないんじゃないかと思います
参照
- 公式ドキュメント : https://github.com/microsoft/LightGBM/tree/master/examples/lambdarank
- 世界一わかりやすいLGBMでのランキング学習の解説記事 : http://szdr.hatenablog.com/entry/2018/12/05/001732
- ランキング学習: RankNetからLambdaRank、そしてLambdaMARTへ : https://qiita.com/kiita_da_yo/items/8ba552fce5b99cbf85fd
- Lambdarank, Lambdamartの論文 : http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.180.634&rep=rep1&type=pdf