Gradient Boostingについて - Scikit-Learnを使ったfeature transformation(GBDT + LR vs LR) -

# 1. scikit-learnを使った実験概要
Gradient Boostingについて - 準備編 - （ http://goo.gl/y2EVLI ） の予告通り今回はSklearnで実験をしてみました。目的は、**GBDTを使ったfeature transformationが予測を改善するのか**、という点を確認する事です。
ところで、Gradient Boostingでfeature transformationする話は昔からあったはずですが、ADKDD'14で発表されたPractical Lessons from Predicting Clicks on Ads at Facebook[1]が非常に有名です。実験はこの論文がやっている事と同じですが、featureの安定性等は計算していません。実務で適用する場合は重要な点ですので、ぜひトライしてみて下さい（結果を教えて頂けるととてもうれしい・・・）。
流れは以下の通りです。まずfeatureをgbdtでfeature transformationし、それをLogistic Regressionでaccuracy・precision・recall・f-valueを計算します(モデル1)。他方、純粋にLogistic Regressionを適用した場合（モデル2）も計算。この二つを比較して考察してみようと思います。特に、feature transformationする動機はfeature間の相関をうまくとらえる事ですので、性能が大幅に改善する場合は設計したfeatureが互いに相関していることが確認できるはずです。
ちなみに、featureが互いに相関する設計が正しいのかという話は別途あり、この辺がfeature engineeringの難しいところです。
なお、**モデル１・２については、各々5-foldのCVで各モデルを最適化**しています。
以下URLが実験で使ったコード（ https://goo.gl/my1dz7 ）です。
注意としてはデータを~/data/gdbt/adult.data.csvとセットしてください。
全く気が利いていないのですが、optionで渡すようにしていません。

# 2. ねらい
1章で書いた通り、gbdtがfeature間の相関をうまく処理してくれるかという点です。


# 3. データ
https://github.com/bluekingsong/simple-gbdt/tree/master/data
にあるadult.data.csvを使います。適宜wgetして下さい。以下、一部を載せておきます。

| age | workclass        | fnlwgt | education | education-num |
|-----|------------------|--------|-----------|---------------|
| 39  | State-gov        | 77516  | Bachelors | 13            |
| 50  | Self-emp-not-inc | 83311  | Bachelors | 13            |
| 38  | Private          | 215646 | HS-grad   | 9             |
| 53  | Private          | 234721 | 11th      | 7             |
| 28  | Private          | 338409 | Bachelors | 13            |
| 37  | Private          | 284582 | Masters   | 14            |
| 49  | Private          | 160187 | 9th       | 5             |
| 52  | Self-emp-not-inc | 209642 | HS-grad   | 9             |
| 31  | Private          | 45781  | Masters   | 14            |

で、予測する問題はfeatureが14個与えられたとき、incomeが50Kより大きいかどうかを当てる問題です。大きい場合が1、そうでない場合は0の2値予測となります。

# 4. 結果
|           | accuracy | precision | recall   | f-value  |
|-----------|----------|------------|----------|----------|
| GBDR + LR | 8.55E-01 | 9.23E-01   | 8.90E-01 | 9.06E-01 |
| LR        | 7.58E-01 | 9.72E-01   | 7.70E-01 | 8.59E-01 |

注)
accuracy = float(TP + TN) / float(TP + FP + FN + TN)
precision = float(TP) / float(TP + FP)
recall = float(TP) / float(TP + FN)
f-value = 2.0 * precision * recall / (precision + recall)
TP : True Positive
TN : True Negative
FP : False Positive
FN : False Negative

ちょっと気になったので加筆。
precision : GBDR + LR < LR
recall : GBDR + LR > LR
の件。分子は同じなので、分母が違う。
分母の違いは、FPかFNか。
GBDR + LRのprecisionはLRより5%低く、GBDR + LRのrecallはLRより12%高いという事は、GBDR + LRがFNした予測がLRより低かったという事。FNは実際1だが予測が0の場合。FPは実際0だが予測が1。つまり、正例に予測重要性が高い場合、recallが高い方が良い。

# 5. 考察
PrecisionがLRに負けましたが、全般的に精度が改善したようです。
データをよく見るとわかるのですが、incomeを予測するためのfeatureは元々14個あるのですが、結構独立したfeatureになっていて、LRでもまあいいかなという印象も受けます。実用上は改善した幅がチャリンチャリン上意味があるかという話になるかと。
gbdtがfeature間の相関をうまく処理してくれるか、という点は触れておかねばなりません。結論を言えば、まあ今回のデータセットでは処理していないとは言いませんが、どっちでもいい・・・。
作ったtreeアンサンブルですが、max_depthが2でして、そもそもfeature間の相関はあまりないように思います。

# 6. 次号
次回は正則化の話をしようと思います。boostingの正則化は学習率のスケジューリングをしているのであり、Xgboostは正則化を行っているという話です。

# 7. 参考文献
[1] X.He etc, Practical Lessons from Predicting Clicks on Ads at Facebook, ADKDD'14