Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kaggle Meetup #4 Lightning Talks

Jack
May 12, 2018

Kaggle Meetup #4 Lightning Talks

Jack

May 12, 2018
Tweet

More Decks by Jack

Other Decks in Technology

Transcript

  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

    View Slide

  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

    View Slide

  3. コンペ概要
    ・約3年前のコンペ
    ・典型的な二値分類
    ・評価指標:logloss

    View Slide

  4. コンペ概要
    • 今回はLTということで、コンペ自体の詳細やsolutionの細部に
    ついては触れません
    • GBDTとカテゴリ変数の扱いについてが今日の主題です
    ・約3年前のコンペ
    ・典型的な二値分類
    ・評価指標:logloss

    View Slide

  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
    カテゴリ変数一覧

    View Slide

  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
    超重要!
    カテゴリ変数一覧

    View Slide

  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はかなり無理が
    ありません?
    • こういうときって、みなさんどうされてるんでしょうか?

    View Slide

  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
    : : : : :
    集計 置換

    View Slide

  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で
    各カテゴリの
    平均値を計算

    View Slide

  10. 自身のアプローチの要点
    • 最終的に9位まで順位を上げて終えましたが、自身のsolutionの要点は、
    – XGBoost
    – カテゴリ変数のコンビネーション
    – Likelihood Encoding
    • 上記の3要素だけ(?)のkernelで、16位/2926のスコアが出せる
    – https://www.kaggle.com/rsakata/xgboost-with-combination-of-factors
    – Rでわずか78行、実行時間約7分!

    View Slide

  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 順位

    View Slide

  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

    View Slide

  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

    View Slide

  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は不向き
    に思えますが、データの性質によってはこのように威力を発揮
    するケースもある

    View Slide

  15. ここでCatBoostの登場
    CatBoostとは?簡単に言うと?

    View Slide

  16. ここでCatBoostの登場
    CatBoostとは?簡単に言うと?
    • Likelihood Encodingみたいなことを内部的にやってくれる
    • カテゴリ変数の掛け合わせも新たなカテゴリ変数として考慮してくれる

    View Slide

  17. ここでCatBoostの登場
    CatBoostとは?簡単に言うと?
    • Likelihood Encodingみたいなことを内部的にやってくれる
    • カテゴリ変数の掛け合わせも新たなカテゴリ変数として考慮してくれる
    今回のsolutionまんまやん
    ということは、CatBoostを使えば素でかなりのスコアが出せるのでは?

    View Slide

  18. CatBoostにおける工夫点
    • 先ほど述べた方法とは異なり、CatBoostではtraining dataの各レコード
    に対して、そのレコード手前のデータまでを使って平均を計算することで、
    overfittingを回避している模様(indexはiterationの度にシャッフル)
    training data training data
    … …
    … …
    ※実際はpriorを加えて計算するので、最初のレコードもNAにはならない

    View Slide

  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を同じにして比較しています

    View Slide

  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を同じにして比較しています
    • 設定できるパラメータやデフォルト値にかなりの差異があり、
    細かく設定して条件を合わせないと正確な比較にならないの
    で注意が必要

    View Slide

  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

    View Slide

  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
    学習時間の相対値(あくまで雰囲気)

    View Slide

  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は速い

    View Slide

  24. 考察、所感
    • 期待通り、CatBoostは素のデータを投げるだけでかなりのスコアが達成できた
    • 内部アルゴリズムで既に考慮されているためか、掛け合わせ変数の追加は一定
    以上の効果は得られなかった(ただし、一段階目だけは性能向上が見られた)
    • XGBoost, LightGBMでは掛け合わせの変数を自力で追加しなければならないが、
    適切に処理を行えばCatBoostの性能にかなり近付く(今回は上回ることはできて
    いないが、掛け合わせ変数をさらに追加することで達成可能か?)
    • 学習時間を考えると、最終的にはXGBoost, LightGBMで自力で特徴作りまくって
    Likelihood Encodingする方がよいかも?
    • いずれにしても、カテゴリ変数の扱いが問われるコンペでは、CatBoostを試して
    みる価値は大いにあると思われる

    View Slide

  25. 補足事項
    • カテゴリ変数の掛け合わせやLikelihood Encodingがここまで劇的に効くことは
    そうそう無いので、過度な期待は禁物(本コンペは異例)
    • LightGBMでも学習時にcategorical featureを指定できるが、Label Encodingと
    ほとんど差異は生まれなかった(CatBoostのそれとは全く別物)
    • 今回のデータでは、LightGBMは速い上に精度もXGBoostとほとんど遜色無かっ
    た(ただし、他コンペで精度落ちた経験もあるので、要継続調査)

    View Slide

  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の設定を間違えてやり直したいときなど、学習を途中でキャンセルし
    ようとするとセッションごと落ちる

    View Slide