1. atmaCup#2上位解法 2. XGBoost概要 3. XGBoostの気持ちから見た上位解法
コンペ自体の概要は下記URLをご覧ください https://atma.hatenablog.com/
atmaCup#2 振り返り会LTもーぐり@tellmoogryatmaCup#2 上位解法をGBDTの気持ちになって考えた
View Slide
流れ 1. 上位解法 2. XGBoost概要 3. XGBoostの気持ちから見た上位解法
流れ 1. 上位解法 2. XGBoostの気持ち 3. XGBoostの気持ちから見た上位解法
1.上位解法概要 ◯targetからuserごとのtarget平均を引いた値を目的変数に 雑な解釈 (人によって同じ睡眠時間でもコンディションの体感違う) ユーザー 睡眠時間 コンディション(元のtarget)user1 4 1user1 5 2user1 6 3user2 6 2user2 8 3
1.上位解法概要 ◯targetからuserごとのtarget平均を引いた値を目的変数に 雑な解釈 (人によって同じ睡眠時間でもコンディションの体感違う) ユーザー 睡眠時間 コンディション(元のtarget)平均との差分(新たに定義したtarget)user1 4 1 -1user1 5 2 0user1 6 3 +1user2 6 2 -0.5user2 8 3 +0.5
言われてみれば確かに良さそう... でもどこからその発想が出てくるのか...
懇親会でお話した時のJACKさん から頂いたアドバイス XGBoostを実装して、差分を予測することを経験したから アイデアの1つとして持っていた XGBoostのメイン部分だけでも実装することは勉強になる
というわけで... XGBoost実装の勉強会をしました!! (くるぴーさん 主催) 少し理解したので、その理解をもとに GDBTから解法をみてみます
2.XGBoost概要 XGBoostの中身 画像引用Chen, Tianqi and Carlos Guestrin. “XGBoost: A Scalable Tree Boosting System.” ArXivabs/1603.02754 (2016): n. pag. (元論文)
2.XGBoost概要 ◯中身の雑な説明 1本目の木の中身 1回目の分岐:年齢が15歳より大きい/小さい 2回目の分岐:男/女 (このときloss(後述)が下がる場合だけ分岐させる) 2本目以降の木では、それまでの木における予測値の残差 を使って学習を進める
2.XGBoost概要 t本目の木に関するlossを表す式(最小化したい関数) l : 目的関数 (e.g. RMSE, MSE, …) Ω(ft): 正則化(以降は話を単純にするためムシ) yi:予測値の真値 :(t-1)本目までの木での予測値 n: データ数 参考https://qiita.com/kenmatsu4/items/226f926d87de86c28089 (まつけんさんの分かりやすい解説記事 )
2.XGBoost概要 1本目の木での予測値はt>1の木に対して影響を与えるので 一番ウェイトが大きい t本目の木に関するloss
2.XGBoost概要 1本目の木に関するloss 1本目の木を作るときは 葉に割り当てられる値は割り当てられたデータの平均値 (目的関数lがMSEの場合はそう, RMSEでもなるはず 違っていたらごめんなさい)
3.XGBoostの気持ちから見た上位解法 これまでの話を踏まえると... user_idカラムが圧倒的に大事だとした場合 →ウェイトの大きい1本目の木で絶対user_idカラム使いたい
3.XGBoostの気持ちから見た上位解法 user1user2Y NNYuser3user1の平均 +2 user2の平均 +1.8 1本目の木でuser_idのカラムだけ使うと 葉にはuserごとの平均値が出力される
3.XGBoostの気持ちから見た上位解法 この場合 2本目以降の木ではuserのtarget平均との差を予測する 問題に変わる user_idのカラムのみを使って1本目の木を作る ≒ 今回の上位解法「平均値との差分をtargetにする」 2~(t-1)本目の木
3.XGBoostの気持ちから見た上位解法 (現実) targetそのままで学習させただけで同じこと出来る? →NO! colsample_bytreeやlearning_rate等が邪魔で影響度が落ちたりそもそもカラム使われなかったりする →GBDTにデータ突っ込むだけでは表現してくれない →target平均との差分を目的変数にすることで、明示的に1本目の木を定義してあげている
3.XGBoostの気持ちから見た上位解法 まとめ 【GBDTから見た上位手法の解釈】 1本目にuser_idだけを使った木を明示的に差し込む (この木だけlearning_rate = 1で特別扱いしたもの) leakが怖いので使いどころは難しい... targetそのままで学習させたときに、categoricalに指定したカラムのFeature importanceが明らかに大きいときは試してみたい
おわり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で勝つデータ分析の技術」技術評論社