Santander Product RecommendationのアプローチとXGBoostの小ネタ

94c4261d3ac90c39ce6add9d03670aa6?s=47 Jack
October 28, 2017

Santander Product RecommendationのアプローチとXGBoostの小ネタ

Jack (Japan)

94c4261d3ac90c39ce6add9d03670aa6?s=128

Jack

October 28, 2017
Tweet

Transcript

  1. ALLPPT.com _ Free PowerPoint Templates, Diagrams and Charts Jack (Japan)

    https://www.kaggle.com/rsakata Santander Product Recommendation のアプローチとXGBoostの小ネタ 2017/10/28 Kaggle Tokyo Meetup #3
  2. 軽く自己紹介 • 勤務先 関西の某大手電機メーカー • Kaggle歴 約3年半(≒機械学習歴) • Kaggleのきっかけ 1つ下の後輩に教えてもらって

    • 使用言語 R(Pythonは多少いじれる程度) • 好きなライブラリ XGBoost(というかほぼこれしか使えない・・・) ※2017/10/28現在
  3. Kaggle歴 Finished Competition Submissions Rank 2014/05/19 Allstate Purchase Prediction Challenge

    107 28 / 1568 2014/09/15 Higgs Boson Machine Learning Challenge 98 679 / 1785 2015/05/18 Otto Group Product Classification Challenge 74 316 / 3514 2015/06/17 West Nile Virus Prediction 34 307 / 1306 2015/07/06 Crowdflower Search Results Relevance 16 112 / 1326 2015/08/28 Liberty Mutual Group: Property Inspection Prediction 19 575 / 2236 2016/04/18 BNP Paribas Cardif Claims Management 22 9 / 2947 2016/07/06 Facebook V: Predicting Check Ins 3 3 / 1212 2016/09/19 Predicting Red Hat Business Value 4 27 / 2271 2016/12/21 Santander Product Recommendation 95 3 / 1787 2017/01/30 Santa's Uncertain Bags 84 94 / 694 2017/03/01 Two Sigma Financial Modeling Challenge 13 543 / 2070 2017/04/25 Two Sigma Connect: Rental Listing Inquiries 10 36 / 2488 2017/06/07 Quora Question Pairs 46 32 / 3394 2017/07/10 Mercedes-Benz Greener Manufacturing 2 70 / 3805 2017/08/14 Instacart Market Basket Analysis 9 32 / 2623
  4. Finished Competition Submissions Rank 2014/05/19 Allstate Purchase Prediction Challenge 107

    28 / 1568 2014/09/15 Higgs Boson Machine Learning Challenge 98 679 / 1785 2015/05/18 Otto Group Product Classification Challenge 74 316 / 3514 2015/06/17 West Nile Virus Prediction 34 307 / 1306 2015/07/06 Crowdflower Search Results Relevance 16 112 / 1326 2015/08/28 Liberty Mutual Group: Property Inspection Prediction 19 575 / 2236 2016/04/18 BNP Paribas Cardif Claims Management 22 9 / 2947 2016/07/06 Facebook V: Predicting Check Ins 3 3 / 1212 2016/09/19 Predicting Red Hat Business Value 4 27 / 2271 2016/12/21 Santander Product Recommendation 95 3 / 1787 2017/01/30 Santa's Uncertain Bags 84 94 / 694 2017/03/01 Two Sigma Financial Modeling Challenge 13 543 / 2070 2017/04/25 Two Sigma Connect: Rental Listing Inquiries 10 36 / 2488 2017/06/07 Quora Question Pairs 46 32 / 3394 2017/07/10 Mercedes-Benz Greener Manufacturing 2 70 / 3805 2017/08/14 Instacart Market Basket Analysis 9 32 / 2623 Kaggle歴 • マシンがロースペックなため、割と手軽なコンペのみに参加 • deep learningはできません • single model追及型、アンサンブルは苦手 • 無駄に少数submissionでがんばりがち(コンペによるけど) • 最近はrankingをキープしたいがために節操なく参加
  5. Santander Product Recommendationの アプローチ (3rd place solution)

  6. Santander Product Recommendation どんなコンペだったか? 【予測対象】 • Santander Bankの24種のproduct(=金融サービス)の内、どれを新規 に利用するか(つまり、前月既に利用していたproductは予測対象外) –

    普通預金、当座預金、給与振り込み、口座引き落とし、クレジットカード、etc. (似たようなものがたくさんあって実際はよくわからなかった・・・) • 各顧客の属性と前月までの利用実績から、顧客毎にproductを予測 単純に binary classification × 24 と考える 顧客 date 説明変数群 p1 p2 p3 p4 p5 p6 p7 p8 p9 ・・・ p24 Aさん 2016-03-28 ・・・ 0 0 0 0 1 0 0 0 0 ・・・ 1 Aさん 2016-04-28 ・・・ 0 0 0 0 1 0 0 0 0 ・・・ 1 Aさん 2016-05-28 ・・・ 0 0 0 0 0 0 0 0 0 ・・・ 1 Aさん 2016-06-28 ・・・ ? ? ? ? ? ? ? ? ? ・・・ ? データイメージ
  7. Santander Product Recommendation 評価指標 • 評価指標はMAP@7 – |U| submissionの行数(予測対象顧客数) –

    m その顧客が実際に新規利用したproductの数 – n その顧客に対する予測productの数(7以外を選択する理由無し) – P(k) precision at cutoff k(面倒なので説明省略・・・) • 直感的には、 – 顧客1人当たり新規利用しそうなproductを7つまで予想できる(順序付き) – ある顧客の新規利用productがm個の場合、上位m個でぴったり予測できれば、 その顧客に対するスコアは1 – 新規利用でないproductを新規利用productより上位に置いてしまうと減点され る(上位になるほど減点率が高い) – そもそも顧客に新規利用productが無い場合は、予測に関わらずスコアは0 顧客 product Aさん p24 p13 p18 p5 p23 p22 p8 Bさん p18 p3 p20 p8 p14 p12 p17 ・・・ ・・・ submissionイメージ
  8. Santander Product Recommendation 評価指標 • 評価指標はMAP@7 – |U| submissionの行数(予測対象顧客数) –

    m その顧客が実際に新規利用したproductの数 – n その顧客に対する予測productの数(=7固定) – P(k) precision at cutoff k(面倒なので説明省略・・・) • 直感的には、 – 顧客1人当たり新規利用しそうなproductを7つまで予想できる(順序付き) – ある顧客の新規利用productがm個の場合、上位m個でぴったり予測できれば、 その顧客に対するスコアは1 – 新規利用でないproductを新規利用productより上位に置いてしまうと減点され る(上位になるほど減点率が高い) – そもそも顧客に新規利用productが無い場合は、予測に関わらずスコアは0 顧客 product Aさん p24 p13 p18 p5 p23 p22 p8 Bさん p18 p3 p20 p8 p14 p12 p17 ・・・ ・・・ submissionイメージ • 要は、binary classification×24を行った後で、顧客毎に確率 の高い上位7つのproduct(前月利用分は除く)をsubmit • いかに真の新規利用productをその7つに詰め込むか • そして、いかに真の新規利用productを上位に配置するか
  9. Santander Product Recommendation targetの理解 (1) date p1 p2 p3 p4

    p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24 2015-02-28 1 1 2132 12 1884 7 291 249 171 348 33 724 1472 451 5 27 9 217 3471 259 8 5659 5656 8285 2015-03-28 0 1 2293 15 1786 18 272 284 165 481 23 814 1594 570 7 24 12 217 5076 205 4 4479 4473 9135 2015-04-28 0 1 2366 12 1984 10 217 278 167 263 26 775 1459 492 4 22 17 871 4627 194 5 2663 5628 8346 2015-05-28 0 0 2264 7 1900 10 205 289 172 238 25 885 1461 396 9 21 11 343 4071 201 4 3369 3345 7085 2015-06-28 0 0 6588 9 1857 7 210 213 151 289 33 939 1204 245 4 19 8 2931 4655 152 3 5070 8135 9023 2015-07-28 0 0 3056 10 2771 18 191 252 164 265 24 1138 1085 204 6 27 5 589 4886 232 9 4408 4850 9172 2015-08-28 0 0 5730 10 2412 37 240 231 145 322 33 1024 924 223 1 22 13 264 4379 445 2 2950 2968 7115 2015-09-28 0 0 4389 7 1775 22 471 191 122 387 30 1348 1072 130 8 21 13 271 4463 328 2 4683 4753 11210 2015-10-28 0 0 5682 3 2409 43 468 223 153 349 22 1390 1205 146 7 19 9 593 4461 911 2 4818 4790 12100 2015-11-28 0 0 4670 6 2930 31 633 209 140 110 1 908 1588 169 3 37 8 416 4312 133 5 4395 4409 10102 2015-12-28 0 0 9077 9 3869 69 592 283 155 8 0 1199 1816 205 3 157 11 235 4295 255 8 5071 5148 9888 2016-01-28 0 1 4436 12 2155 37 545 259 149 0 0 447 2272 145 2 104 7 445 3792 739 2 2437 2892 10078 2016-02-28 0 0 3988 9 2211 48 770 217 141 1 0 684 2342 82 6 45 6 557 3881 320 2 9499 12687 11528 2016-03-28 0 0 4551 5 2428 45 643 225 131 0 0 239 1909 92 2 30 7 199 4401 163 4 4974 5038 10117 2016-04-28 0 0 4027 5 2381 40 596 240 161 0 0 99 2249 83 5 21 4 807 4100 128 3 3790 4424 9799 2016-05-28 1 0 3854 5 2346 40 512 226 131 0 0 46 2709 60 3 22 7 279 4248 183 7 5488 5513 10163 これらはあまりにも利用が少ないので、完全に無視して20個で考えることにしました (そもそも、ポジティブサンプル少な過ぎてモデル作れん・・・) 各productの各月の新規利用数
  10. Santander Product Recommendation targetの理解 (2) • 特に利用の多いproduct(上位8種)について、新規利用数を グラフに描画すると下図 • productによってかなり差があるし、月毎の傾向も違う

    ここを予測(2016/6/28) p3 p5 p13 p18 p19 p22 p23 p24
  11. Santander Product Recommendation targetの理解 (2) • 特に利用の多いproduct(上位8種)について、新規利用数を グラフに描画すると下図 • productによってかなり差があるし、月毎の傾向も違う

    ここを予測(2016/6/28) p3 p5 p13 p18 p19 p22 p23 p24 • しかし、前月の利用数が多いproductほど新規利用の分母は 少なくなるので、このまま比べるのは不平等 • そもそも月によってサンプル数違うし・・・
  12. Santander Product Recommendation targetの理解 (3) • 各productで“前月既に利用があった人”は分母から除いて 新規利用率を算出すると下図のようになる ここを予測(2016/6/28) p3

    p5 p13 p18 p19 p22 p23 p24
  13. Santander Product Recommendation targetの理解 (3) • 各productで“前月既に利用があった人”は分母から除いて 新規利用率を算出すると下図のようになる • 2つのproductで、2016/06の予測に影響を与えそうな傾向

    ここを予測(2016/6/28) 今回の曲者! 予測対象のちょうど1年前 p3 p5 p13 p18 p19 p22 p23 p24
  14. Santander Product Recommendation 学習データの考え方 各productの学習時、前月既に利用していた人は、どう扱う? 1. 今月も利用したのであれば、正例として扱う 2. “新規に”利用することは無いので、常に、負例として扱う

  15. Santander Product Recommendation 学習データの考え方 各productの学習時、前月既に利用していた人は、どう扱う? 1. 今月も利用したのであれば、正例として扱う 2. “新規に”利用することは無いので、常に、負例として扱う どちらを採用しても正しく学習できますが、そもそも興味の対象外なので、

    3. 学習データから除いてしまう ということにしました(無意味な分類則をモデルに学習させたくなかったし、実際CVスコア はこれで結構改善したと記憶しています) • ちなみに、multiclassの問題としてアプローチしている人も多かったので すが、それだと3の方法は取れなくなります(product毎に学習データを変えるこ とができなくなるので)
  16. Santander Product Recommendation 分析の基本方針 • 全期間のデータを一度に扱うのはマシンスペック上無理・・・ • そもそも時系列データなので、あまり過去のデータ入れると精度落ちそう • 一度に学習に使うのは1か月分のデータにした

    • 異なる月でアンサンブルもできて、一石二鳥? • 2016-05でtraininして、2016-04でvalidation • 2016-04でtraininして、2016-05でvalidation • 2016-03でtraininして、2016-05でvalidation … 以下同様 • 上記の出力をアンサンブル(幾何平均)して、顧客毎に上位7つをsubmit
  17. Santander Product Recommendation ただし、例外あり • 基本は直近データでtrainingするが、例の2つのproductは 1年前、あるいは半年前のデータで学習させた方がgood ここを予測(2016/6/28) 2015-12でtrainingすると LBスコアが圧倒的に上がる

    (2015-06でやるよりもよかった) 予測対象のちょうど1年前 2015-06でtraningすると LBスコアが圧倒的に上がる
  18. Santander Product Recommendation ただし、例外あり ここを予測(2016/6/28) 予測対象のちょうど1年前 一方、こいつも1年前のデータで 試してみたけど効果は無かった

  19. Santander Product Recommendation ただし、例外あり ここを予測(2016/6/28) 予測対象のちょうど1年前 • 当然、これらの情報はpublic LBのスコアから得るしかない •

    あまりLB feedbackはしたくないんですが、そんなことも言って られませんでした・・・ 一方、こいつも1年前のデータで 試してみたけど効果は無かった
  20. Santander Product Recommendation 与えられた説明変数 • データ日付時点での顧客属性(22項目) – 年齢、性別、社員フラグ、世帯年収、契約開始日、死亡フラグ、etc… • 同一顧客でも、時を経ると属性値が変わるケースあり

    • 大半がカテゴリ変数(ほとんど2値もしくは3値) • 一方、水準数100を超えるカテゴリ変数も2つ(居住地など) • 数値変数は、年齢、世帯年収、経過月数ぐらい + • 前月までのtargetの履歴(利用product)も超重要な説明変数 feature engineeringのがんばりどころ
  21. Santander Product Recommendation Feature Engineering (1) • 各productの2か月間の利用フラグの連結(2-gram)を集計 • 各productを最後に利用して以来の経過月数(0の長さ)

    fecha_dato ind_(xyz)_ult1 2015-01-28 0 2015-02-28 0 2015-03-28 0 2015-04-28 1 2015-05-28 1 2015-06-28 1 2015-07-28 0 2015-08-28 0 2015-09-28 0 2015-10-28 0 2015-11-28 1 2015-12-28 1 2016-01-28 1 2016-02-28 1 2016-03-28 0 2016-04-28 0 2016-05-28 0 ind_(xyz)_ult1_00 ind_(xyz)_ult1_01 ind_(xyz)_ult1_10 ind_(xyz)_ult1_11 ind_(xyz)_ult1_0len 2016-06-28 ? 7 2 2 5 3 ) from 0 to 0 ) from 0 to 0 ) from 0 to 1 ) from 1 to 1 ) from 1 to 1 ) from 1 to 0 ) from 0 to 0 ) from 0 to 0 ) from 0 to 0 ) from 0 to 1 ) from 1 to 1 ) from 1 to 1 ) from 1 to 1 ) from 1 to 0 ) from 0 to 0 ) from 0 to 0
  22. Santander Product Recommendation Feature Engineering (2) • 各product(4種を除く20種)の前月の利用有無 • 上記フラグを連結した文字列

    • 前月に利用したproductの数 fecha_dato 2016-05-28 2016-06-28 ind_cco_fin_ult1 1 ? ind_cder_fin_ult1 0 ? ind_cno_fin_ult1 0 ? ind_ctju_fin_ult1 0 ? ind_ctma_fin_ult1 0 ? ind_ctop_fin_ult1 0 ? ind_ctpp_fin_ult1 0 ? ind_dela_fin_ult1 1 ? ind_ecue_fin_ult1 1 ? ind_fond_fin_ult1 0 ? ind_hip_fin_ult1 0 ? ind_plan_fin_ult1 0 ? ind_pres_fin_ult1 0 ? ind_reca_fin_ult1 1 ? ind_tjcr_fin_ult1 1 ? ind_valo_fin_ult1 1 ? ind_viv_fin_ult1 0 ? ind_nomina_ult1 0 ? ind_nom_pens_ult1 0 ? ind_recibo_ult1 1 ? products_last "10000001100001110001" n_products_last 7
  23. Santander Product Recommendation Feature Engineering (2) • 各product(4種を除く20種)の前月の利用有無 • 上記フラグを連結した文字列

    • 前月に利用したproductの数 fecha_dato 2016-05-28 2016-06-28 ind_cco_fin_ult1 1 ? ind_cder_fin_ult1 0 ? ind_cno_fin_ult1 0 ? ind_ctju_fin_ult1 0 ? ind_ctma_fin_ult1 0 ? ind_ctop_fin_ult1 0 ? ind_ctpp_fin_ult1 0 ? ind_dela_fin_ult1 1 ? ind_ecue_fin_ult1 1 ? ind_fond_fin_ult1 0 ? ind_hip_fin_ult1 0 ? ind_plan_fin_ult1 0 ? ind_pres_fin_ult1 0 ? ind_reca_fin_ult1 1 ? ind_tjcr_fin_ult1 1 ? ind_valo_fin_ult1 1 ? ind_viv_fin_ult1 0 ? ind_nomina_ult1 0 ? ind_nom_pens_ult1 0 ? ind_recibo_ult1 1 ? products_last "10000001100001110001" n_products_last 7 どう使うのこれ?
  24. Santander Product Recommendation カテゴリ変数をtargetの平均で置き換える • フラグの連結をカテゴリ変数とみなして、各水準毎にtarget の平均を取る • 下図のバーの高さで置き換えるようなイメージ

  25. Santander Product Recommendation カテゴリ変数をtargetの平均で置き換える • フラグの連結をカテゴリ変数とみなして、各水準毎にtarget の平均を取る • 下図のバーの高さで置き換えるようなイメージ 前月のフラグが、

    00000000000000000001 ⇒ 対象productの新規利用率は5割近く! 00100000100000000000 ⇒ 対象productの新規利用率は約3割 00100000100000000001 ⇒ 対象productの新規利用率は約2割に低下 元のフラグ値だけでは、このようなルールを表現するのは難しい! (複雑な構造が必要、その分他の部分でoverfitの可能性が高まる)
  26. 元のフラグ値だけでは、このようなルールを表現するのは難しい! (複雑な構造が必要、その分他の部分でoverfitの可能性が高まる) Santander Product Recommendation カテゴリ変数をtargetの平均で置き換える • フラグの連結をカテゴリ変数とみなして、各水準毎にtarget の平均を取る •

    下図のバーの高さで置き換えるようなイメージ 前月のフラグが、 00000000000000000001 ⇒ 対象productの新規利用率は5割近く! 00100000100000000000 ⇒ 対象productの新規利用率は約3割 00100000100000000001 ⇒ 対象productの新規利用率は約2割に低下 • 他のカテゴリ変数も、基本この方法で数値に変換(個人的常套手段) • validation data, test dataに対してはtrain dataの平均値で問題無いが、 train dataにはそのまま使うとleakageになるので、CVと同じ要領で計算 • 最近、forumでも言及されることが多くなった印象がある(target-based encodingなどと言われているのを見た) • 個人的見解では、水準数が100を超えるような場合に有効なことが多い (one hot encodingだと計算資源が問題な上、xgboostでは精度が落ちることも多いので) • deep learningで試したときは、なぜか全く上手くいかなかった(要検証)
  27. Santander Product Recommendation 分析の概観図 6位相当 5位相当 3位! 4つのproductは除く (Pr=1-10と設定) 各productの確率値が揃う

    (ただし、前月利用済みの productは0に置き換え) 1年前のデータで学習 半年前のデータで学習 前月のデータで学習
  28. Santander Product Recommendation 分析の概観図 6位相当 5位相当 3位! 各productの確率値が揃う (ただし、前月利用済みの productは0に置き換え)

    説明します 4つのproductは除く (Pr=1-10と設定) 1年前のデータで学習 半年前のデータで学習 前月のデータで学習
  29. Santander Product Recommendation データの取り方を変えて学習 • 前に「各productの学習時に“前月既に利用があった人”は学習データから除く」 と言いましたが、さらに「“新規利用productが一つもなかった人”も学習データか ら除く」ということをやります(これは結構な人がやっていた) • その上で、4か月分のデータ(2016-01~2016-04)をくっつけて、18

    productsに 対して学習(2016-05でvalidation) • 学習データの性質が結構変わるので、アンサンブル時に効果が出ることを期待 • ただし、こんなことをすると出力値のオーダーがこれまでの結果と大きく変わって 比較できないので、アンサンブルするには一手間必要になります(次頁)
  30. Santander Product Recommendation アンサンブルの考え方 p3 p18 その他18 productsの合計 p3 p18

    その他18 productsの合計 p3 p18 その他18 productsの合計 p3 p18 その他18 productsの合計 p3 p18 その他18 productsの合計 その他18 productsの合計 棒の長さは、ある顧客に対して予測した各productの確率の大きさだと思ってください 2016-05で学習 2016-04で学習 2016-03で学習 2016-02で学習 2015-12で学習 p3 p18 その他18 productsの合計 2015-12で学習 2015-06で学習 2016-01で学習 2016-01~2016-04で学習(さっきのやつ) ※何らかの新規利用があった人のデータのみで学習 しているので、必然的に出力値(確率)が大きくなる
  31. Santander Product Recommendation アンサンブルの考え方 その他18 productsの合計 p3 p18 その他18 productsの合計

    p3 p18 その他18 productsの合計 p3 p18 その他18 productsの合計 p3 p18 その他18 productsの合計 p3 p18 その他18 productsの合計 p3 p18 その他18 productsの合計 ここの確率和が同じになるように標準化 ×1 ×1 ×1 ×1 ×1 ×1 ×4 の重みで アンサンブル 対 数 化 棒の長さは、ある顧客に対して予測した各productの確率の大きさだと思ってください
  32. Santander Product Recommendation 勝因? • 特徴的な傾向を持つ2つのproductについて、学習データ期間を 意図的に変えた(multiclassだとできない) • 学習データからproduct毎に前月利用済みのデータを除外して、 本質的な部分のみを学習させた(multiclassだとできない)

    • 過去のproductの利用履歴から作ったオリジナル特徴量 • カテゴリ変数をtargetの平均値で置き換えるテク(multiclassだとク ラスの数だけ作らないといけない) • 学習データの取り方を変えてのアンサンブル
  33. Santander Product Recommendation 後悔と愚痴(かっこ悪くてすみません) • 実はmulticlassの問題として扱ったバージョンも試していて、それ をアンサンブルに加えると、ほんの少しだけLBスコアが上がりまし た(これがコンペ期間中の最良submission) • ただ、スコアの上昇幅がわずかだったのと、solutionが複雑になる

    と結果の再現とかドキュメンテーションとか面倒だよなぁ・・・という よこしまな思いから、最終的にはbinaryのみで構成したバージョン を2つ、final submissionに選びました • そのせいで、2位を逃して賞金が半分になりました(まさかそこまで 2位と僅差になるとは思わなかった・・・) • 皆様におかれましては、ぜひ後悔の無いsubmission選択を!!
  34. Santander Product Recommendation おまけ:public LBの推移 2nd: Tom Van de Wiele

    1st: idle_speculation 3rd: Jack (Japan) アンサンブル 予測productの拡大 (9種→20種) 最初の内は、9種のproductだけを modelingして、どこまでスコアを 伸ばせるかに挑戦していた (にも関わらず一時期1位になれたので、 これはいける!と相当舞い上がった)
  35. Santander Product Recommendation 参考 • Winner’s Interview – http://blog.kaggle.com/2017/02/22/santander-product-recommendati on-competition-3rd-place-winners-interview-ryuji-sakata/

    • Discussion: 3rd place solution (with code) – https://www.kaggle.com/c/santander-product-recommendation/discus sion/26899 • 上位者のsolution一覧 – https://www.kaggle.com/c/santander-product-recommendation/discus sion/26831 (ただし、私のsolutionについてはこのスライドが一番詳しいです・・・)
  36. XGBoostに関する小ネタ集

  37. XGBoostに関する小ネタ ネタ1:データサイズと学習時間 • 同じデータセットに対しては、学習時間はサンプル数に対して1次以上のオーダー で増加する傾向にあります • 初期の段階で分析方針を立てたりfeatureを試したりするのに、いちいち全データ で精度を検証するのは非効率かも(4分の1のデータで4回平均するとかの方が) • もちろん、サンプル数がある程度あって初めて効いてくるfeatureもあったりする

    ので、一概には言えません ※特定の条件下で得られた個人の見解であり、一般的な効用を保証するものではありません
  38. XGBoostに関する小ネタ ネタ2:データサイズとbest_iteration • 同じデータセットに対しては、最適な学習回数はサンプル数に対しておよそ線形 になると思ってよいと思います • 手元評価はCVで行いつつ、submissionに対しては全データで学習させたい、と いった場面はよくありますが、そういった場合に最適な学習回数を推測できます • ただ、切片が0ではないので、サンプル数が2倍になったからといって2倍の学習

    回数が必要なわけではないので注意 4-fold CV ※特定の条件下で得られた個人の見解であり、一般的な効用を保証するものではありません
  39. XGBoostに関する小ネタ ネタ3:averagingとbest_iteration • 同じモデルをrandom seedだけ変えて結果をaveragingすることは、それだけで 有効なアンサンブルです • 学習回数をbest_iterationから増減させたとき、averagingの精度がどうなるのか を示したのが下図です •

    単一モデルでは、学習回数が不足 or 過剰のどちらの場合も精度が落ちますが、 averagingした方は多少学習回数が多めでも、ほとんど精度が落ちていません best iteration (≒150) good ※特定の条件下で得られた個人の見解であり、一般的な効用を保証するものではありません
  40. XGBoostに関する小ネタ ネタ4:averagingとmax_depth • 下図のように、max_depthが大きいほどaveragingの効果が大きくなる傾向にあ ります • なので、単一モデルの検証で精度が拮抗しているなら、より深い方を選んだ方が ベターかと思います • 先の結果と合わせて、averagingを行う前提なら、多少overfit気味でも問題無い

    (むしろその方がよいこともある)というのが、これまでの経験則です good ※特定の条件下で得られた個人の見解であり、一般的な効用を保証するものではありません
  41. XGBoostに関する小ネタ ネタ5:averagingとeta • 学習率etaを小さくするほど精度がよくなるのは一般的かと思います • ただ下図のように、averagingを行うとその効果は大きく減少します(逆に言えば、 多少etaが大きくてもアンサンブルである程度カバーできる) • 学習時間に直結しますので、etaを小さくすることには必要以上に神経質にならな くてもよいかもしれません

    good ※特定の条件下で得られた個人の見解であり、一般的な効用を保証するものではありません
  42. XGBoostに関する小ネタ ネタ6:colsample_by*と学習時間 • colsample_bytree, colsample_bylevelを小さくすることで、学習時間がほぼ線形 に減少します • 精度向上にも寄与することが多いので、積極的に小さめの値を試してみましょう • ただ、設定するのはどちらかだけにした方がよいと思います

    • 直近試したタスクでは、colsample_bylevelの方が、より小さい値を設定しても精 度が保たれる(もしくは上がる)印象でした ※特定の条件下で得られた個人の見解であり、一般的な効用を保証するものではありません
  43. XGBoostに関する小ネタ その他 • Rのxgboostだとpredict時に自動的にbest_iterationを使ってくれるけど、 Pythonだと逐一指定しないといけないので注意 • Slackでも議論がありましたが、RとPythonではfeature importance plot の仕様が違います(RだとGain順だがPythonだと出現頻度順に並ぶ、R

    ではimportanceを全変数で足して100%になるような表示になっている) • lightgbmは精度でxgboostを若干下回る印象(まだそこまで本気で使っ たことないけど) • 今のところ、xgboostとlightgbmをアンサンブルしてもあまり精度を上げ られた試しが無い(ほぼ同じtreeアルゴリズムなので、直感的にもあまり 上手くいきそうな印象は無いのだが、他の人の知見も伺いたい)
  44. XGBoostのアルゴリズムの概説 ※間違っていたらごめんなさい

  45. XGBoostのアルゴリズムの概説 • これは、私自身がここ数日で(いまさら)理解したXGBoostのアルゴリズムを、多少平易な形 で説明することを試みるものです • もっとまともな理解をしたい方は、以下のように非常に参考になる内容をいろんな方が既に 共有してくださっていますので、そちらをご参照ください(あくまで以下は一部の紹介です) • https://www.slideshare.net/tkm2261/overview-of-tree-algorithms-from-decision-tre e-to-xgboost

    – tkm氏によるtree系アルゴリズムの理論まとめ • https://zaburo-ch.github.io/post/xgboost/ – ZABURO氏によるGradient BoostingおよびXGBoostの理論まとめ • http://marugari2.hatenablog.jp/ – XGBoost芸人であるmarugari氏のブログ(XGBoostをはじめとする様々なトピック)
  46. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい

  47. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・)

    w w
  48. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・)

    w w w をどう設定すれば、最もlossを減らせるかを考えます
  49. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・)

    w w w = 1 2 ( − )2 ここで、loss functionとして二乗誤差を考えます をどう設定すれば、最もlossを減らせるかを考えます
  50. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・)

    w w w = 1 2 ( − )2 ここで、loss functionとして二乗誤差を考えます → + に変えてやると、 あるサンプルの予測値を をどう設定すれば、最もlossを減らせるかを考えます
  51. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・)

    w w w = 1 2 ( − )2 ここで、loss functionとして二乗誤差を考えます → + に変えてやると、 あるサンプルの予測値を = 1 2 ( + − )2 = 1 2 ( − )2 + − + 1 2 2 ∆ = − + 1 2 2 をどう設定すれば、最もlossを減らせるかを考えます
  52. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・)

    w w w = 1 2 ( − )2 ここで、loss functionとして二乗誤差を考えます → + に変えてやると、 あるサンプルの予測値を = 1 2 ( + − )2 = 1 2 ( − )2 + − + 1 2 2 ∆ = − + 1 2 2 ∆ = ෍ =1 6 , − + 1 2 2 つまり、予測値に を加えることによるlossの変化は、 lossを減少させたいので、 負にならないと意味が無い をどう設定すれば、最もlossを減らせるかを考えます
  53. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・)

    w w w = 1 2 ( − )2 ここで、loss functionとして二乗誤差を考えます → + に変えてやると、 あるサンプルの予測値を = 1 2 ( + − )2 = 1 2 ( − )2 + − + 1 2 2 ∆ = − + 1 2 2 ∆ = ෍ =1 6 , − + 1 2 2 + 1 2 2 つまり、予測値に を加えることによるlossの変化は、 ただし、ここでwの大きさに応じた ペナルティを加えます(正則化) をどう設定すれば、最もlossを減らせるかを考えます
  54. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・)

    w w w = 1 2 ( − )2 ここで、loss functionとして二乗誤差を考えます → + に変えてやると、 あるサンプルの予測値を = 1 2 ( + − )2 = 1 2 ( − )2 + − + 1 2 2 ∆ = − + 1 2 2 この値を最小にする は、 ∆ = ෍ =1 6 , − + 1 2 2 + 1 2 2 ∆ = 0 より、 = − σ , − 6 + つまり、予測値に を加えることによるlossの変化は、 をどう設定すれば、最もlossを減らせるかを考えます
  55. この値を最小にする は、 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・) w w

    = 1 2 ( − )2 ここで、loss functionとして二乗誤差を考えます → + に変えてやると、 あるサンプルの予測値を = 1 2 ( + − )2 = 1 2 ( − )2 + − + 1 2 2 ∆ = − + 1 2 2 ∆ = ෍ =1 6 , − + 1 2 2 + 1 2 2 ∆ = 0 より、 = − σ , − 6 + 上の例だと、 の場合、 = 1 = − 1 + 2 − 2 − 3 − 5 − 3 6 + 1 = 10 7 つまり、予測値に を加えることによるlossの変化は、 予測値が 真値より大きい 予測値が 真値より小さい 1 2 2 3 5 3 をどう設定すれば、最もlossを減らせるかを考えます
  56. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・) w w = 1

    2 ( − )2 ここで、loss functionとして二乗誤差を考えます → + に変えてやると、 あるサンプルの予測値を = 1 2 ( + − )2 = 1 2 ( − )2 + − + 1 2 2 ∆ = − + 1 2 2 lossが減りました この値を最小にする は、 ∆ = ෍ =1 6 , − + 1 2 2 + 1 2 2 ∆ = 0 より、 = − σ , − 6 + 上の例だと、 の場合、 = 1 = − 1 + 2 − 2 − 3 − 5 − 3 6 + 1 = 10 7 つまり、予測値に を加えることによるlossの変化は、 ∆ = − 50 7 めでたしめでたし・・・ をどう設定すれば、最もlossを減らせるかを考えます 10/7
  57. 左の図のような誤差を持つ予測モデルがあるとします XGBoostのアルゴリズムの概説 全体的に予測値が小さめなので、そこにある定数 を 加えてやると、平均的に誤差を減らすことができますね (一部犠牲になりますが・・・) w w = 1

    2 ( − )2 ここで、loss functionとして二乗誤差を考えます → + に変えてやると、 あるサンプルの予測値を = 1 2 ( + − )2 = 1 2 ( − )2 + − + 1 2 2 ∆ = − + 1 2 2 lossが減りました この値を最小にする は、 ∆ = ෍ =1 6 , − + 1 2 2 + 1 2 2 ∆ = 0 より、 = − σ , − 6 + 上の例だと、 の場合、 = 1 = − 1 + 2 − 2 − 3 − 5 − 3 6 + 1 = 10 7 つまり、予測値に を加えることによるlossの変化は、 ∆ = − 50 7 めでたしめでたし・・・ ではなく、ここからが本番です をどう設定すれば、最もlossを減らせるかを考えます 10/7
  58. XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい w 最適なwは求まりましたが、とりあえず補正するのは保留します

  59. XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい w 最適なwは求まりましたが、とりあえず補正するのは保留します もし仮に、ある説明変数xで下図のように分離できるとしたら・・・ = 0

  60. XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 最適なwは求まりましたが、とりあえず補正するのは保留します もし仮に、ある説明変数xで下図のように分離できるとしたら・・・ = 0 予測値に

    (負) 予測値に (正) を加えてやる方が、共通のwを加えるより明らかによさそうですよね (これが、決定木の分岐を作る操作)
  61. XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 最適なwは求まりましたが、とりあえず補正するのは保留します もし仮に、ある説明変数xで下図のように分離できるとしたら・・・ = 0 予測値に

    (負) 予測値に (正) 当然、次にやることは、lossがどう変わるかをチェックすることですね を加えてやる方が、共通のwを加えるより明らかによさそうですよね (これが、決定木の分岐を作る操作)
  62. XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 最適なwは求まりましたが、とりあえず補正するのは保留します もし仮に、ある説明変数xで下図のように分離できるとしたら・・・ = 0 予測値に

    (負) 予測値に (正) 当然、次にやることは、lossがどう変わるかをチェックすることですね 分岐しなかった場合、(共通のwによる)lossの変化は、 ∆1 = − 1 2 σ , − 2 6 + ←wの最適解を代入するとこうなる 分岐した場合、lossの変化は、 ∆2 = ∆ + ∆ = − 1 2 σ , − 2 2 + − 1 2 σ , − 2 4 + を加えてやる方が、共通のwを加えるより明らかによさそうですよね (これが、決定木の分岐を作る操作)
  63. XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 最適なwは求まりましたが、とりあえず補正するのは保留します もし仮に、ある説明変数xで下図のように分離できるとしたら・・・ = 0 予測値に

    (負) 予測値に (正) 当然、次にやることは、lossがどう変わるかをチェックすることですね 分岐しなかった場合、(共通のwによる)lossの変化は、 ∆1 = − 1 2 σ , − 2 6 + ←wの最適解を代入するとこうなる 分岐した場合、lossの変化は、 ∆2 = ∆ + ∆ = − 1 2 σ , − 2 2 + − 1 2 σ , − 2 4 + + ここでも、分岐を増やしたことによる ペナルティを加えることがあります を加えてやる方が、共通のwを加えるより明らかによさそうですよね (これが、決定木の分岐を作る操作)
  64. XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 最適なwは求まりましたが、とりあえず補正するのは保留します もし仮に、ある説明変数xで下図のように分離できるとしたら・・・ = 0 予測値に

    (負) 予測値に (正) 当然、次にやることは、lossがどう変わるかをチェックすることですね 分岐しなかった場合、(共通のwによる)lossの変化は、 ∆1 = − 1 2 σ , − 2 6 + 分岐した場合、lossの変化は、 分岐した方がいいかどうかは、どちらの方が よりlossを減らせるか、ということなので、 = ∆1 − ∆2 が正かどうかで判断すればよいことになります ∆2 = ∆ + ∆ = − 1 2 σ , − 2 2 + − 1 2 σ , − 2 4 + + を加えてやる方が、共通のwを加えるより明らかによさそうですよね (これが、決定木の分岐を作る操作)
  65. XGBoostのアルゴリズムの概説 予測値が 真値より大きい 予測値が 真値より小さい 最適なwは求まりましたが、とりあえず補正するのは保留します もし仮に、ある説明変数xで下図のように分離できるとしたら・・・ = 0 予測値に

    (負) 予測値に (正) 当然、次にやることは、lossがどう変わるかをチェックすることですね 分岐しなかった場合、(共通のwによる)lossの変化は、 ∆1 = − 1 2 σ , − 2 6 + 分岐した場合、lossの変化は、 分岐した方がいいかどうかは、どちらの方が よりlossを減らせるか、ということなので、 = ∆1 − ∆2 が正かどうかで判断すればよいことになります ∆2 = ∆ + ∆ = − 1 2 σ , − 2 2 + − 1 2 σ , − 2 4 + + を加えてやる方が、共通のwを加えるより明らかによさそうですよね (これが、決定木の分岐を作る操作) • つまり、ある説明変数の閾値 = 0 を決めてやると、左右に割り振られ るサンプルの予測値にどのような値を加えればlossを最小化できるか、 そして分岐したことによるlossの減少(=Gain)が求まります • 上記を全ての変数の全ての閾値について試し、最もGainの大きい(変数、 閾値)の組み合わせを探すのが、Exact Greedy Algorithm • この例はあくまで1回目の分岐についてですが、2回目以降も同様です • 木が最後まで完成したら、前回の予測値にを加えてよりよい予測値を 得る、そしてまた木を作る、の繰り返し
  66. XGBoostのアルゴリズムの概説 最もlossを最小化するwの値は、 さっきの例(二乗誤差)の場合 = − σ , − + ∆

    = − 1 2 σ , − 2 + これを上式に代入すると、 ∆ = ෍ =1 6 , − + 1 2 2 + 1 2 2
  67. 一般には ∆ ≈ ෍ =1 + 1 2 ℎ 2

    + 1 2 2 = − σ σ ℎ + : grad ℎ : hess 二乗誤差の場合はイコールだが、 一般の場合には二次近似 上の近似の下で、最適解は、 (サンプルi) XGBoostのアルゴリズムの概説 二乗誤差の場合hessは1なので 単純にサンプル数になる 最もlossを最小化するwの値は、 さっきの例(二乗誤差)の場合 = − σ , − + ∆ = − 1 2 σ , − 2 + これを上式に代入すると、 ∆ = ෍ =1 , − + 1 2 2 + 1 2 2 ∆ ≈ − 1 2 σ 2 σ ℎ + これを上式に代入すると、 Cover
  68. また、 にさらに以下のようなペナルティを 加える場合があります ∆ ∆ ≈ ෍ =1 + 1

    2 ℎ 2 + 1 2 2 + XGBoostのアルゴリズムの概説 一般には ∆ ≈ ෍ =1 + 1 2 ℎ 2 + 1 2 2 二乗誤差の場合はイコールだが、 一般の場合には二次近似 最もlossを最小化するwの値は、 さっきの例(二乗誤差)の場合 = − σ , − + ∆ = − 1 2 σ , − 2 + これを上式に代入すると、 ∆ = ෍ =1 , − + 1 2 2 + 1 2 2 ∆ ≈ − 1 2 σ 2 σ ℎ + これを上式に代入すると、 wに関する 一次のペナルティ = − σ σ ℎ + : grad ℎ : hess 上の近似の下で、最適解は、 (サンプルi)
  69. また、 にさらに以下のようなペナルティを 加える場合があります ∆ ∆ ≈ ෍ =1 + 1

    2 ℎ 2 + 1 2 2 + wに関する 一次のペナルティ xgboostのパラメータとの関係 • eta: 木の完成後、求めたwを前の予測値にそのまま足す のではなく、etaを掛けた上で足す(少しずつ改善していく) • gamma: 得られるgainがgamma以上ないと分岐NG • min_child_weight: σ ℎ が指定値以上無いと分岐NG (二乗誤差の場合は単純にサンプル数) • max_delta_step: 求めたwの絶対値がこれ以上だとcapさ れる • lambda: 左の通り(wに関する2次の正則化) • alpha: 左の通り(wに関する1次の正則化) XGBoostのアルゴリズムの概説 一般には ∆ ≈ ෍ =1 + 1 2 ℎ 2 + 1 2 2 二乗誤差の場合はイコールだが、 一般の場合には二次近似 最もlossを最小化するwの値は、 さっきの例(二乗誤差)の場合 = − σ , − + ∆ = − 1 2 σ , − 2 + これを上式に代入すると、 ∆ = ෍ =1 , − + 1 2 2 + 1 2 2 ∆ ≈ − 1 2 σ 2 σ ℎ + これを上式に代入すると、 = − σ σ ℎ + : grad ℎ : hess 上の近似の下で、最適解は、 (サンプルi)
  70. また、 にさらに以下のようなペナルティを 加える場合があります ∆ ∆ ≈ ෍ =1 + 1

    2 ℎ 2 + 1 2 2 + wに関する 一次のペナルティ xgboostのパラメータとの関係 • eta: 木の完成後、求めたwを前の予測値にそのまま足す のではなく、etaを掛けた上で足す(少しずつ改善していく) • gamma: 得られるgainがgamma以上ないと分岐NG • min_child_weight: σ ℎ が指定値以上無いと分岐NG (二乗誤差の場合は単純にサンプル数) • max_delta_step: 求めたwの絶対値がこれ以上だとcapさ れる • lambda: 左の通り(wに関する2次の正則化) • alpha: 左の通り(wに関する1次の正則化) XGBoostのアルゴリズムの概説 一般には ∆ ≈ ෍ =1 + 1 2 ℎ 2 + 1 2 2 二乗誤差の場合はイコールだが、 一般の場合には二次近似 最もlossを最小化するwの値は、 さっきの例(二乗誤差)の場合 = − σ , − + ∆ = − 1 2 σ , − 2 + これを上式に代入すると、 ∆ = ෍ =1 , − + 1 2 2 + 1 2 2 ∆ ≈ − 1 2 σ 2 σ ℎ + これを上式に代入すると、 = − σ σ ℎ + : grad ℎ : hess 上の近似の下で、最適解は、 (サンプルi)
  71. 以上 ありがとうございました