Facebook社のGradient Boosting Machineで特徴量を非線形化して、CTRを予想するという問題の論文から一年近く経ちましたが、その論文のユニークさは私の中では色あせることなく しばらく残っています。
原理的には、単純でGrandient Boosting Machineの特徴量で複数の特徴量を選択して決定木で非線形な状態にして、数値にすることでより高精度でリニアレグレッションなどシンプルイズベストなもので予想できるようになります
では、どのような時に有益でしょうか。
CTR予想はアドテクの重要な基幹技術の一つですが、リアルタイムで計算して、ユーザにマッチした結果を返す必要がある訳ですが、何も考えずに自然言語やユーザ属性を追加していくと、特徴量の数が50万から100万を超えるほどになり、さらに増えると1000万を超えることがあります
GBM系のアルゴリズムの一種であるLightGBMを用いることで、LightGBMで特徴量を500個非線形化して、これ単独でやるより各々の木の出力値をLinear Regression にかけるだけで性能が同等になるか、向上していることを示します
- Yahoo!Japna社のAPIで商品のレビュー情報を取得します
- レビューの星の数と、形態素解析してベクトル化したテキストのペア情報を作ります
- これをそのままLightGBMで学習させます
- LightGBMで作成したモデル情報を解析し、木構造の粒度に分解します
- 2のベクトル情報を作成した木構造で非線形化します
- ScikitLearnで非線形化した特徴でLinear Regressionを行い、星の数を予想します
ここでご紹介していただいている方法で、コーパスを作りました。
コーパスのダウンロードのみはこちらから行えます。
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
$ cd misc
$ python3 formatter.py > f.py
...(適宜取りこぼしたエラーをvimやEmacs等で修正してください)
$ python3 test.py > ../shrinkaged/shrinkaged.jsonp
$ 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単体での性能に逼迫し、上回っているとわかりました