Kaggle Meetup #4 Lightning Talks

94c4261d3ac90c39ce6add9d03670aa6?s=47 Jack
May 12, 2018

Kaggle Meetup #4 Lightning Talks

94c4261d3ac90c39ce6add9d03670aa6?s=128

Jack

May 12, 2018
Tweet

Transcript

  1. 1.

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

    https://www.kaggle.com/rsakata Lightning Talks 2018/05/12 Kaggle Tokyo Meetup #4
  2. 2.

    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 2017/09/12 Web Traffic Time Series Forecasting 2 64 / 1095 2017/10/16 Zillow Prize: Zillow’s Home Value Prediction (Zestimate) 10 5 / 3779 2018/01/15 Corporación Favorita Grocery Sales Forecasting 15 554 / 1675 2018/02/06 Recruit Restaurant Visitor Forecasting 7 16 / 2158
  3. 5.

    データ概要 • データ数 – train : 114321 (正例: 87021, 負例:

    27300) – test : 114393 • 説明変数 – 量的:114 – 質的:19 – 変数名は匿名化 – 欠損多数あり 変数名 水準数 v3 4 v22 18211 v24 5 v30 8 v31 4 v47 10 v52 13 v56 123 v66 3 v71 9 v74 3 v75 4 v79 18 v91 8 v107 8 v110 3 v112 23 v113 37 v125 91 カテゴリ変数一覧
  4. 6.

    データ概要 • データ数 – train : 114321 (正例: 87021, 負例:

    27300) – test : 114393 • 説明変数 – 量的:114 – 質的:19 – 変数名は匿名化 – 欠損多数あり 変数名 水準数 v3 4 v22 18211 v24 5 v30 8 v31 4 v47 10 v52 13 v56 123 v66 3 v71 9 v74 3 v75 4 v79 18 v91 8 v107 8 v110 3 v112 23 v113 37 v125 91 超重要! カテゴリ変数一覧
  5. 7.

    データ概要 • データ数 – train : 114321 (正例: 87021, 負例:

    27300) – test : 114393 • 説明変数 – 量的:114 – 質的:19 – 変数名は匿名化 – 欠損多数あり 変数名 水準数 v3 4 v22 18211 v24 5 v30 8 v31 4 v47 10 v52 13 v56 123 v66 3 v71 9 v74 3 v75 4 v79 18 v91 8 v107 8 v110 3 v112 23 v113 37 v125 91 超重要! カテゴリ変数一覧 • 10000を超えるカテゴリ、One-Hot Encodingはかなり無理が ありません? • こういうときって、みなさんどうされてるんでしょうか?
  6. 8.

    Likelihood Encoding (1) • カテゴリ変数を各水準における目的変数の平均値で置き換える方法 • Target Encoding, Target-Based Encoding,

    Mean Encodingなどとも • カテゴリ変数を並び替えることで木構造を単純化するような効果がある ID … v22 … target 9 … AYX … 0 12 … NFD … 0 21 … AHBW … 1 22 … GKQ … 0 23 … PYF … 1 : : : : : v22 mean of target 0.820 AA 0.800 AAA 1.000 AAAA 1.000 AAAB 0.923 : : ID … v22 … target 9 … 0.667 … 0 12 … 0.846 … 0 21 … 0.857 … 1 22 … 0.727 … 0 23 … 0.692 … 1 : : : : : 集計 置換
  7. 9.

    Likelihood Encoding (2) • test dataに対しては全training dataの平均値を使ってよいが、training dataに対しては、下図のように分割を行い、out of foldで平均値を計算

    し、overfittingを回避(あくまで一つの方法) training data categorical variable mean of target training data out of foldで 各カテゴリの 平均値を計算
  8. 10.

    自身のアプローチの要点 • 最終的に9位まで順位を上げて終えましたが、自身のsolutionの要点は、 – XGBoost – カテゴリ変数のコンビネーション – Likelihood Encoding

    • 上記の3要素だけ(?)のkernelで、16位/2926のスコアが出せる – https://www.kaggle.com/rsakata/xgboost-with-combination-of-factors – Rでわずか78行、実行時間約7分!
  9. 11.

    v112v113 v113v91 v30v52 v52v79 v112v22 v22v24 v30v56 v52v91 v112v24 v22v30

    v30v66 v56v66 v112v30 v22v31 v30v75 v56v75 v112v31 v22v47 v30v79 v56v79 v112v47 v22v52 v30v91 v56v91 v112v52 v22v56 v31v47 v66v75 v112v56 v22v66 v31v52 v66v79 v112v66 v22v75 v31v56 v66v91 v112v75 v22v79 v31v66 v75v79 v112v79 v22v91 v31v75 v75v91 v112v91 v24v30 v31v79 v79v91 v113v22 v24v31 v31v91 v113v24 v24v47 v47v52 v113v30 v24v52 v47v56 v113v31 v24v56 v47v66 v113v47 v24v66 v47v75 v113v52 v24v75 v47v79 v113v56 v24v79 v47v91 v113v66 v24v91 v52v56 v113v75 v30v31 v52v66 v113v79 v30v47 v52v75 まずはXGBoostでEncodingの効果を確認 ※hyperparameterは他ライブラリとの比較のため最適値ではない Label Encoding (アルファベット順で番号付け) logloss 順位 4-fold CV 0.46420 - Public LB 0.46185 1687 Private LB 0.46044 1689 logloss 順位 logloss 順位 素のXGBoost (特徴設計無し) 特徴選択+ カテゴリ変数同士の 結合変数を追加 結合変数を さらに追加 結合変数を さらに追加 v22v112v113 v22v24v31 v22v31v91 v22v112v24 v22v24v47 v22v47v52 v22v112v30 v22v24v52 v22v47v56 v22v112v31 v22v24v56 v22v47v66 v22v112v47 v22v24v66 v22v47v75 v22v112v52 v22v24v75 v22v47v79 v22v112v56 v22v24v79 v22v47v91 v22v112v66 v22v24v91 v22v52v56 v22v112v75 v22v30v31 v22v52v66 v22v112v79 v22v30v47 v22v52v75 v22v112v91 v22v30v52 v22v52v79 v22v113v24 v22v30v56 v22v52v91 v22v113v30 v22v30v66 v22v56v66 v22v113v31 v22v30v75 v22v56v75 v22v113v47 v22v30v79 v22v56v79 v22v113v52 v22v30v91 v22v56v91 v22v113v56 v22v31v47 v22v66v75 v22v113v66 v22v31v52 v22v66v79 v22v113v75 v22v31v56 v22v66v91 v22v113v79 v22v31v66 v22v75v79 v22v113v91 v22v31v75 v22v75v91 v22v24v30 v22v31v79 v22v79v91 v22v112v113v24v30v31v47v52v56v66v75 v22v112v113v24v30v31v47v52v56v66v79 v22v112v113v24v30v31v47v52v56v66v91 v22v112v113v24v30v31v47v52v56v75v79 v22v112v113v24v30v31v47v52v56v75v91 v22v112v113v24v30v31v47v52v56v79v91 v22v112v113v24v30v31v47v52v66v75v79 v22v112v113v24v30v31v47v52v66v75v91 v22v112v113v24v30v31v47v52v66v79v91 v22v112v113v24v30v31v47v52v75v79v91 v22v112v113v24v30v31v47v56v66v75v79 v22v112v113v24v30v31v47v56v66v75v91 v22v112v113v24v30v31v47v56v66v79v91 v22v112v113v24v30v31v47v56v75v79v91 v22v112v113v24v30v31v47v66v75v79v91 v22v112v113v24v30v31v52v56v66v75v79 v22v112v113v24v30v31v52v56v66v75v91 v22v112v113v24v30v31v52v56v66v79v91 v22v112v113v24v30v31v52v56v75v79v91 v22v112v113v24v30v31v52v66v75v79v91 v22v112v113v24v30v31v56v66v75v79v91 : *max_depth=8 *max_depth=8 *max_depth=8 *max_depth=8 logloss 順位
  10. 12.

    まずはXGBoostでEncodingの効果を確認 ※hyperparameterは他ライブラリとの比較のため最適値ではない むしろスコア悪化していますが・・・ Label Encoding (アルファベット順で番号付け) logloss 順位 4-fold CV

    0.46420 - Public LB 0.46185 1687 Private LB 0.46044 1689 logloss 順位 0.46476 - 0.46388 1800 0.46172 1752 logloss 順位 0.46490 - 0.46429 1820 0.46165 1752 logloss 順位 0.46505 - 0.46380 1796 0.46222 1778 素のXGBoost (特徴設計無し) 特徴選択+ カテゴリ変数同士の 結合変数を追加 結合変数を さらに追加 結合変数を さらに追加 *max_depth=8 *max_depth=8 *max_depth=8 *max_depth=8
  11. 13.

    まずはXGBoostでEncodingの効果を確認 ※hyperparameterは他ライブラリとの比較のため最適値ではない logloss 順位 4-fold CV 0.46207 - Public LB

    0.45971 1503 Private LB 0.45921 1586 logloss 順位 0.45135 - 0.44698 132 0.44579 135 logloss 順位 0.44526 - 0.43819 38 0.43667 38 logloss 順位 0.44223 - 0.43433 19 0.43337 21 Likelihood Encoding *max_depth=8 *max_depth=6 *max_depth=6 *max_depth=6 Label Encoding (アルファベット順で番号付け) logloss 順位 4-fold CV 0.46420 - Public LB 0.46185 1687 Private LB 0.46044 1689 logloss 順位 0.46476 - 0.46388 1800 0.46172 1752 logloss 順位 0.46490 - 0.46429 1820 0.46165 1752 素のXGBoost (特徴設計無し) 特徴選択+ カテゴリ変数同士の 結合変数を追加 結合変数を さらに追加 結合変数を さらに追加 *max_depth=8 *max_depth=8 *max_depth=8 *max_depth=8 logloss 順位 0.46505 - 0.46380 1796 0.46222 1778
  12. 14.

    まずはXGBoostでEncodingの効果を確認 ※hyperparameterは他ライブラリとの比較のため最適値ではない logloss 順位 4-fold CV 0.46207 - Public LB

    0.45971 1503 Private LB 0.45921 1586 logloss 順位 0.45135 - 0.44698 132 0.44579 135 logloss 順位 0.44526 - 0.43819 38 0.43667 38 logloss 順位 0.44223 - 0.43433 19 0.43337 21 Likelihood Encoding *max_depth=8 *max_depth=6 *max_depth=6 *max_depth=6 Label Encoding (アルファベット順で番号付け) logloss 順位 4-fold CV 0.46420 - Public LB 0.46185 1687 Private LB 0.46044 1689 logloss 順位 0.46476 - 0.46388 1800 0.46172 1752 logloss 順位 0.46490 - 0.46429 1820 0.46165 1752 素のXGBoost (特徴設計無し) 特徴選択+ カテゴリ変数同士の 結合変数を追加 結合変数を さらに追加 結合変数を さらに追加 *max_depth=8 *max_depth=8 *max_depth=8 *max_depth=8 logloss 順位 0.46505 - 0.46380 1796 0.46222 1778 • 当然、カテゴリ変数の結合は超high cardinalityになります • 一見して、そのような変数にはLikelihood Encodingは不向き に思えますが、データの性質によってはこのように威力を発揮 するケースもある
  13. 19.

    各種GBDTライブラリのhyperparameter (一部抜粋、数値はデフォルト値) XGBoost LightGBM CatBoost eta 0.3 learning_rate 0.1 learning_rate

    0.03 max_depth 6 max_depth ∞ depth 6 (max_leaves) ∞ num_leaves 31 min_data_in_leaf 20 min_child_weight 1 min_sum_hessian_in_leaf 1e-3 colsample_bytree 1 feature_fraction 0.8 colsample_bylevel 1 rsm 1 subsample 1 bagging_fraction 1 subsample 0.66 bagging_freq 0 lambda 1 lambda_l2 0 l2_leaf_reg 3 alpha 0 lambda_l1 0 gamma 0 min_split_gain 0 max_delta_step ∞ (max_bin) 256 max_bin 255 border_count 128 ※今回の検証では、各ライブラリ間で極力hyperparameterを同じにして比較しています
  14. 20.

    各種GBDTライブラリのhyperparameter (一部抜粋、数値はデフォルト値) XGBoost LightGBM CatBoost eta 0.3 learning_rate 0.1 learning_rate

    0.03 max_depth 6 max_depth ∞ depth 6 (max_leaves) ∞ num_leaves 31 min_data_in_leaf 20 min_child_weight 1 min_sum_hessian_in_leaf 1e-3 colsample_bytree 1 feature_fraction 0.8 colsample_bylevel 1 rsm 1 subsample 1 bagging_fraction 1 subsample 0.66 bagging_freq 0 lambda 1 lambda_l2 0 l2_leaf_reg 3 alpha 0 lambda_l1 0 gamma 0 min_split_gain 0 max_delta_step ∞ (max_bin) 256 max_bin 255 border_count 128 ※今回の検証では、各ライブラリ間で極力hyperparameterを同じにして比較しています • 設定できるパラメータやデフォルト値にかなりの差異があり、 細かく設定して条件を合わせないと正確な比較にならないの で注意が必要
  15. 21.

    各種GBDTライブラリ精度比較 ※XGBoost, LightGBMはLikelihood Encodingを適用 logloss 順位 4-fold CV 0.46207 -

    Public LB 0.45971 1503 Private LB 0.45921 1586 logloss 順位 0.45135 - 0.44698 132 0.44579 135 logloss 順位 0.44526 - 0.43819 38 0.43667 38 logloss 順位 0.44223 - 0.43433 19 0.43337 21 XGBoost (再掲) logloss 順位 4-fold CV 0.46096 - Public LB 0.45858 1329 Private LB 0.45843 1538 logloss 順位 0.45208 - 0.44768 150 0.44656 158 logloss 順位 0.44537 - 0.43937 39 0.43739 39 logloss 順位 0.44218 - 0.43447 20 0.43398 22 LightGBM logloss 順位 4-fold CV 0.44734 - Public LB 0.44164 51 Private LB 0.43930 42 logloss 順位 0.44086 - 0.43266 13 0.43098 13 logloss 順位 0.44073 - 0.43297 13 0.43082 12 logloss 順位 0.44087 - 0.43306 13 0.43082 12 CatBoost *max_depth=8 *max_depth=6 *max_depth=6 *max_depth=6
  16. 22.

    各種GBDTライブラリ精度比較 ※XGBoost, LightGBMはLikelihood Encodingを適用 logloss 順位 4-fold CV 0.46207 -

    Public LB 0.45971 1503 Private LB 0.45921 1586 logloss 順位 0.45135 - 0.44698 132 0.44579 135 logloss 順位 0.44526 - 0.43819 38 0.43667 38 logloss 順位 0.44223 - 0.43433 19 0.43337 21 XGBoost (再掲) logloss 順位 4-fold CV 0.46096 - Public LB 0.45858 1329 Private LB 0.45843 1538 logloss 順位 0.45208 - 0.44768 150 0.44656 158 logloss 順位 0.44537 - 0.43937 39 0.43739 39 logloss 順位 0.44218 - 0.43447 20 0.43398 22 LightGBM logloss 順位 4-fold CV 0.44734 - Public LB 0.44164 51 Private LB 0.43930 42 logloss 順位 0.44086 - 0.43266 13 0.43098 13 logloss 順位 0.44073 - 0.43297 13 0.43082 12 logloss 順位 0.44087 - 0.43306 13 0.43082 12 CatBoost *max_depth=8 *max_depth=8 *max_depth=6 *max_depth=6 3 3 3 3 1 1 1 1 5 50 100 150 学習時間の相対値(あくまで雰囲気)
  17. 23.

    各種GBDTライブラリ精度比較 ※XGBoost, LightGBMはLikelihood Encodingを適用 logloss 順位 4-fold CV 0.46207 -

    Public LB 0.45971 1503 Private LB 0.45921 1586 logloss 順位 0.45135 - 0.44698 132 0.44579 135 logloss 順位 0.44526 - 0.43819 38 0.43667 38 logloss 順位 0.44223 - 0.43433 19 0.43337 21 XGBoost (再掲) logloss 順位 4-fold CV 0.46096 - Public LB 0.45858 1329 Private LB 0.45843 1538 logloss 順位 0.45208 - 0.44768 150 0.44656 158 logloss 順位 0.44537 - 0.43937 39 0.43739 39 logloss 順位 0.44218 - 0.43447 20 0.43398 22 LightGBM logloss 順位 4-fold CV 0.44734 - Public LB 0.44164 51 Private LB 0.43930 42 logloss 順位 0.44086 - 0.43266 13 0.43098 13 logloss 順位 0.44073 - 0.43297 13 0.43082 12 logloss 順位 0.44087 - 0.43306 13 0.43082 12 CatBoost *max_depth=8 *max_depth=8 *max_depth=6 *max_depth=6 3 3 3 3 1 1 1 1 5 50 100 150 学習時間の相対値(あくまで雰囲気) • カテゴリ変数が増えるとCatBoostの学習時間が爆発する • GOSS使ってないけど、それでもLightGBMは速い
  18. 24.

    考察、所感 • 期待通り、CatBoostは素のデータを投げるだけでかなりのスコアが達成できた • 内部アルゴリズムで既に考慮されているためか、掛け合わせ変数の追加は一定 以上の効果は得られなかった(ただし、一段階目だけは性能向上が見られた) • XGBoost, LightGBMでは掛け合わせの変数を自力で追加しなければならないが、 適切に処理を行えばCatBoostの性能にかなり近付く(今回は上回ることはできて

    いないが、掛け合わせ変数をさらに追加することで達成可能か?) • 学習時間を考えると、最終的にはXGBoost, LightGBMで自力で特徴作りまくって Likelihood Encodingする方がよいかも? • いずれにしても、カテゴリ変数の扱いが問われるコンペでは、CatBoostを試して みる価値は大いにあると思われる
  19. 26.

    各ライブラリの欠陥 ※Rでの話です • XGBoost – Macだと精度が落ちる致命的バグがある模様(https://github.com/dmlc/xgboost/is sues/3046) • LightGBM ※今回使ったのは少し古いバージョンなので既にfixされている可能性があります

    – NAが含まれるデータで学習するとpredictで精度がガタ落ち(バグ?) – hyperparameterの設定で一度エラーを出してしまうと、変更が効かなくなる(セッション を一度落とさないとリセットされない) – インストール、アップデートが面倒(install.packagesできない) – 余計なInfoログが大量に画面出力されて目障り(色々と設定変えてみたが消えない) • CatBoost – Rなのにcategorical featureの指定indexが0始まり(Rユーザーにとっては完全な罠、 下手すると気付かない) – hyperparameterの設定を間違えてやり直したいときなど、学習を途中でキャンセルし ようとするとセッションごと落ちる