Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)

Gradient Boostingは近年Kaggleなどのコンペティションで注目を集めている分類や回帰問題に対するアルゴリズムの一つである。XGBoost, LightGBM, CatBoostなどが有名ではあるが、それらを土台にして近年はDeepGBMやNGBoostといった新規アルゴリズムの登場、汎化理論解析の進展、モデル解釈性の付与方法の多様化など、理論から応用まで多岐にわたる研究が行われている。本チュートリアルでは、Gradient Boostingに関する近年の研究動向やテクニックを、それらの社会実装までを見据えながら紹介していく。

  • Als Erste(r) kommentieren

勾配ブースティングの基礎と最新の動向 (MIRU2020 Tutorial)

  1. 1. MIRU 2020 Tutorial 加納龍一 勾配ブースティングの基礎と最新の動向
  2. 2. 2 ▪ 加納龍一 (かのうりゅういち) ▪ Mobility Technologiesて、交通システムの最適化に従事 (DeNAより出向) ▪ 機械学習システムの社会実装 自己紹介
  3. 3. 3 ▪ 弱学習器が誤差に対して順次fitしていく学習方法 ▪ ひとつの強いモデルを作らず、シンプルな複数のモデルを組み合わせて強力なものにする Gradient Boosting(勾配ブースティング)とは? 残差 残差 残差 残差 iter=1 iter=2 iter=3 iter=4 iter=5 弱学習器の和で構成される最終出力 Friedman論文:https://statweb.stanford.edu/~jhf/ftp/stobst.pdf
  4. 4. 4 ▪ 決定木が弱学習器に採用されることが多い (制限はない) ▪ Gradient Boosting Decision Tree: GBDT ▪ XGBoost, LightGBM, CatBoostなどが有名。今日のチュートリアルのメインテーマ Gradient Boosting(勾配ブースティング)とは? https://www.kdd.org/kdd2016/papers/files/rfp0697-chenAemb.pdf (KDD2016)
  5. 5. 5 GBDTの全体像 行・列のサンプリング 弱学習器の構築 iteration 1 残差の算出 行・列のサンプリング 弱学習器の構築 iteration 2 残差の算出 行・列のサンプリング 弱学習器の構築 iteration n ・・・ 決定木の学習 https://algobeans.com/2016/07/27/decision-trees-tutorial/
  6. 6. 6 ▪ 圧倒的な実績を誇るアルゴリズムである ▪ 高精度、高速、結果の安定性… ▪ 社会実装されているアプリケーションも膨大 ▪ 単体モデルとしての活用 ▪ システムの要素技術としての活用(NASの1コンポーネントとするなど, https://arxiv.org/abs/2007.04785) ▪ 要素技術には、どんなモダリティにも活用のできる重要な観点が潜んでいる ▪ ニューラルネットワーク全盛期の今だからこそ、少し違う観点から考えるのも良いのでは ▪ 微分可能な決定木モデルへの緩和など、CV分野と直接繋がりのあるトピックも なぜ勾配ブースティング(GBDT)のチュートリアル? https://medium.com/syncedreview/tree-boosting-with-xgboost-why- does-xgboost-win-every-machine-learning-competition-ca8034c0b283
  7. 7. 項目 01|GBDTのアルゴリズム概要 02|機能拡張 03|実応用の際に注意する点やテクニック ・ 微分可能なモデルへの緩和 ・ 解釈性の付与 ・ 不確実性の推定 ・ 高速性の追求 ・ 決定木に限らない、様々な勾配ブースティング ・ XGBoost, LightGBM, CatBoost ・ なぜ決定木なのか ・ 特徴量エンジニアリング、Target Leakage、評価の汚染 7
  8. 8. 8 01 GBDTのアルゴリズム概要 ・ XGBoost, LightGBM, CatBoost ・ なぜ決定木なのか 基本的にはXGBoostを基盤として説明 LightGBM, CatBoostに限った機能は吹き出しをつけた LightGBM CatBoost
  9. 9. 9 ▪ XGBoostを基準として、 ▪ 学習速度を重視したLightGBM ▪ GOSS, EFB… ▪ 推論速度および汎化性能を重視したCatBoost ▪ Symmetric Tree, Ordered-TS, Ordered Boosting… ▪ (あくまで各種ライブラリはアルゴリズムの集合なので、一概には言いにくい) ざっくりとライブラリを比較すると…
  10. 10. 10 GBDTの全体像 行・列のサンプリング 弱学習器の構築 iteration 1 残差の算出 行・列のサンプリング 弱学習器の構築 iteration 2 残差の算出 行・列のサンプリング 弱学習器の構築 iteration n ・・・ 決定木の学習 https://algobeans.com/2016/07/27/decision-trees-tutorial/
  11. 11. 11 ▪ 弱学習器の構築に用いる際は、全データを使わないことが多い ▪ 木単位、分岐単位など、様々な粒度で削減される ▪ サンプルそのものではなく、分岐に使用する特徴量の候補を削減するものもある 行・列のサンプリング https://medium.com/greyatom/a-trip-to-random-forest-5c30d8250d6a
  12. 12. 12 ▪ Gradient-based One-Side Sampling (GOSS) ▪ 誤差の小さなサンプルを効率的に省き、学習に使用するレコード数を効率的に削減する ▪ gradientの絶対値のトップa×100%を使い、残りの(1-a)×100%から、ランダムにb×100%を選ぶ ▪ サンプリングされたgradientに(1-a)/bをかけて割り戻す ▪ Minimal Variance Sampling(MVS)という改良版もある (https://arxiv.org/abs/1910.13204, NeurIPS2019) 行・列のサンプリング LightGBM CatBoost
  13. 13. 13 GBDTの全体像 行・列のサンプリング 弱学習器の構築 iteration 1 残差の算出 行・列のサンプリング 弱学習器の構築 iteration 2 残差の算出 行・列のサンプリング 弱学習器の構築 iteration n ・・・ 決定木の学習 https://algobeans.com/2016/07/27/decision-trees-tutorial/
  14. 14. 14 弱学習器の構築 ① 分岐に使用するルールの探索 ② 決定木の構造の決定 ③ numericalでないデータをどう扱うか 要素
  15. 15. 15 ▪ 探索は基本的にはGreedyに行われる ▪ どの特徴量で分岐すれば良いか、どの値を分岐点とすれば良いか… ▪ 分岐前と分岐後の目的関数を比較し、最も効率の良い分岐で枝を作成していく ▪ 葉の中のサンプルのターゲットの平均値や中央値などが予測値となる *誤差関数に依存 分岐に使用するルールの探索 https://lightgbm.readthedocs.io/en/latest/Features.html
  16. 16. 16 分岐探索の際に計算している内容の詳細 目的関数を最小化するよう、t番目のモデルを決定したい i: 学習サンプルのインデックス j: 決定木の葉のインデックス T: 決定木の葉の総数 ω: 決定木の葉の予測値 誤差関数 正則化項目的関数
  17. 17. 17 分岐探索の際に計算している内容の詳細 誤差関数部を、二次の項まで展開する (一項目は定数になるので、最適化と関係なくなる) 定数 i: 学習サンプルのインデックス j: 決定木の葉のインデックス T: 決定木の葉の総数 ω: 決定木の葉の予測値 誤差関数 正則化項目的関数 ftに関して展開
  18. 18. 18 分岐探索の際に計算している内容の詳細 ftに関して展開 定数 ftを、ωを使用して書き換え i: 学習サンプルのインデックス j: 決定木の葉のインデックス T: 決定木の葉の総数 ω: 決定木の葉の予測値 誤差関数 正則化項 Ij (葉jに入った学習サンプルの集合)を用いて、ω(葉に入る予測値)の二次式として定式化 目的関数
  19. 19. 19 分岐探索の際に計算している内容の詳細 ω(葉に入る予測値)で目的関数を微分して値がゼロになる場合が、最適な葉に入る予測値 目的関数 葉に入る予測値 https://www.kdd.org/kdd2016/papers/files/rfp0697-chenAemb.pdf Lossの一階微分: Σ(2*[true-pred]) → 誤差の総和 Loss: Σ(true-pred)2 Lossの二階微分: Σ(-2) → サンプル数
  20. 20. 20 分岐探索の際に計算している内容の詳細 Lsplit(分割によって得られるスコア)が最も大きくなるように、分岐を探索していく 分岐前 分岐後 左の葉 右の葉 分岐前 葉に入る予測値を目的関数に代入 分岐によって得られるスコア 分岐後の目的関数葉に入る予測値
  21. 21. 21 ▪ 先述した通りGradientとHessianが求まれば学習は進められる ▪ それらの両方を自分で実装して渡してやれば、任意の目的関数を用いて学習ができる ▪ Hessianまで必要というのは、ニューラルネットワークとの大きな違いのように思う 分岐探索の際に計算している内容の詳細 こんな感じの関数を学習時に渡す。(学習のコアアルゴリズムはC++で書かれているので、そこは少しいじりにくい) https://github.com/dmlc/xgboost/blob/master/demo/guide-python/custom_objective.py
  22. 22. 22 ▪ Exact Greedy Search ▪ 特徴量ごとにデータをソートして、順番に分割点を確認 ▪ O(特徴量数×データ数) ▪ Approximate Search ▪ 特徴量ごとにヒストグラムを作成し、bin単位で分割点を確認 ▪ O(特徴量数×データ数) + O(特徴量数×bin数) 分岐探索の高速化 ヒストグラム作成 分割点の確認 ※ ヒストグラム作成にかかる単体時間は短いので、結果的にこちらのほうが早い 分割点の確認
  23. 23. 23 ▪ Exclusive Feature Bundling (EFB) ▪ 排他な特徴量をまとめることで、binningする特徴量数を削減 ▪ 分割点の探索にはbundlingされていない特徴量を用いるので、原理的に精度は変わらない ▪ Bundleを探す処理が別途必要となるが、最初に一回やるだけなので問題ない 分岐探索の高速化 Binningの計算量オーダー approx search O(データ数 × 特徴量数) approx search + EFB O(データ数 × 削減後の特徴量数) 排他 LightGBM https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf (NIPS2017)
  24. 24. 24 ▪ 決定木の形を決定する上での制限がいくつか存在 ▪ 木の深さ、葉の数、葉の中に入るデータ数の最小値など どのような形を持つ決定木へと成長させるか XGBoostのパラメータ例 https://xgboost.readthedocs.io/en/latest/parameter.html
  25. 25. 25 ▪ CatBoost: symmetric tree growth (分岐ルールが深さごとに共通) ▪ XGBoost: level-wise tree growth (基準) ▪ LightGBM: leaf-wise tree growth (深さを揃えず、枝ごとにどんどん深く) どのような形を持つ決定木へと成長させるか ▪ ライブラリごとに、形の制限が異なり特徴的
  26. 26. 26 ▪ Symmetric Tree ▪ 全データに対して共通の処理を行えるので、並列化効率がとても高い ▪ 表現力が下がるのだが、アンサンブル学習の恩恵で経験的にはある程度うまく行く どのような形を持つ決定木へと成長させるか CatBoost leaf1 leaf2 leaf3 leaf4 Rule@depth1 = True Rule@depth1 = False Rule@depth2 = True leaf1 leaf3 Rule@depth2 = False leaf2 leaf4
  27. 27. 27 どのような形を持つ決定木へと成長させるか 推論時間の比較 (CPU) GPUによる推論の高速化 https://github.com/catboost/catboost/blob/master/slides/2019_icml_expo/2019_icml_expo.pdf ※ライブラリ間の結果の相対関係は経験的には変わらないように感じるが、設定によって程度は変化するので注意 predictiontime(s) Dataset1 Dataset2
  28. 28. 28 ▪ NNに関しては、Entity Embedding(One-Hot + FC)が有名 ▪ 一方、GBDTはE2Eで学習できないので、単純にこの手法を採用できない ▪ また、決定木はOne-Hotと相性が悪いので、別の方法を考える必要がある ▪ 訓練誤差最小化の観点で好ましい分割は、ラベルの大小で2つのグループに分けるようなもの ▪ カテゴリ数が増えるとOne-Hotではその分だけ木が深くなってしまい、木が勿体無い モデル内でのカテゴリ特徴量作成 https://github.com/Laurae2/CategoricalAnalysis
  29. 29. 29 Target Encoding
  30. 30. 30 ▪ 分岐ごとにTarget Encodingを行う ▪ Target Encoding: カテゴリごとのTargetの平均値を特徴量として割り当てる手法 ▪ 場合によっては深刻なTarget Leakageが発生(右図) ▪ 訓練データそのもののTargetを学習に使用してしまっているため ▪ 実際、カテゴリ変数がかなり分岐に使用されやすくなる (≠汎化) モデル内でのカテゴリ特徴量作成 https://github.com/Microsoft/LightGBM/issues/1934 https://www.slideshare.net/RyuichiKanoh/lightgbm-124545133 Target Feature A 1 1.00 B 0 0.00 C 1 1.00 LightGBM
  31. 31. 31 ▪ ランダムソートを使用し、Target Encodingを改良 ▪ Ordered TS (TS: Target Statistics) ▪ 決定木ごとにデータをランダムにソートする ▪ 各サンプルのカテゴリが、順列に沿いながらTarget Encodingされる (自データは含めない) ▪ 弱学習器ごとに順列は再生成されるため、全データを使いながらもLeakの影響が薄い モデル内でのカテゴリ特徴量作成 カテゴリ y Target Encoding Ordered TS 猫 1 0.5 0 犬 1 2/3 0 鳥 1 1 0 猫 0 0.5 1 犬 0 2/3 1 犬 1 2/3 0.5 https://arxiv.org/abs/1706.09516 (NeurIPS2018) CatBoost
  32. 32. 32 GBDTの全体像 行・列のサンプリング 弱学習器の構築 iteration 1 残差の算出 行・列のサンプリング 弱学習器の構築 iteration 2 残差の算出 行・列のサンプリング 弱学習器の構築 iteration n ・・・ 決定木の学習 https://algobeans.com/2016/07/27/decision-trees-tutorial/
  33. 33. 33 ▪ 弱学習器の出力に学習率をかけたものとの差をとり残差を更新 ▪ shrinkageと呼ばれたりもする。ニューラルネットワークの学習率と思想は同じ ▪ 前半に作成したモデルのみが重視されないよう、木を消しながら学習させる手法(DART)もある 残差の算出
  34. 34. 34 ▪ 先述したカテゴリ変数におけるTarget Leakageと似た現象は、 勾配ブースティングの残差計算にも起こりうるように思える 残差の算出 trainで木を作ったあとtrainで残差を見てるけど、 不当に残差を少なく見積もってしまうのでは? 正解データそのものを使った弱学習器で残差の更新をしてるんだよね? 勾配ブースティングの残差を見積もる意味では、 残差を算出するためのモデルは 推論に使う弱学習器の集合と別管理したいかもね。
  35. 35. 35 ▪ Ordered Boosting ▪ 残差を更新するためのモデルを、専用で別に学習させる。推論に使用するモデルは別に存在 ▪ データの順列を木ごとにランダムに生成し、その順列に沿ってモデルを作成(下図参照) ▪ Ordered-TSと処理は似ている 残差の算出 サンプル7の残差計算に, サンプル7で学習したモデルを使っていない サンプル6までを使用したモデル https://arxiv.org/abs/1706.09516 (NeurIPS2018) CatBoost
  36. 36. 36 アルゴリズム比較表 model 成長戦略 高速化処理 カテゴリ変数処理 残差計算 訓練速度 (CPU/GPU) 推論速度 (CPU/GPU) XGBoost Level-wise 基準 なし (ユーザーが特徴量作成) 弱学習器により計算 △/◎ ○/◎ LightGBM Leaf-wise GOSS, EFB 分岐ごとに Target Encoding 弱学習器により計算 ◎/◎ △/○ CatBoost Symmetric MVS, Symmetric Tree 弱学習器ごとに Ordered TS Ordered Boostingで作成された 残差算出用モデルより別途計算 △/◎ ◎/◎ *設定によって優劣は変化しうるので注意
  37. 37. 37 01 GBDTのアルゴリズム概要 ・ XGBoost, LightGBM, CatBoost ・ なぜ決定木なのか
  38. 38. 38 ▪ 特異な帰納的バイアス(inductive bias)を持つ ▪ 欠損値を扱いやすい ▪ 入力のスケーリングが不要 ▪ ハイパーパラメータの変化に対して性能がロバストなことが多い ▪ 結果やモデルの解釈、解析の手法が多い ▪ Conditionalな演算の恩恵により、計算量が少ない GBDTを使用するメリット
  39. 39. 39 ▪ 特異な帰納的バイアス(inductive bias)を持つ ▪ モデルが置いているデータに対する仮定は、MLPなどとは大きく異なる ▪ それにより、データによっては大きく性能が出ることがある。表形式データなどでは顕著 GBDTを使用するメリット[1] http://www.mit.edu/~hazimeh/publication/tel/ https://www.cs.auckland.ac.nz/~pat/706_98/ln/node84.html
  40. 40. 40 ▪ 欠損値を扱いやすい ▪ 分岐を決定する際、欠損値を右に入れるか左に入れるか両方試せる ▪ 良かった方を”default direction”として、欠損値はそちらに流れるようにする GBDTを使用するメリット[2] https://www.kdd.org/kdd2016/papers/files/rfp0697-chenAemb.pdf
  41. 41. 41 ▪ 入力のスケーリングが不要 ▪ 決定木が分岐さえできれば良いので、特徴量の大小順さえ合っていれば何でも良い ▪ 一方、線形演算が含まれるモデルでは、スケーリングはかなり重要 ▪ 正規化のみでなく、対数スケーリングや、モデルのパラメータのスケールとの兼ね合いなども GBDTを使用するメリット[3] https://www.jeremyjordan.me/batch-normalization/
  42. 42. 42 ▪ ハイパーパラメータの変化に対して性能がロバストなことが多い GBDTを使用するメリット[4] XGBoost MLP ばらつき ~ 0.008 ばらつき ~ 0.040
  43. 43. 43 ▪ 結果やモデルの解釈、解析の手法が多い ▪ 学習により得られたモデルの特性の解析 ▪ SHAPなど、木構造を生かしたモデル解析もできる ▪ 分岐に使われた回数を数えたりするのも直感的 ▪ 複数の木を近似して一本にまとめる ▪ どのような判断根拠に基づいているのかがわかりやすい GBDTを使用するメリット[5] https://www.stat.berkeley.edu/~breiman/BAtrees.pdf http://proceedings.mlr.press/v84/hara18a.html (AISTATS 2018) など 木をパースして、特徴ごとに推論結果をどのように動かしたのか計算
  44. 44. 44 ▪ Conditionalな演算の恩恵により、計算量が少ない ▪ サンプル単位で推論に要する計算量は、O(depth*n_tree) ▪ モデル全体を使ってひとつのサンプルを推論しているわけではない GBDTを使用するメリット[6]
  45. 45. 45 ▪ 微分不可能な処理を含んでいることは、様々な自由度を奪っている ▪ 例えば、E2Eで特徴量を自ら作成するような機構はない ▪ 「探索」がアルゴリズムの根本にはあるため ▪ 画像や波形などに特化したNNと一緒にE2Eシステムへ組み込むことは難しい ▪ モデルの逐次更新なども行いにくい GBDTを使用するデメリット http://karpathy.github.io/2014/07/03/feature-learning-escapades/
  46. 46. 46 02 機能拡張 ・ 微分可能なモデルへの緩和 ・ 解釈性の付与 ・ 不確実性の推定 ・ 高速性の追求 ・ 決定木に限らない、様々な勾配ブースティング
  47. 47. 47 決定木っぽい微分可能なモデルを作れないか? (GBDT目線で) 解決したい点 • E2Eシステムとの親和性 (特徴量、ルール作成) • モデル更新がやりにくい、 global refinementしにくい (GBDT目線で) 引き継ぎたいもの • Conditionalな演算 • 少ない計算量 • 階層的なデータ分割による解釈性 • 学習しながらモデルの構造が決まる仕組み
  48. 48. 48 [1] 入力にフィルタをかける [2] フィルタ後の特徴量にバイアスをかけ [3] Sigmoid的な関数に通し、左右に分配される割合を算出 [4] その割合を葉の値に掛け合わせ足し合わせたものを出力とする 微分可能な決定木の例 Input: x Leaf value: rl Inner Node filter: w bias: b Leaf value: rr σ(wx + b)1 - σ(wx + b) Output [1 - σ(wx + b)]*rl + [σ(wx + b)]*rr *学習パラメータ: w, b, r https://arxiv.org/abs/1711.09784など
  49. 49. 49 [1] 入力にフィルタをかける [2] フィルタ後の特徴量にバイアスをかける [3] Sigmoid的な関数に通し、左右に分配される割合を算出 [4] その割合を葉の値に掛け合わせ足し合わせたものを出力とする 微分可能な決定木の例 Input: x Leaf value: rl Inner Node filter: w bias: b Leaf value: rr σ(wx + b)1 - σ(wx + b) Output [1 - σ(wx + b)]*rl + [σ(wx + b)]*rr *学習パラメータ: w, b, r 特徴選択 https://arxiv.org/abs/1711.09784など
  50. 50. 50 [1] 入力にフィルタをかける [2] フィルタ後の特徴量にバイアスをかける [3] Sigmoid的な関数に通し、左右に分配される割合を算出 [4] その割合を葉の値に掛け合わせ足し合わせたものを出力とする 微分可能な決定木の例 Input: x Leaf value: rl Inner Node filter: w bias: b Leaf value: rr σ(wx + b)1 - σ(wx + b) Output [1 - σ(wx + b)]*rl + [σ(wx + b)]*rr *学習パラメータ: w, b, r 分岐点の探索 https://arxiv.org/abs/1711.09784など
  51. 51. 51 [1] 入力にフィルタをかける [2] フィルタ後の特徴量にバイアスをかける [3] Sigmoid的な関数に通し、左右に分配される割合を算出 [4] その割合を葉の値に掛け合わせ足し合わせたものを出力とする 微分可能な決定木の例 Input: x Leaf value: rl Inner Node filter: w bias: b Leaf value: rr σ(wx + b)1 - σ(wx + b) Output [1 - σ(wx + b)]*rl + [σ(wx + b)]*rr *学習パラメータ: w, b, r データ分割 https://arxiv.org/abs/1711.09784など
  52. 52. 52 [1] 入力にフィルタをかける [2] フィルタ後の特徴量にバイアスをかける [3] Sigmoid的な関数に通し、左右に分配される割合を算出 [4] その割合を葉の値に掛け合わせ足し合わせたものを出力とする 微分可能な決定木の例 Input: x Leaf value: rl Inner Node filter: w bias: b Leaf value: rr σ(wx + b)1 - σ(wx + b) Output [1 - σ(wx + b)]*rl + [σ(wx + b)]*rr *学習パラメータ: w, b, r 葉に入る予測値の算出 https://arxiv.org/abs/1711.09784など
  53. 53. 53 ▪ 木の構造そのものを学習させながら決めていってもよい ▪ 特徴量の変換を行うか、分岐を行うか、、など 構造の学習 https://arxiv.org/abs/1807.06699 (ICML2019)
  54. 54. 54 学習済みモデルの例 https://icml.cc/media/Slides/icml/2019/grandball(12-16-00)-12-16-20-4490-adaptive_neural.pdf
  55. 55. 55 学習済みモデルの例 https://arxiv.org/abs/1711.09784 (CEX2017)
  56. 56. 56 ▪ 分岐はスパース(どちらかの枝に100%入るよう)にしたい ▪ 左右分配の割合を決める際に使用するsigmoidを0, 1を厳密にとるようなものに修正 ▪ 学習が進むにつれ分岐がスパースになっていき、好ましい状況が得られる 処理量の削減 (Conditionalな演算) 0.90.1 0.4 0.60.7 0.3 0.9 0.1 0.5 0.50.2 0.8 0.5 0.5 1.00.0 1.0 0.0 1.0 0.0 https://arxiv.org/abs/2002.07772 (ICML2020) γ
  57. 57. 57 ▪ Conditionalな演算は、様々な応用先で重要なコンポーネント ▪ 大きな表現力と処理量とのトレードオフを考える際のアプローチのひとつ ▪ 例えば、最近話題になった6000億パラメータの言語モデルの重要な技術要素 ▪ https://arxiv.org/abs/2006.16668 (2020, preprint) 処理量の削減 (Conditionalな演算, 少し余談) https://arxiv.org/abs/1701.06538 (ICLR2017)
  58. 58. 58 ▪ 分岐のルールを深さごとに同一のものとする(CatBoostを踏襲) ▪ スパースにせずとも、分岐判定の回数を分岐数(2d)から木の深さ(d)まで落とせる 処理量の削減 (分岐のルールを共通化する) 同じルール 同じルール https://arxiv.org/abs/1909.06312 (ICLR2020)
  59. 59. 59 ▪ 特徴を選ぶフィルタ(w)も、スパースな特性を持つ関数に通す ▪ 数個の特徴量のみが分岐に考慮されるようにする (帰納的バイアスとしても働く) 処理量の削減 (分岐判定に使われる特徴量を減らす) https://arxiv.org/abs/1909.06312 (ICLR2020)
  60. 60. 60 ▪ 並べて平均をとっても良いし、Skip-connectionを入れても良い ▪ 前段の木の出力を次の木の入力に加えても良い アンサンブル学習 https://arxiv.org/abs/1909.06312 (ICLR2020)
  61. 61. 61 性能 ・ 特異な帰納的バイアスを持ち、E2Eの機構に組み込め、オンライン更新も容易なので、幾らか価値はありそう ・ (一概な比較は難しいが)同等の性能をもつDense-layerと比較すると、パラメータ数も減るという報告も
  62. 62. 62 ▪ 色々なものが使えるようになってきつつある ▪ Tree Ensemble layer ▪ https://github.com/google-research/google-research/tree/master/tf_trees ▪ NODE (Neural Oblivious Decision Ensembles) ▪ https://github.com/Qwicen/node ▪ TabNet ▪ https://github.com/google-research/google-research/tree/master/tabnet ▪ https://github.com/dreamquark-ai/tabnet ▪ など。他にも多数 実装
  63. 63. 63 ▪ 一度学習させた木モデルの情報を、微分可能なモデルに蒸留 ▪ 出力値のみでなく、例えば決定木の構造や使用した特徴量の情報などもうまく伝える ▪ DeepGBM(LightGBMの開発者が発表して一瞬話題になった)と呼ばれる手法はこれに該当 ▪ https://dl.acm.org/doi/10.1145/3292500.3330858 (KDD2019) 他のアプローチ
  64. 64. 64 02 機能拡張 ・ 微分可能なモデルへの緩和 ・ 解釈性の付与 ・ 不確実性の推定 ・ 高速性の追求 ・ 決定木に限らない、様々な勾配ブースティング
  65. 65. 65 ▪ 以下では、決定木の構造を活かした大きく2つのテーマを扱う ▪ 重要な特徴量の提示 ▪ 複数の決定木を意味合いの理解しやすい別の形で表現する 解釈性
  66. 66. 66 ▪ 以下では、決定木の構造を活かした大きく2つのテーマを扱う ▪ 重要な特徴量の提示 ▪ 複数の決定木を意味合いの理解しやすい別の形で表現する 解釈性
  67. 67. 67 ▪ Gain ▪ 分岐による目的関数の減少度合いをモデル全体で特徴ごとに集計する ▪ Split count ▪ 分岐に使用された回数をモデル全体で特徴ごとに数えあげる ▪ Permutation ▪ 対象の特徴量をシャッフルした上で推論し、それらの出力の差を尺度とする 特徴量重要度(モデルごとに定義されるもの) https://www.kaggle.com/ruruamour /permutation-importance
  68. 68. 68 ▪ MSE(モデルなし): ▪ (80-20)2+(0-20)2+(0-20)2+(0-20)2 = 4800 ▪ MSE(Feverを使用): ▪ (80-40)2+(0-40)2+(0-0)2+(0-0)2 = 3200 ▪ MSE(FeverとCoughを使用): ▪ (80-80)2+(0-0)2+(0-0)2+(0-0)2 = 0 Gainの計算例 データは全ての葉に均等に割り当てられているとする *左下の0/0の分岐は、小さなターゲットが丸められているとする Gain(Fever): 4800 - 3200 = 1600 Gain(Cough): 3200 - 0 = 3200
  69. 69. 69 ▪ MSE(モデルなし): ▪ (90-25)2+(10-25)2+(0-25)2+(0-25)2 = 5700 ▪ MSE(Coughを使用): ▪ (90-50)2+(10-50)2+(0-0)2+(0-0)2 = 3200 ▪ MSE(FeverとCoughを使用): ▪ (80-80)2+(0-0)2+(0-0)2+(0-0)2 = 0 Gainの計算例 データは全ての葉に均等に割り当てられているとする *左下の0/0の分岐は、小さなターゲットが丸められているとする Gain(Fever): 3200 - 0 = 3200 Gain(Cough): 5700 - 3200 = 2500
  70. 70. 70 ▪ 冷静に木を眺めてみると、通るpathによって重要な特徴は変わるように思う ▪ モデル全体ではなく、サンプル単位で定義可能な重要度の指標を作りたい GlobalとLocal
  71. 71. 71 ▪ Saabas ▪ 分岐に使われた特徴ごとに、出力がどのように変わったかを集計 ▪ 例えば右図におけるF=Y, C=Yのサンプルに着目すると、 ▪ Cにより出力は25から50に変化 (Saabas[C] = 25) ▪ Fにより出力は50から90に変化 (Saabas[F] = 40) 特徴量重要度(サンプルごとに定義されるもの)
  72. 72. 72 ▪ LIME ▪ 説明したいデータの周辺からデータをサンプリングし、分類機を近似する局所的なモデルを作成 ▪ 例えば局所的なモデルを線形モデルとし、その係数より重要度を判断する 特徴量重要度(サンプルごとに定義されるもの) https://www.kdd.org/kdd2016/papers/files/rfp0573-ribeiroA.pdf (KDD2016)
  73. 73. 73 ▪ SHAP ▪ 協力ゲーム理論におけるシャープレイ値を特徴量ごとに算出 ▪ 決定木の構造と非常に相性が良く、GBDTモデルに対してよく使われる ▪ 次ページより詳細に深掘り 特徴量重要度(サンプルごとに定義されるもの) https://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions (NIPS2017)
  74. 74. 74 ▪ 上図のようにA,B,C社が合併した際に、会社ごとの寄与度を計算する方法の一つ ▪ どの会社目線に立つかによって、言い分が変わってしまうことがある ▪ AにBCが上乗せされたのか、はたまたABにCが上乗せされたのか… そもそもシャープレイ値とは? 現在の各社の利益 A社 5億円 B社 40億円 C社 55億円 2社合併時の利益 AB社 55億円 BC社 100億円 CA社 65億円 3社合併時の利益 ABC社 120億円
  75. 75. 75 ▪ 取りうる場合を全て列挙し、それらの貢献度の平均をとる そもそもシャープレイ値とは? 合併順 A社の貢献 B社の貢献 C社の貢献 合計 A→B→C 5億円 50億円 65億円 120億円 A→C→B 5億円 55億円 60億円 120億円 B→A→C 15億円 40億円 65億円 120億円 B→C→A 20億円 40億円 60億円 120億円 C→A→B 10億円 55億円 55億円 120億円 C→B→A 20億円 45億円 55億円 120億円 平均(シャープレイ値) 12.5億円 47.5億円 60億円 シャープレイ値の総和は、ABC社の資産と必ず一致する
  76. 76. 76 ▪ 先ほどの例において、このように置き換えて考えてみる ▪ 各会社 ↔︎ モデルに入力される特徴量 ▪ 合計金額 ↔︎ モデルの出力 ▪ これができると、各特徴量が予測値をどう動かしたのかがサンプルごとにわかる シャープレイ値を機械学習モデルでどのように考えるか
  77. 77. 77 ▪ 特徴量が2つの場合を考える 具体的な計算方法 Feature Combinations {} {F} {C} {F, C} Sample (Fever=Yes, Cough=Yes)
  78. 78. 78 ▪ 全ての特徴量を考慮した場合は、そのまま葉の値が入る 具体的な計算方法 Feature Combinations {} {F} {C} {F, C} Sample (Fever=Yes, Cough=Yes) 90
  79. 79. 79 ▪ 特徴量を全て考慮しない場合は、全ての葉の平均値となる 具体的な計算方法 Feature Combinations {} {F} {C} {F, C} Sample (Fever=Yes, Cough=Yes) 25 90
  80. 80. 80 ▪ 特徴量が1つの場合も、同様の手順で考えていく ▪ 図はCoughのみ考慮 具体的な計算方法 Feature Combinations {} {F} {C} {F, C} Sample (Fever=Yes, Cough=Yes) 25 50 90
  81. 81. 81 ▪ 特徴量が1つの場合も、同様の手順で考えていく ▪ 図はFeverのみ考慮 具体的な計算方法 Feature Combinations {} {F} {C} {F, C} Sample (Fever=Yes, Cough=Yes) 25 45 50 90
  82. 82. 82 具体的な計算方法 Feature Combinations {} {F} {C} {F, C} Sample (Fever=Yes, Cough=Yes) 25 45 50 90 90 (=f(x))0 25 55 Fの影響 Cの影響
  83. 83. 83 ▪ 工夫すれば、計算をかなり削減できる ▪ 決定木をなぞっていった途中までの計算結果を保存しておけば、別の計算で応用が可能 ▪ 木構造ゆえの恩恵 ▪ 愚直にやるとO(T*L*2M)だが、O(T*L*D2)まで落とせる ▪ 指数オーダーだったものが指数オーダーでなくなっているので、かなり大きい ▪ 詳細:https://arxiv.org/abs/1802.03888 (ICML2017-WS) 高速化 T: 木の本数、L: 葉の個数、M: 特徴数 D: 木の深さ
  84. 84. 84 ▪ SHAPは、学習に使用していないデータに対しても計算できる ▪ 例えば分類問題で、特徴量ごとに正解に近づけるように予測値を動かしたかどうかを確認できる ▪ 逆方向に動かしているのであれば、その特徴量が悪さをしているということがわかる ▪ この情報は、metricのみを監視していても得ることは不可能な貴重なもの 応用: モデルの精度劣化の原因特定 とある特徴量のSHAP-loss (下に行くほど、性能の向上に貢献) https://www.nature.com/articles/s42256-019-0138-9 (Nature Machine Intelligence, 2020) 訓練期間 この特徴量のデータの特性が変わったことがわかる
  85. 85. 85 ▪ 差分を考える特徴量を工夫すれば、相互作用成分のみを抽出できる 相互作用の分解 *)
  86. 86. 86 SHAPの実装 ▪ https://github.com/slundberg/shapをpipで入れて使うことが多い ▪ 描画のメソッドも多く、使いやすい ▪ XGBoost, LightGBM, CatBoostなど、多くのモデルに対応 ▪ これらをラップしたライブラリも多数。(https://github.com/interpretml/interpretなど)
  87. 87. 87 ▪ Force plot SHAPの描画例
  88. 88. 88 ▪ Decision plot SHAPの描画例 一本の線がひとつの推論対象のサンプル
  89. 89. 89 ▪ Summary plot SHAPの描画例 モデル単位の特徴量重要度が小さかったとしても、 出力に大きな影響を大きい場合があることを知れる
  90. 90. 90 ▪ Summary plot SHAPの描画例
  91. 91. 91 ▪ Dependence plot SHAPの描画例
  92. 92. 92 ▪ 以下では、決定木の構造を活かした大きく2つのテーマを扱う ▪ 重要な特徴量の提示 ▪ 複数の決定木を意味合いの理解しやすい別の形で表現する 解釈性 (再掲)
  93. 93. 93 複数の決定木を一本の決定木に変換(近似) 論文:https://arxiv.org/abs/2003.11132 (ICML2020)など 実装:https://github.com/vidalt/BA-Trees
  94. 94. 94 決定木を多項式で表現 https://papers.nips.cc/paper/9530-monoforest-framework-for-tree-ensemble-analysis (NeurIPS2019)
  95. 95. 95 決定木を多項式で表現 https://papers.nips.cc/paper/9530-monoforest-framework-for-tree-ensemble-analysis (NeurIPS2019) *CatBoostでは実装されており、すぐ使える https://github.com/catboost/tutorials/blob/master/ model_analysis/monoforest_tutorial.ipynb CatBoost
  96. 96. 96 02 機能拡張 ・ 微分可能なモデルへの緩和 ・ 解釈性の付与 ・ 不確実性の推定 ・ 高速性の追求 ・ 決定木に限らない、様々な勾配ブースティング
  97. 97. 97 ▪ 不確実性まで含めてわかると、実アプリケーションの幅が広がる 不確実性を含んだ回帰予測 https://stanfordmlgroup.github.io/projects/ngboost/
  98. 98. 98 ▪ 一言に不確実性といっても、様々な意味合いのものがある ▪ Aleatoric uncertainty: データ起因の不確実性 ▪ 事象そのものを、入力データがどれだけ説明できるかに紐づく不確実さ ▪ 学習データが増えても改善しない (コイン投げの結果の不確実性をイメージするとわかりやすい) ▪ 有効な特徴量が追加できれば減少しうる ▪ Epistemic uncertainty: モデル起因の不確実性 ▪ 訓練データに含まれないデータに対する不確実さ。観測したデータが少ない場合などには顕著 不確実性の分解
  99. 99. 99 Segmentationにおける不確実性の分解例 https://arxiv.org/abs/1703.04977 (NeurIPS2017) 学習データにあまりないような例の場合には Epistemic Uncertaintyが大きい エッジ付近(そもそもわかりづらい)は Aleatoric Uncertaintyが大きい
  100. 100. 100 ▪ Quantile regressionなどで、ある程度見積もることはできる ▪ 連続的な分布を見ることは厳しいが、複数回推論すれば大体の見積もりはできる ▪ 目的関数が変わるだけなので、GBDTライブラリには標準で実装されていることが多い Aleatoric Uncertainty https://lightgbm.readthedocs.io/en/latest/Parameters.html
  101. 101. 101 ▪ データの持つパラメトリックな分布の予測により推定 Aleatoric Uncertainty https://arxiv.org/abs/1612.01474 (NIPS2017)
  102. 102. 102 > データの持つパラメトリックな分布の予測により推定 ▪ 同様のことは、勾配ブースティングで行うこともできる ▪ NGBoost(https://arxiv.org/abs/1910.03225, ICML2020)が最近少し話題になった Aleatoric Uncertainty
  103. 103. 103 ▪ 分布パラメータを出力する学習は、普通にやってもうまく行かないことがある ▪ 自然勾配法を用いて残差を更新することがクリティカルであることが最近わかってきた ▪ スケールの違いのせいで、いくつかのパラメータのみが過剰に最適化されるような現象が抑制される ▪ 誤差更新幅のline-searchなど、細かい様々なテクニックも同時に導入 Aleatoric Uncertainty 通常の勾配法 自然勾配法 https://arxiv.org/abs/1910.03225, (ICML2020)
  104. 104. 104 ▪ 分布は必ずしも正規分布である必要はなく、任意に選べる ▪ LSS(location, scale, shape)を考慮したXGBoostLSSというライブラリが別途あったりもする ▪ https://github.com/StatMixedML/XGBoostLSS Aleatoric Uncertainty https://github.com/stanfordmlgroup/ngboost/tree/master/ngboost/distns
  105. 105. 105 ▪ 分散に対してのSHAP(特徴重要度の指標)を見たりするのは、有益なことがある ▪ 「どういったときの予測に自信がなくなるのか」が、ある程度わかる Aleatoric UncertaintyとSHAP 平均 分散 https://github.com/stanfordmlgroup/ngboost/blob/master/examples/model_interpretation/SHAP_plots.ipynb
  106. 106. 106 ▪ SHAP(mean) vs SHAP(var)、色は特徴量の値 Aleatoric UncertaintyとSHAP
  107. 107. 107 ▪ 原理的には、モデルのパラメータの分布を考える必要がある Epistemic Uncertainty https://arxiv.org/abs/1505.05424 (ICML2015)
  108. 108. 108 > 原理的には、モデルのパラメータの分布を計算する必要がある ▪ 従来の枠組みが使いやすいよう、様々な近似手法がとられる ▪ 例えば、Dropoutを使ったまま複数回推論を行い推論結果をサンプリングするMC-Dropout Epistemic Uncertainty https://arxiv.org/abs/1506.02142 (ICML2016)
  109. 109. 109 ▪ Epistemic Uncertaintyを測るためにサンプリングを行うのはスケールしにくい ▪ 大量にモデルを持ったり何度も推論を行うのは大変 ▪ もともと勾配ブースティングはアンサンブル学習なので、弱学習器の出力を賢くサンプリングできるはず ▪ ノイズを残差に加えながら学習させていき、k番目ずつの弱学習器の出力をアンサンブルさせるなど Boostingの特性の活用 https://arxiv.org/abs/2001.07248 (2020, preprint) https://arxiv.org/abs/2006.10562 (2020, preprint)regularization Stochastic Gradient Langevin Boosting (SGLB) サンプリングを避ける例: https://arxiv.org/abs/1908.00598 (ICCV2019)
  110. 110. 110 ▪ ひとつの勾配ブースティングのモデルで、複数の不確実性を分解しながら予測 Boostingの特性の活用 *データ数は中心ほど多く、両端ほど少なくなっていく設定 データの分散が両端ほど大きく データの分散が両端ほど小さく (*Aleatoric) (*Aleatoric) (*Epistemic) (*Epistemic) SGLBのk番目ずつの木の出力を用いた不確実性の分解 (最近Yandexのチームが頑張っているので、そのうちCatBoostに入るかも?)
  111. 111. 111 02 機能拡張 ・ 微分可能なモデルへの緩和 ・ 解釈性の付与 ・ 不確実性の推定 ・ 高速性の追求 ・ 決定木に限らない、様々な勾配ブースティング
  112. 112. 112 ▪ 決定木をTensor演算しやすいような表現に焼き直す ▪ 複数データをバッチ推論する際に並列化の恩恵を受けやすい ▪ モデルはpytorchなどのモデルに変換でき、エッジデバイスに最適化しやすい モデル変換 https://github.com/microsoft/hummingbird
  113. 113. 113 ▪ 様々な変換戦略 モデル変換 https://adalabucsd.github.io/papers/TR_2019_Hummingbird.pdf (NeurIPS2019-WS)
  114. 114. 114 ▪ 様々な変換戦略 モデル変換 https://adalabucsd.github.io/papers/TR_2019_Hummingbird.pdf (NeurIPS2019-WS)
  115. 115. 115 ▪ 様々な変換戦略 モデル変換 https://adalabucsd.github.io/papers/TR_2019_Hummingbird.pdf (NeurIPS2019-WS)
  116. 116. 116 ▪ 一般的な木を、symmetric treeの集合に変換 ▪ 決定木の多項式表現の応用 Symmetric tree構造へ無理やり焼き直す https://papers.nips.cc/paper/9530-monoforest-framework-for-tree-ensemble-analysis (NeurIPS2019)
  117. 117. 117 ▪ データの通る平均的なpathを短くするためのコスト項を追加 ▪ 並列処理などは考えられていないが、こちらが嬉しいようなユースケースもある 訓練時に推論速度を考慮した正則化項を追加 https://papers.nips.cc/paper/6753-cost- efficient-gradient-boosting.pdf (NIPS2017) LightGBM *学習時のオプションを指定すれば使える
  118. 118. 118 ▪ 場合によっては、GBDTのコアより特徴作成処理がボトルネックになることも ▪ GPUで高速に動く様々な処理基盤も開発されてきている ▪ cuDF (https://github.com/rapidsai/cudf) ▪ GPUで高速化されたpandasのようなもの ▪ xfeat (https://github.com/pfnet-research/xfeat) ▪ 典型的な特徴量エンジニアリングをGPUを使いながら高速に行うライブラリ ▪ cuDFなどを内部では使用している 前処理の高速化
  119. 119. 119 02 機能拡張 ・ 微分可能なモデルへの緩和 ・ 解釈性の付与 ・ 不確実性の推定 ・ 高速性の追求 ・ 決定木に限らない、様々な勾配ブースティング
  120. 120. 120 ▪ 木構造の持つメリットは享受できなくなるが、これが嬉しい場合もある ▪ 例えば、画像を入力としたい場合など ニューラルネットワークを用いた勾配ブースティング https://arxiv.org/abs/2002.07971 (2020, preprint)
  121. 121. 121 ▪ NNのモデル複数持つのはきつくない? ▪ 演算精度とモデル個数のトレードオフを考えると嬉しい場合も ▪ Binary Ensemble Neural Network: More Bits per Network or More Networks per Bit? ニューラルネットワークを用いた勾配ブースティング https://arxiv.org/abs/1806.07550 (CVPR2019)
  122. 122. 122 ▪ 葉に入る予測値を定数でなく線形モデルで決める ▪ piecewise-linear tree ▪ 発想自体は新しくはないが、この仕様に適した高速なアルゴリズムが考えられてきている ▪ 詳細:https://arxiv.org/abs/1802.05640 (IJCAI2019) ▪ 実装:https://github.com/GBDT-PL/GBDT-PL 決定木の葉に入る予測値の拡張
  123. 123. 123 ▪ Neural NetworkとTreeを一緒に組み合わせる ▪ 決定木に向けた特徴量エンジニアリングをNNが学習中に行うイメージ 複数の弱学習器の組み合わせ 論文:https://www.ijcai.org/Proceedings/2019/493 (IJCAI2019) 実装:https://github.com/ptannor/augboost
  124. 124. 124 ▪ カーネルリッジ回帰とTreeを一緒に組み合わせる ▪ 特性の異なる弱学習器を両方試して、良い弱学習器を使うようにする 複数の弱学習器の組み合わせ 論文: https://arxiv.org/abs/1902.03999 (2019, preprint) 実装: https://github.com/fabsig/KTBoost
  125. 125. 125 ▪ 弱学習器の組み合わせかたは色々考えられる ▪ 並列させる ▪ どちらかの予測値をもう片方に入れる…など 複数の弱学習器の組み合わせ https://dl.acm.org/doi/10.1145/3292500.3330676 (KDD2019)
  126. 126. 126 ▪ ResNetと勾配ブースティングの関係や類似性に関して、幾つかの研究がある ▪ 予測値ではなく中間表現がアンサンブルされていると言う点には差分があるので注意 ResNetと勾配ブースティング https://arxiv.org/abs/1605.06431 (NIPS2016)
  127. 127. 127 ▪ ResNetのアンサンブル学習っぽさ ▪ 学習済みモデルの層を入れ替えたり削除したりしても、性能が大きくは変わらない ▪ 一方、同様の実験をVGGなどで行うと、すぐに性能は崩壊する ResNetと勾配ブースティング
  128. 128. 128 ▪ ResBlockを一層学習させてからパラメータをフリーズして新たに層を追加… ▪ 関数空間での勾配法(~=勾配ブースティング) ▪ 何が嬉しいの? ▪ ResNet全層を一気に更新するよりも計算効率が良い ▪ 学習が安定する ▪ 前もってモデルの構造を決める必要がない(学習しながら決まる) ▪ 新しい層を作成する際、構造をある程度任意に選択できる ▪ 例えば複数の構造を試し、最も良いモデルを選んだりもできる ▪ 理論解析 (https://arxiv.org/abs/1706.04964, https://arxiv.org/abs/1802.09031...) ひとつのモデルの形を変えていく形式での勾配ブースティング
  129. 129. 129 03 実応用の際に注意する点やテクニック ・ 特徴量エンジニアリング、Target Leakage、評価の汚染
  130. 130. 130 ▪ GBDTは、例えば特徴量の間の線形演算をモデルが表現できない ▪ 決定木が弱学習器である故 ▪ モデルが抽出しにくい特徴を開発者が作成することは、とても重要 ▪ 表形式データを用いたKaggleなどのコンペティションで性能に差がつく要素の大部分はここ ▪ 特徴量を学習する機能はGBDTには無いので尚更 特徴量エンジニアリング
  131. 131. 131 ▪ その気になれば、幾つでも特徴量は作れてしまう ▪ 四則演算、次元削減、特徴量間の相互作用… ▪ 典型的な特徴量に関しては、自動で大量に作ってくれるようなライブラリも多数 ▪ https://github.com/FeatureLabs/featuretoolsなど ▪ 適当に全部突っ込んでしまっては、subsampleされる特徴がゴミばかりにることも ▪ 学習がうまく進まない ▪ 訓練や推論に時間もかかる 特徴量エンジニアリング 適切な特徴量選択は重要
  132. 132. 132 ▪ 似た特徴量を省く ▪ 例えばGBDTの場合、順位相関が1の特徴量があれば、それらは完全に冗長 ▪ 特徴量重要度の小さいものを省く ▪ Gain, SHAP, Permutation importanceなどを指標とする ▪ 注意が必要なのは、「特徴重要度が高い=精度に貢献している」ではないということ ▪ 例えばTarget Leakageを起こしていたりしても、特徴量重要度は高い ▪ あくまで訓練時にどの程度使われたかの情報なので、汎化に貢献している保証はない いかに特徴量を選択するか?
  133. 133. 133 ▪ 推論対象のデータと分布が大きく違うものを省く ▪ Adversarial Validationという手法が使われたりすることも ▪ 「訓練データか推論対象データかを予測するモデル」を作り、重要度の高い特徴量を見つける ▪ 実際に訓練時に推論対象のデータが得られていることは少ないが、場合によっては使うこともできる いかに特徴量を選択するか? ID F1 F2 F3 F4 a 100 30 15 30 b 30 60 5 50 訓練データ 評価データ ID F1 F2 F3 F4 c 20 55 30 15 d 40 15 25 65 ID F1 F2 F3 F4 Target a 100 30 15 30 1 b 30 60 5 50 1 c 20 55 30 15 0 d 40 15 25 65 0
  134. 134. 134 ▪ 不用意な特徴量エンジニアリングをしてしまうと、 ▪ Target Leakageによりモデルの汎化性能が崩壊 ▪ 評価が汚染される ▪ などと、致命的な問題を引き起こすことがある 実応用の際に注意する点やテクニック 推論時には本来は得られない情報を学習に使わないよう、強く心がけることが重要
  135. 135. 135 Leakの例:カテゴリ変数のTarget Encoding
  136. 136. 136 Leakの例:カテゴリ変数のTarget Encoding
  137. 137. 137 Leakの例:カテゴリ変数のTarget Encoding
  138. 138. 138 Leakの例:カテゴリ変数のTarget Encoding
  139. 139. 139 Leakの例:カテゴリ変数のTarget Encoding
  140. 140. 140 Leakの例:カテゴリ変数のTarget Encoding
  141. 141. 141 Leakの例:カテゴリ変数のTarget Encoding
  142. 142. 142 ▪ とあるカテゴリに属するレコードが少数しか存在しなかったら? ▪ エンコードされた特徴が、予測値をほぼそのまま出力してしまう ▪ 推論時はTrainデータで得られたエンコーダを用いてカテゴリ変数を変換するので、圧倒的に状況が違う ▪ カテゴリの粒度が細かい場合には、このような状況は容易に起こりうる Leakの例:カテゴリ変数のTarget Encoding Target Feature A 1 1.00 B 0 0.00 C 1 1.00
  143. 143. 143 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  144. 144. 144 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  145. 145. 145 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  146. 146. 146 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  147. 147. 147 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  148. 148. 148 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  149. 149. 149 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  150. 150. 150 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  151. 151. 151 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  152. 152. 152 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  153. 153. 153 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  154. 154. 154 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  155. 155. 155 ▪ エンコード対象のデータを使用せずに平均を算出 Leave one outにすれば大丈夫・・・?
  156. 156. 156 Leave one outにすれば大丈夫・・・? Target Feature A 1 0.00 A 0 1.00 B 1 0.00 B 0 0.50 B 0 0.50 C 1 0.50 C 0 1.00 C 1 0.50 ▪ とあるカテゴリに属するレコードが少数しか存在しなかったら? ▪ エンコードされた特徴が、予測値を反転させて出力してしまう。これも一種のTarget Leakage ▪ この手の問題を、CatBoostのOrderedTSは木ごとにエンコードされる値をうまく変えることで避けている
  157. 157. 157 Ordered-TSと各種Target Encodingの比較 logloss / zero-one loss 素のTarget EncodingがLeakの影響をもろに受けているのもわかる
  158. 158. 158 ▪ Ordered TSは、訓練データのランダムソートに含む ▪ 例えば、学習データが時系列に沿って生成されるような場合 ▪ 未来の学習データで過去を予測したり情報を変換したりするような状況が起こり得てしまう ▪ 現実ではできないこと。まずそう… ▪ 実はCatBoostはソートに関して外部パラメータがあり、そのような状況を避けることもできる 問題提起:Ordered TSは気軽にやっていいのか? https://catboost.ai/docs/concepts/python-reference_parameters-list.html
  159. 159. 159 ▪ Target Leakageが訓練に問題を引き起こす様子を見てきた ▪ CatBoostの開発は、この着眼点から大きくインスピレーションを受けている ▪ 一歩引いて考えてみる ▪ Target Leakageに近い現象は、いたるところで起こりうる ▪ 例えば、評価データを見ながらハイパーパラメータを決めるのは、深刻なLeakageと言える ▪ しかし、この手の過ちをしてしまうと評価データでの性能も高く出てしまうので、ミスに気づけない 評価データで測ることのできるミスならば、まだありがたい 前節で述べてきた例のように、失敗が評価データで測ることのできるものは、まだありがたい 怖いのは、場合によっては評価すら汚染される危険があり、気づくこともできないかもしれないということ
  160. 160. 160 ▪ K-fold Cross Validation ▪ ランダムにデータを分割 様々なデータ分割の戦略 https://scikit-learn.org/stable/modules/cross_validation.html
  161. 161. 161 ▪ Stratified K-fold Cross Validation ▪ ラベルがfoldごとに偏らないように考慮して分割 様々なデータ分割の戦略 https://scikit-learn.org/stable/modules/cross_validation.html
  162. 162. 162 ▪ Group K-fold ▪ 同じグループに入れるべきでないデータをきちんと区別する ▪ 例えば、同一人物が訓練データにも評価データにも入らないようにするなど 様々なデータ分割の戦略 https://scikit-learn.org/stable/modules/cross_validation.html
  163. 163. 163 ▪ Time series split ▪ 評価データよりも未来のデータを用いて訓練させないようにする 様々なデータ分割の戦略 https://scikit-learn.org/stable/modules/cross_validation.html
  164. 164. 164 ▪ Nested cross validation ▪ パラメータ調整などを行うための評価データと性能を測るための評価データは別にする (重要) ▪ 訓練データの中でさらに分割を行う (=train-valid-test分割) 様々なデータ分割の戦略 https://stats.stackexchange.com/questi ons/453386/working-with-time-series- data-splitting-the-dataset-and-putting- the-model-into
  165. 165. 165 ▪ 適切なデータを分割をせずに評価してしまっている ▪ 時系列データに対してランダムに分割 ▪ 新しい人に対して推論したいようなサービスで、同一人物のデータがtrain/validに分かれている 評価の汚染例 (評価データがきちんとつくれていない) https://www.slideshare.net/YuriyGuts/target-leakage-in-machine-learning
  166. 166. 166 評価の汚染例 (評価データがきちんとつくれていない) v1 v3 https://twitter.com/andrewyng/status/931026446717296640
  167. 167. 167 ▪ Stackingにおけるデータ分割の不一致 ▪ 入力モデルを学習した際の学習/評価データが揃っていないと、評価が汚染される ▪ Meta-leanerのmetricとしては評価データでも高い性能が出ているように見えてしまう 評価の汚染例 (評価データがきちんとつくれていない) https://mlfromscratch.com/model-stacking-explained/#/
  168. 168. 168 ▪ 評価用データまで使用した施策 ▪ Train/Valid/Testの分割がされていない ▪ Testデータを見ながらハイパーパラメータを決める (例えばB-Boxを出すための閾値など) ▪ Valid, Testデータまで使用した特徴量作成 評価の汚染例 (訓練データ以外の情報を使ってしまう) https://arxiv.org/abs/2003.08505 (2020, preprint)
  169. 169. 169 ▪ しばしば、暗に提案手法が有利な設定で戦ってしまう ▪ 本来は、良いパラメータを見つけた時の性能のみでなく、 良いパラメータを見つけるまでの手間も評価に含めるべき 評価の汚染例 (訓練データ以外の情報を使ってしまう) https://arxiv.org/abs/1910.11758 (ICML2020)
  170. 170. 170 評価の汚染例 (訓練データ以外の情報を使ってしまう) https://arxiv.org/abs/2003.08505 (2020, preprint) ▪ 色々な評価の土台を揃えると、性能が実際には出ていない?
  171. 171. 171 04 まとめ
  172. 172. 172 ▪ GBDTは、世界で活躍する機械学習モデルのひとつ ▪ 決定木とアンサンブル学習、両者の強みがうまく噛み合っている ▪ 機能拡張も盛ん ▪ 微分可能なモデルへの緩和により、自由度と堅牢性の良いトレードオフが探求されている ▪ 解釈性なども、木構造の特性を生かしやすいところ ▪ 他にも色々 ▪ 実応用の際には、Target Leakageや評価の汚染には細心の注意を ▪ この観点は、おそらくどれだけ要素技術が進んでも消えない重要なもの まとめ
  173. 173. 173 EOF

×