Skip to content

lightgbmのfeature-transform(特徴量の非線形化)をすることで、80,000を超える特徴量を線形回帰でも表現できることを示します

License

Notifications You must be signed in to change notification settings

GINK03/lightgbm-feature-transform

Repository files navigation

Gradient Dicision Boosting Tree Machineで特徴量を非線形化

この着想から、実践まで2ヶ月ほどかかりました

Facebook社のGradient Boosting Machineで特徴量を非線形化して、CTRを予想するという問題の論文から一年近く経ちましたが、その論文のユニークさは私の中では色あせることなく しばらく残っています。

原理的には、単純でGrandient Boosting Machineの特徴量で複数の特徴量を選択して決定木で非線形な状態にして、数値にすることでより高精度でリニアレグレッションなどシンプルイズベストなもので予想できるようになります

では、どのような時に有益でしょうか。

CTR予想はアドテクの重要な基幹技術の一つですが、リアルタイムで計算して、ユーザにマッチした結果を返す必要がある訳ですが、何も考えずに自然言語やユーザ属性を追加していくと、特徴量の数が50万から100万を超えるほどになり、さらに増えると1000万を超えることがあります

GBM系のアルゴリズムの一種であるLightGBMを用いることで、LightGBMで特徴量を500個非線形化して、これ単独でやるより各々の木の出力値をLinear Regression にかけるだけで性能が同等になるか、向上していることを示します   

図示

図1. 全体の流れ

仕組みの説明

  1. Yahoo!Japna社のAPIで商品のレビュー情報を取得します
  2. レビューの星の数と、形態素解析してベクトル化したテキストのペア情報を作ります
  3. これをそのままLightGBMで学習させます
  4. LightGBMで作成したモデル情報を解析し、木構造の粒度に分解します
  5. 2のベクトル情報を作成した木構造で非線形化します
  6. ScikitLearnで非線形化した特徴でLinear Regressionを行い、星の数を予想します 

データセット

ここでご紹介していただいている方法で、コーパスを作りました。

コーパスのダウンロードのみはこちらから行えます。

LightGBM(L1)単独での精度

LightGBM単体での精度はどうでしょうか。

このようなパラメータで学習を行いました。

task = train
boosting_type = gbdt
objective = regression
metric_freq = 1
is_training_metric = true
max_bin = 255
data = misc/xgb_format
valid_data = misc/xgb_format
num_trees = 500
learning_rate = 0.30
num_leaves = 100
tree_learner = serial
feature_fraction = 0.9
bagging_fraction = 0.8
min_data_in_leaf = 100
min_sum_hessian_in_leaf = 5.0
is_enable_sparse = true
use_two_round_loading = false
output_model = misc/LightGBM_model.txt
convert_model=misc/gbdt_prediction.cpp
convert_model_language=cpp

これも50万次元程度のウルトラスパースマトリックスなので、コマンドを叩いて学習します

$ lightgbm config=config/train.lightgbm.conf  
...
[LightGBM] [Info] 47.847420 seconds elapsed, finished iteration 499
[LightGBM] [Info] Iteration:500, training l1 : 0.249542

出力したモデルを木で非線形化するPythonのコードに変換

$ cd misc
$ python3 formatter.py > f.py
...(適宜取りこぼしたエラーをvimやEmacs等で修正してください)

特徴量を木で非線形化したデータセットに変換

$ python3 test.py > ../shrinkaged/shrinkaged.jsonp

LightGBM + Linear Regressionでの精度

$ cd shrinkaged
$ python3 linear_reg.py --data_gen
$ python3 linear_reg.py --fit
train mse: 0.24
test mse: 0.21

testデータセットで0.21の平均絶対誤差と、LightGBM単体での性能に逼迫し、上回っているとわかりました

まとめ

About

lightgbmのfeature-transform(特徴量の非線形化)をすることで、80,000を超える特徴量を線形回帰でも表現できることを示します

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages