Slide 1

Slide 1 text

atmaCup#2 振り返り会LT もーぐり@tellmoogry atmaCup#2 上位解法を GBDTの気持ちになって考えた

Slide 2

Slide 2 text

流れ
 1. 上位解法
 2. XGBoost概要
 3. XGBoostの気持ちから見た上位解法


Slide 3

Slide 3 text

流れ
 1. 上位解法
 2. XGBoostの気持ち
 3. XGBoostの気持ちから見た上位解法


Slide 4

Slide 4 text

1.上位解法概要
 ◯targetからuserごとのtarget平均を引いた値を目的変数に
   雑な解釈
   (人によって同じ睡眠時間でもコンディションの体感違う)
 ユーザー 睡眠時間 コンディション (元のtarget) user1 4 1 user1 5 2 user1 6 3 user2 6 2 user2 8 3

Slide 5

Slide 5 text

1.上位解法概要
 ◯targetからuserごとのtarget平均を引いた値を目的変数に
   雑な解釈
   (人によって同じ睡眠時間でもコンディションの体感違う)
 ユーザー 睡眠時間 コンディション (元のtarget) user1 4 1 user1 5 2 user1 6 3 user2 6 2 user2 8 3

Slide 6

Slide 6 text

1.上位解法概要
 ◯targetからuserごとのtarget平均を引いた値を目的変数に
   雑な解釈
   (人によって同じ睡眠時間でもコンディションの体感違う)
 ユーザー 睡眠時間 コンディション (元のtarget) 平均との差分 (新たに定義したtarget) user1 4 1 -1 user1 5 2 0 user1 6 3 +1 user2 6 2 -0.5 user2 8 3 +0.5

Slide 7

Slide 7 text

言われてみれば確かに良さそう...
 でもどこからその発想が出てくるのか...


Slide 8

Slide 8 text

懇親会でお話した時のJACKさん
 から頂いたアドバイス
 
 XGBoostを実装して、差分を予測することを経験したから
 アイデアの1つとして持っていた
 
 XGBoostのメイン部分だけでも実装することは勉強になる


Slide 9

Slide 9 text

というわけで...
 XGBoost実装の勉強会をしました!!
 
 
 (くるぴーさん         主催)
 
 少し理解したので、その理解をもとに
 GDBTから解法をみてみます


Slide 10

Slide 10 text

流れ
 1. 上位解法
 2. XGBoostの気持ち
 3. XGBoostの気持ちから見た上位解法


Slide 11

Slide 11 text

2.XGBoost概要
 XGBoostの中身
 
 
 画像引用 Chen, Tianqi and Carlos Guestrin. “XGBoost: A Scalable Tree Boosting System.” ArXiv abs/1603.02754 (2016): n. pag. (元論文)

Slide 12

Slide 12 text

2.XGBoost概要
 ◯中身の雑な説明
  1本目の木の中身
   1回目の分岐:年齢が15歳より大きい/小さい
   2回目の分岐:男/女
   (このときloss(後述)が下がる場合だけ分岐させる)
 
  2本目以降の木では、それまでの木における予測値の残差
  を使って学習を進める


Slide 13

Slide 13 text

2.XGBoost概要
 t本目の木に関するlossを表す式(最小化したい関数)
 
 
 l : 目的関数 (e.g. RMSE, MSE, …)
 Ω(ft ): 正則化(以降は話を単純にするためムシ)
 yi :予測値の真値
 :(t-1)本目までの木での予測値
 n: データ数
 
 参考 https://qiita.com/kenmatsu4/items/226f926d87de86c28089 (まつけんさんの分かりやすい解説記事 )

Slide 14

Slide 14 text

2.XGBoost概要
 
 1本目の木での予測値はt>1の木に対して影響を与えるので
 一番ウェイトが大きい
 t本目の木に関するloss
 
 


Slide 15

Slide 15 text

2.XGBoost概要
 1本目の木に関するloss
 
 
 1本目の木を作るときは
 葉に割り当てられる値は割り当てられたデータの平均値
 
 
 (目的関数lがMSEの場合はそう, RMSEでもなるはず
 違っていたらごめんなさい)


Slide 16

Slide 16 text

流れ
 1. 上位解法
 2. XGBoostの気持ち
 3. XGBoostの気持ちから見た上位解法


Slide 17

Slide 17 text

3.XGBoostの気持ちから見た上位解法
 
 これまでの話を踏まえると...
 
 
 user_idカラムが圧倒的に大事だとした場合
  →ウェイトの大きい1本目の木で絶対user_idカラム使いたい
 


Slide 18

Slide 18 text

3.XGBoostの気持ちから見た上位解法
 user1 user2 Y N N Y user3 user1の平均
 +2
 user2の平均
 +1.8
 1本目の木でuser_idのカラムだけ使うと
 葉にはuserごとの平均値が出力される


Slide 19

Slide 19 text

3.XGBoostの気持ちから見た上位解法
 この場合
 2本目以降の木ではuserのtarget平均との差を予測する
 問題に変わる
 
 
 
 
 user_idのカラムのみを使って1本目の木を作る
 ≒
 今回の上位解法「平均値との差分をtargetにする」
 
 
 2~(t-1)本目の木


Slide 20

Slide 20 text

3.XGBoostの気持ちから見た上位解法
 
 (現実)
 targetそのままで学習させただけで同じこと出来る?
 →NO!
 
 colsample_bytreeやlearning_rate等が邪魔で影響度が落ちたり そもそもカラム使われなかったりする
 →GBDTにデータ突っ込むだけでは表現してくれない
 →target平均との差分を目的変数にすることで、明示的に1本 目の木を定義してあげている


Slide 21

Slide 21 text

3.XGBoostの気持ちから見た上位解法
 
 まとめ
 【GBDTから見た上位手法の解釈】
   1本目にuser_idだけを使った木を明示的に差し込む
   (この木だけlearning_rate = 1で特別扱いしたもの)
 
 
 leakが怖いので使いどころは難しい...
 
 targetそのままで学習させたときに、categoricalに指定したカラム のFeature importanceが明らかに大きいときは試してみたい


Slide 22

Slide 22 text

おわり XGBoostの実装会やったおかげで多くの学びがありました 懇親会でアドバイスをくれたJACKさん、実装会開催してくれたくる ぴーさんありがとうございました! (スライドで変な部分あればご指摘いただけると幸いです) 参考
 Chen, Tianqi and Carlos Guestrin. “XGBoost: A Scalable Tree Boosting System.” ArXiv abs/1603.02754 (2016): n. pag. (元論文)
 https://qiita.com/kenmatsu4/items/226f926d87de86c28089 (まつけんさんの分かりやすい解説記事 ) 門脇 大輔, 阪田 隆司, 保坂 桂佑, 平松 雄司「kaggleで勝つデータ分析の技術」技術評論社