Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

DSB2019振り返り会:あのにっくき QWK を閾値調整なしで攻略した(かった)

1,188 views

Published on

2020年2月29日に行われた Kaggle Data Science Bowl 2019 振り返り会 での発表資料です。

コンペの振り返りはそこそこに、LightGBM を順序ロジットモデルに拡張することで QWK の閾値問題を解決した(かった)話をしました。

Published in: Technology
  • Be the first to comment

DSB2019振り返り会:あのにっくき QWK を閾値調整なしで攻略した(かった)

  1. 1. あのにっくきQWKを 閾値調整なしで攻略した(かった) 俵(@tawatawara) Kaggle Data Science Bowl 2019 振り返り会 2020.2.29
  2. 2. 自己紹介 Background ◦ 計算機科学(学部), 社会情報学(修士) ◦ 某JTC(電気機器) R&D 勤務 ◦ MLは会社に入ってから(※最近仕事でMLしてない) 分析コンペ ◦ 2018年夏あたりから本格的に取り組む ◦ 半年ほど取り組めていなかったが最近復活 ◦ 思い出深いもの等 ◦ ◦ ◦ ◦ ◦ ◦ 最近の趣味: SPA (, ベンガル語). 特技:お祈り 台風(SIGNATE) 最下位 Human Protein Atras 22nd / 2172 iMet2019(壺) Lost Place ... 12th / 1839 阿修羅絵 227th / 3614 DSB2019 198th / 3497 2DSB2019 振り返り会
  3. 3. DSB2019 参加のモチベーション きっかけ:Kaggle Days Tokyo ◦ Day1: (WS) Feature engineering for events data ◦ Homework:「自前の data か開催中の DSB2019 に取り組んで下さい」 ◦ Day2: Onsite Competition by NIKKEI ◦ 記事の閲覧履歴からユーザごとの(集約)特徴を作って年齢を予測 ◦ メタデータの処理してただけで、メインデータは完全にチームメンバーに頼ってた 目標 ◦ 一から自分の力でログデータ(event data)に取り組む ◦ 自力で集約特徴を作ってモデルを学習 & submit ◦ あわよくば初の solo メダルを獲得 ◦ 阿修羅絵?知らない子ですね… 3DSB2019 振り返り会
  4. 4. 元々この場で振り返るつもりだった内容 反省点 ◦ groupby & agg 芸を楽しみ過ぎて調子に乗っていた ◦ test を増やしての commit はしていたが、見積もりが甘かった ◦ discussion も kernel もほぼ読んでいなかった(e.g. truncated CV) ◦ 1ヶ月前から start したくせに実質2週間になり、検証が不十分 ◦ RTA Japan 見てたら正月終わってた ◦ おみくじの結果が出るまでそわそわしてた 4DSB2019 振り返り会
  5. 5. 元々この場で振り返るつもりだった内容 ◦ Solution 概要 (public: 701st (0.522) → private: 198th (0.542)) ◦ モデル: LGBM の K-Fold averaging (ensemble は無し) ◦ データ: ◦ CVは Stratified Group K-Fold (5-Fold) ◦ test set の過去データもログから label を作って train に加える ◦ 特徴量(548個): 基本的なものかつ割と機械的. ◦ 過去の成績に関する特徴量 (直前のもの、全体の集約) ◦ セッション数, イベント数, 滞在時間 の集約 (by world, title, event_code, event_id) ◦ 最終版はもっと加えてるが死んだので… (ensemble についても同様) ◦ 閾値: scipy.optimize.basinhopping でデータ全体(train + 過去の test)で決定 ◦ Final sub の選択:CVも Public も何も信用できず自分を信じた. 5DSB2019 振り返り会 548
  6. 6. まえおき 閾値の決め方だけでメダルが取れるかどうかや色が変わった DSB2019 振り返り会 6 medal
  7. 7. まえおき Q. なぜ我々はDSB2019で閾値設定に苦しんだのか? A. (主に)回帰問題として解いていたから. Q. なぜ我々はマルチクラス分類を回帰問題として解いたのか? A. QWK が順序性を考慮した評価指標だから. DSB2019 振り返り会 7
  8. 8. まえおき Q. では、 A. は???(何言ってんやコイツ...) DSB2019 振り返り会 8 もし順序性を考慮した多クラス分類が出来れば?
  9. 9. 何故閾値問題が発生する? 9DSB2019 振り返り会 𝑦∗ : 回帰モデルの予測値、𝜅𝑗: クラスを決める閾値 現実(train全体(OOF)でQWKを最大化した場合) 0 1 2 30.5 1.5 2.5 𝜅0 𝜅1 𝜅2 クラス 0 クラス 1 クラス 2 クラス 3 𝑦∗ 理想 0 1 2 30.5 1.5 2.5 𝜅0 𝜅1 𝜅2 クラス 0 クラス 1 クラス 2 クラス 3 𝑦∗
  10. 10. 何故閾値問題が発生する? 回帰モデルの学習手法の基本は RMSE の最小化 ◦ 真の値から遠いほどペナルティがかかる → クラス間の順序性を考慮出来る ◦ 通常の分類モデルだとここがやりにくい(weight で頑張るとかもあり得るかも?) ◦ この後離散的なクラスに変換することは考慮されていない ◦ 閾値で範囲を切るといった情報は組み込まれていない ◦ (閾値で切るのを考えると、特定のクラスが密集するのは(RMSEは下がるが)あまり意味がないかも?) ◦ なんとか両方考慮出来ないか? 10DSB2019 振り返り会 RMSE = 1 𝑁 𝑖 𝑁 𝑦𝑖 ∗ − 𝑡𝑖 2 𝑦𝑖 ∗ : example 𝑖 に対する回帰モデルの予測値 𝑡𝑗 : example 𝑖 に対するラベル
  11. 11. おことわり DSB2019 振り返り会 11 ここからは詳しくない分野の内容を 調べてやってみたというものです そこら辺どうかご了承ください このため、言葉の定義等、不正確な内容を 含んでいる可能性があります
  12. 12. 順序選択モデル 計量経済学で用いられる、順序尺度のためのモデル ◦ 順序性はあるが離散的に扱われるものは色々ある ◦ 年収区分、不動産価格の区分 ◦ アンケート調査(リッカート尺度)のような曖昧なもの 考え方 ◦ 予測したいものは離散値 𝑦𝑖 ∈ 0, 1, 2, 3 ◦ 𝑦𝑖 に対応する潜在的な連続潜在変数 𝑦𝑖 ∗ を考え、閾値(𝜅𝑗)によって対応付ける DSB2019 振り返り会 12 𝑦𝑖 = 0 if − ∞ < 𝑦𝑖 ∗ ≤ 𝜅0 𝑦𝑖 = 1 if 𝜅0 ≤ 𝑦𝑖 ∗ ≤ 𝜅1 𝑦𝑖 = 2 if 𝜅1 ≤ 𝑦𝑖 ∗ ≤ 𝜅2 𝑦𝑖 = 3 if 𝜅2 ≤ 𝑦𝑖 ∗ < +∞ 「あれ?やってること一緒では???」 →次からが本題
  13. 13. 順序選択モデル 𝑦𝑖 が 𝑗 ∈ 0,1, … , 𝐽 となる確率を 𝑦𝑖 ∗ が区間に入る確率で表現 13DSB2019 振り返り会 𝑃 𝑦𝑖 = 𝑗 𝑥𝑖 = 𝑃 𝜅𝑗−1 ≤ 𝑦𝑖 ∗ ≤ 𝜅𝑗 = 𝑃 𝑦𝑖 ∗ ≤ 𝜅𝑗 − 𝑃 𝑦𝑖 ∗ ≤ 𝜅𝑗−1 𝑦∗ ≤ 𝜅2 の範囲 𝑦∗ ≤ 𝜅1 の範囲 0 1 2 30.5 1.5 2.5 𝜅0 𝜅1 𝜅2𝑦 = 0 の範囲 𝑦 = 1 の範囲 𝑦 = 2 の範囲 𝑦 = 3 の範囲 𝑦∗ 𝑦∗ ≤ 𝜅0 の範囲 𝑦𝑖 ∗ = 𝑓 𝑥𝑖 (ここで 𝑓 𝑥𝑖 は何らかの回帰モデル)
  14. 14. 順序選択モデル 𝑦𝑖 が 𝑗 ∈ 0,1, … , 𝐽 となる確率を 𝑦𝑖 ∗ が区間に入る確率で表現 何が嬉しい? ◦ クラス間の順序性を考慮出来ている ◦ 閾値を考慮して離散確率を出せる → Multi-Class Logarithmic Lossで最適化が可能 14DSB2019 振り返り会 𝑦𝑖 ∗ = 𝑓 𝑥𝑖 (ここで 𝑓 𝑥𝑖 は何らかの回帰モデル) Loss = − 1 𝑁 𝑖 𝑗 𝑑𝑖𝑗 log 𝑃 𝑦𝑖 = 𝑗 𝑥𝑖 𝑑𝑖𝑗 = 1 (𝑡𝑖 = 𝑗) 0 otherwise 𝑃 𝑦𝑖 = 𝑗 𝑥𝑖 = 𝑃 𝜅𝑗−1 ≤ 𝑦𝑖 ∗ ≤ 𝜅𝑗 = 𝑃 𝑦𝑖 ∗ ≤ 𝜅𝑗 − 𝑃 𝑦𝑖 ∗ ≤ 𝜅𝑗−1
  15. 15. 順序選択モデル 𝑃 𝑦𝑖 ∗ ≤ 𝜅𝑗 ってどうやって表現するの? ◦ 詳細は省く(※)が、回帰予測の誤差が従う確率分布の 累積分布関数 𝐹 で表現できる ◦ 特に、ロジスティック分布を用いたものは順序ロジットモデルと呼ばれる ◦ このとき 𝐹 はロジスティック関数で表現される 15DSB2019 振り返り会 𝑃 𝑦𝑖 = 𝑗 𝑥𝑖 = 𝑃 𝑦𝑖 ∗ ≤ 𝜅𝑗 − 𝑃 𝑦𝑖 ∗ ≤ 𝜅𝑗−1 = 𝐹 𝜅𝑗 − 𝑦𝑖 ∗ − 𝐹 𝜅𝑗−1 − 𝑦𝑖 ∗ 0 1 2 30.5 1.5 2.5 𝜅0 𝜅1 𝜅2 クラス 0 クラス 1 クラス 2 クラス 3 𝑦∗ イメージ 0 0.5 1 0 0.5 1 0 0.5 1 𝐹 𝜅0 − 𝑦𝑖 ∗ 𝐹 𝜅1 − 𝑦𝑖 ∗ 𝐹 𝜅2 − 𝑦𝑖 ∗ ※まだ理解してないだけ
  16. 16. LightGBMの順序ロジットモデルへの拡張 学習編 ◦ 連続潜在変数 𝑦∗ を予測する 𝑓として LightGBM を使う (𝑦𝑖 ∗ = lgb 𝑥𝑖 ) ◦ これに関しては通常の回帰予測と一緒 ◦ Loss のカスタマイズ ◦ ここではシンプルに標準シグモイド関数(右式)を用いる ◦ ただし、𝜅𝑗 は given とする (とりあえず理想的な値を与える. ) 16DSB2019 振り返り会 Loss = − 𝑖 𝑗 𝑑𝑖𝑗 log 𝑃 𝑦𝑖 = 𝑗 𝑥𝑖 = − 𝑖 𝑗 𝑑𝑖𝑗 log 𝜎 𝜅𝑗 − 𝑦𝑖 ∗ − 𝜎 𝜅𝑗−1 − 𝑦𝑖 ∗ 𝑑 𝑑𝑦𝑖 ∗ log 𝑃 𝑦𝑖 = 𝑗 𝑥𝑖 = 1 − 𝜎 𝜅𝑗 − 𝑦𝑖 ∗ + 𝜎 𝜅𝑗−1 − 𝑦𝑖 ∗ 𝑑2 𝑑𝑦𝑖 ∗2 log 𝑃 𝑦𝑖 = 𝑗 𝑥𝑖 = 1 − 𝜎 𝜅𝑗 − 𝑦𝑖 ∗ 𝜎 𝜅𝑗 − 𝑦𝑖 ∗ + 1 − 𝜎 𝜅𝑗−1 − 𝑦𝑖 ∗ 𝜎 𝜅𝑗−1 − 𝑦𝑖 ∗ 𝜎 𝑥 = 1 1 + 𝑒−𝑥 今回は 𝜅−1 = −∞, 𝜅0 = 0.5, 𝜅1 = 1.5, 𝜅2 = 2.5, 𝜅3 = +∞ と設定
  17. 17. LightGBMの順序ロジットモデルへの拡張 推論編 ◦ 率直なやり方: それぞれの 𝑃 𝑦𝑖 = 𝑗 𝑥𝑖 を算出 → 確率が一番高い 𝑗 を取る ◦ 以前と同じやり方:改めて閾値を決める ◦ 良い感じの 𝜅0 ′ , 𝜅1 ′ , 𝜅2 ′ を QWK の値を見て決める ◦ 各 Fold で決めて平均, OOF Pred 全体(またはサンプリングしたもの)で最適化, など 17DSB2019 振り返り会 𝑃 𝑦𝑖 = 𝑗 𝑥𝑖 = 𝑃 𝑦𝑖 ∗ ≤ 𝜅𝑗 − 𝑃 𝑦𝑖 ∗ ≤ 𝜅𝑗−1 𝑗 = 0, 1, 2, 3 𝑦𝑖 = argmax 𝑗 𝑃 𝑦𝑖 = 𝑗 𝑥𝑖 0 1 2 30.5 1.5 2.5 𝜅0 ′ 𝜅1 ′ 𝜅2 ′ クラス 0 クラス 1 クラス 2 クラス 3 𝑦∗
  18. 18. 実験: Late Submission で検証 RMSEで最適化した通常の LightGBM と比較 ◦ Feature, Seed, ハイパラを揃える(時間が無かったので決め打ち) ◦ Test Set (の過去) も学習に用いる ◦ もちろん Validation Set の切り方も揃える ◦ Installation_id を group id と見た StratifiedGroupKFold ◦ Validation Metric は Loss と同一のものを使用し、early stopping を行う ◦ ※学習の設定は冒頭で紹介した solution と同じ. metric のみが異なる. 比較する内容 ◦ 予測値の分布は RMSE で最適化した場合と比べて変化するか? ◦ local cv score(oof prediction) と (public,) private score (k-fold Averaging) DSB2019 振り返り会 18
  19. 19. DSB2019 振り返り会 19 Out-Of-Fold Prediction の分布の比較(全体) RMSE Custom Loss RMSE が 0~3 の範囲に固まっているのに対し、CustomLoss は分布が広がる 次ページで class ごとに確認 ☞
  20. 20. DSB2019 振り返り会 20 Out-Of-Fold Prediction の分布の比較(class 別) RMSE Custom Loss class 0 class 1 class 2 class 3 CustomLoss の方がラベルの値を中心に分布している?(1, 2は怪しいが.) ※そういう風に最適化してるからそれはそう
  21. 21. ※OOF は commit 時の数値. test(の過去) も train に使う都合上 submit 時は不明. ◦ Local(OOF)では CustomLoss の方が少し良さげに見える ◦ ただし Private では、閾値をOOFで optimize した sub の score が一緒 ◦ そもそもCVの作り方に問題がある気もする(今回は単純にSGKFで分割しただけ) ◦ 事前に与えた理想的な閾値を使った場合は(当然だが) CustomLoss の方が良い Loss, QWK の比較 (kernel 実行版) DSB2019 振り返り会 21 Objecitive RMSE (OOF) CustomLoss (OOF) 閾値の決め方 QWK (OOF) QWK (Public) QWK (Private) RMSE 0.991 1.093 理想値(0.5,1.5,2.5) 0.5177 0.451 0.474 分布で決定 0.5797 0.532 0.533 OOF全体でQWK最大化 0.5927 0.515 0.544 Custom Loss 1.267 1.013 理想値(0.5,1.5,2.5) 0.5829 0.496 0.525 分布で決定 0.5799 0.526 0.536 OOF全体でQWK最大化 0.5942 0.523 0.544 argmax 0.5313 0.428 0.468
  22. 22. まとめ なぜ我々が閾値設定に苦しんだかを改めて考える ◦ QWK が順序を考慮した指標であるために分類問題を回帰問題として解いていた 順序選択モデルの導入 ◦ クラス間の順序性を考慮する + 閾値による分類予測への変換も織り込んでいる ◦ GBDT(今回はLightGBM) の Loss をカスタマイズすることで拡張が可能 Late Sub による実験 ◦ 分布 :OOFの予測値の hist は比較的綺麗になっているように見える ◦ スコア:Local だと少し良かったが、Private は微妙(≥ RMSEで最適化したモデル ではある). ◦ そもそもCVの作り方にも問題があるかも?ここは更に実験したい部分. ◦ 与えた理想的な閾値( 𝑗 + 0.5 )でのスコアは当然ながら CustomLoss の方が良い 改善点 ◦ 事前に与える閾値の決め方, 閾値込みでのモデル化、後処理での閾値の決め方、などなど沢山ある ◦ Local と Private の差異は CV の作り方のせいかも? → ここをしっかりやって比較し直したい ◦ そもそも特徴量等がシンプルなので、上位陣のやつに試してみたかったり DSB2019 振り返り会 22
  23. 23. おまけ: 実装した Custom Metric Class を定義 ◦ 初期化時に閾値を渡す ◦ grad と hess を返すメソッド、loss を返す メソッドをそれぞれ用意 ◦ calc_loss を別に用意しているのは loss を改 めて計算したいときに使う用 ◦ lgbm には生成したインスタンスからこれらの メソッドを渡す ◦ ※以下はわかりやすくしただけで、notebook 上 での実際の配置とは少し異なります DSB2019 振り返り会 23

×