40
37

More than 3 years have passed since last update.

LightGBMでランキング学習

Posted at

LightGBMでランキング学習

LightGBMにはランキング学習するためのアルゴリズムが実装されているのでその使い方を簡単に紹介します

公式のドキュメントやすばらしい日本語記事もあるのですが、Python APIを用いた例が紹介されているものは少なかったのでここにまとめます。実際、データをファイルから読み取って使用するより、Pythonでデータ整形してからそのデータをnp.arrayやpd.DataFrameとして渡すほうが使用頻度として多いと思います。
そもそもランキング学習がよくわかってない場合やLightGBMの基本的な使い方がわかってない場合は別の記事を参照してください。

※ 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というクエリを渡していますが、いらないんじゃないかと思います

参照

40
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
37