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

学生部門1位 (6th Place Solution) / 1st Place Solution in The Student Category (6th Place Solution)

A2cac4b3dcb2bc0b87917ddc034ef708?s=47 Sansan DSOC
December 17, 2021

学生部門1位 (6th Place Solution) / 1st Place Solution in The Student Category (6th Place Solution)

■イベント 
:Sansan x atmaCup #12 振り返り会
https://atma.connpass.com/event/229180/

■登壇概要
タイトル:学生部門1位 (6th Place Solution)
発表者: 

@colum2131 さん

▼Sansan R&D Twitter
https://twitter.com/SansanRandD

A2cac4b3dcb2bc0b87917ddc034ef708?s=128

Sansan DSOC

December 17, 2021
Tweet

More Decks by Sansan DSOC

Other Decks in Technology

Transcript

  1. 学生部門 1位 (6th Place Solution) atmaCup#12 振り返り会 1

  2. 自己紹介 @colum2131 九州⼤学理学部⽣物学科 学部4年 数理⽣物学研究室 プログラミング歴(≒コンペ歴) 2年 u Kaggle Competition

    Expert (銀以上1枚でMaster) u AtCoder ⽔⾊ (Rating: 1305 Highest Rating: 1490) u atmaCup#10でチームで総合4位(敢闘賞3位)獲得 自己紹介 2
  3. 自己紹介 発表内容 u短期間(atmaCup)でのコンペの進め⽅ u評価指標を理解する uコンペ期間でできることを考える u解法とそれに⾄った経緯 uどのモデルを使うか? u他の矩形情報を使った学習をするには? uclass_id 9へのアプローチ

    コンペの方向性・解法 3
  4. 自己紹介 10クラスの多クラス分類(評価指標はMacro F1 Score) 評価指標 Macro F1-Scoreってどんな指標? → 各クラスごとにF1 Scoreを計算してその平均を取ったもの

    → 多数のクラスより少数のクラスをしっかり当てた⽅がなんだかよさそう? trainデータのclass_idを⾒るとclass_id 9のデータが⼊っていない → testデータのみにしか存在しない(publicでの割合は2-3%と他のクラスより少なさそう) → Macro F1 Scoreなのでclass_id 9を当てなければスコアの最⾼値は0.9 → 逆に半分程度class_id 9を当てればスコアは0.05向上する class_id 9を当てる処理の優先度はかなり高そう 4
  5. 自己紹介 与えられたデータは矩形の端点座標と名刺全体の縦と横の⻑さ → ここからだと矩形の縦と横の⻑さや⾯積,アスペクト⽐ぐらいしか抽出できなさそう… → プロットしてみると他の矩形との関係性が強そうな気がしてきた → 他の矩形情報も使ったほうがよさそう! 他の矩形を捉えるにはどうすればいいのだろう •

    GNNやtransformerなどで他の矩形情報 が学習に使えるようにする • 矩形の特徴量作成はあまり⾏わなくて よさそう? • それよりモデルのアーキテクチャを いろいろ実験するのがよさそう NNベースなら • 特徴量作成で他の矩形情報が必要 • NNが学習するであろう局所的な矩形と ⼤局的な矩形の情報が必要そう • モデル⾃体は⼯夫する必要がなさそう • oputunaでハイパラチューニングすれば あとは問題なさそう GDBTベースなら 5 • 特徴量作成で他の矩形情報が必要 • NNが学習するであろう局所的な近傍の 矩形と⼤局的な矩形の情報が必要そう • モデル⾃体は⼯夫する必要がなさそう • oputunaでハイパラチューニングすれば あとは問題なさそう GBDTベースなら 矩形データ
  6. 自己紹介 与えられたデータは矩形の端点座標と名刺全体の縦と横の⻑さ → ここからだと矩形の縦と横の⻑さや⾯積,アスペクト⽐ぐらいしか抽出できなさそう… → プロットしてみると他の矩形との関係性が強そうな気がしてきた → 他の矩形情報も使ったほうがよさそう! 他の矩形を捉えるにはどうすればいいのだろう •

    GNNやtransformerなどで他の矩形情報 が学習に使えるようにする • 矩形の特徴量作成はあまり⾏わなくて よさそう? • それよりモデルのアーキテクチャを いろいろ実験するのがよさそう NNベースなら • 特徴量作成で他の矩形情報が必要 • NNが学習するであろう局所的な矩形と ⼤局的な矩形の情報が必要そう • モデル⾃体は⼯夫する必要がなさそう • oputunaでハイパラチューニングすれば あとは問題なさそう GDBTベースなら 6 • 特徴量作成で他の矩形情報が必要 • NNが学習するであろう局所的な近傍の 矩形と⼤局的な矩形の情報が必要そう • モデル⾃体は⼯夫する必要がなさそう • oputunaでハイパラチューニングすれば あとは問題なさそう GBDTベースなら 矩形データ
  7. 自己紹介 コンペの進め方 7 lightGBMで class_id 9以外を予測 class_id 9を予測 ensembleで精度向上 NNで

    class_id 9以外を予測 コンペ期間にできそうなライン GBDTがうまくいかなかったら ⽬安LB: 0.79-0.80 ⽬安LB: 0.88-0.89
  8. 自己紹介 特徴量作成 + 学習 8 基本的な特徴量と集約特徴量だけだとあまり精度が伸びない...(CV: 0.7817 LB: 0.6884) →

    近傍の矩形情報を⼊れる必要がありそう → データをみると名刺ごとに矩形が左座標でソートされていた → そのままラグ特徴量(shiftとdiff)を使えば精度あがりそう? → かなり向上した(CV: 0.8385)!この⽅向性がよさそう! 基本的な特徴量 ・矩形の端点座標と名刺の横幅,縦幅 ・矩形の横幅,縦幅,⾯積,アスペクト⽐ ・名刺の⾯積,アスペクト⽐ ・矩形と名刺の差分(⾯積,アスペクト⽐) 集約特徴量とその差分 ・基本的な特徴量を名刺単位で集約 (min, max, mean, stdの4つの統計量) ・min, max, meanはもとの特徴量と差分 名刺id left top right bottom hoge 30 80 870 200 hoge 40 40 640 180 hoge 55 1200 125 1300
  9. 自己紹介 特徴量作成 + 学習 9 lightGBMで学習してCV: 0.8707 LB: 0.7701を達成! 左座標と上座標それぞれでソートしてラグ特徴量を作成

    ラグ特徴量(左座標ソートと上座標ソートでそれぞれ求める) ・基本的な特徴量のshiftとdiff ・shiftしたときの矩形それぞれの重なり部分の⾯積,IoU ・マンハッタン距離 基本的な特徴量 + 集約特徴量 + ラグ特徴量 1st Stage
  10. 自己紹介 予測値を用いた学習 10 他の矩形の予測値を新しく特徴量として学習に⽤いたい 予測値特徴量 ・⾃⾝の矩形の予測値の除いた名刺単位の集約(mean) ・予測値のラグ特徴量(shiftのみ, 左座標ソートと上座標ソートそれぞれ) 基本的な特徴量 +

    集約特徴量 + ラグ特徴量 1st Stage 基本的な特徴量 + 集約特徴量 + ラグ特徴量 + 予測値特徴量 2nd Stage 2stage学習でCV :0.8823 LB: 0.7909を達成!!
  11. 自己紹介 class_id 9処理 class_id 9はtestにしか存在しない → とりあえず予測値の最⼤値が低い順から順に1300個をclass_id 9とする(LB: → )

    → class_id 9以外だとそこそこ⾼精度で当てることができるからclass id 9も同程度に当てられそう そもそもtrainとtestでclass_id 9の違いで分布が変わっていそう → 矩形の散布図を⾒てもあまり違いがわからない😢 → 2-3%(約1300個)しか存在しないから⽬で⾒つけるのも⼤変そう → そもそもtrainらしさ,testらしさがわかればいいなぁ… Adversarial Validation使えるかも! 11 testらしさ…?
  12. 自己紹介 Adversarial Validation 12 Adversarial Validationとは? • trainとtestの分布が違うときにtestに似たtrainのvalidationデータを作成する⽅法 • trainとtestで特徴量がリークしていないか特徴量選択としても応⽤することができる

    また「Kaggleで勝つデータ分析の技術」(技術評論社)のp.295には, コンペ序盤のEDAで違いが発⾒できなくてもadversarial validationで判別に効いている特徴量を 確認し、その特徴量を中⼼にさまざまな仮説を⽴てて再度EDAを⾏ってみるといいでしょう. と書かれており,class id 9の分類に効くであろう特徴量を調べることができるかも
  13. 自己紹介 Adversarial Validation 13 基本的な特徴量とラグ特徴量を⽤いて⽬的変数をtrainを0,testを1として学習(AUC: 0.579) 各矩形のtrain/testらしさの予測値のヒストグラム testらしい trainらしい feature

    importanceの上位10個 testらしい矩形があって,topに依存していそう?
  14. 自己紹介 Adversarial Validation 14 testらしい/らしくないtopの分布 testらしい/らしくないleftの分布 やっぱりtopに偏りがある → 0付近にtestらしい矩形が集中しているかも? testのtop0から20に集中している矩形がある!

    → trainには少ないことからこれがclass id 9っぽい! → topの28未満の矩形はtrain 79個, test 677個 → 割合的に550個程度はclass id 9が⼊っている(は ず) top30以下の分布(⻘:train 橙:test) top28未満をclass id 9とすれば0.055以上は向上? LB: 0.7907 → 0.8550!!!
  15. 自己紹介 最終的なモデル 15 1st Stage Private LB: 0.7996 基本的な特徴量 +

    集約特徴量 + ラグ特徴量 + 予測値特徴量 2nd Stage 3rd Stage (testデータに対して) class_id=9の矩形が ありそうな名刺の矩形 全てにpseudo labeling Private LB: 0.8681 tuboさん Post Processing Private LB: 0.7798 基本的な特徴量 + 集約特徴量 + ラグ特徴量 Private LB: 0.8670 基本的な特徴量 + 集約特徴量 + ラグ特徴量 + 予測値特徴量 Private LB: 0.8681 総合6位(学生1位)
  16. 自己紹介 反省点 短期間コンペでの⽅向性の⽴て⽅はかなり良かった → ⼀⽅でGNNなどを⼀切触らなかったため僅差の勝負で負けてしまう原因に Data Augmentationを試したが処理が⽢く精度が出せなかった → ⾃分ならどこに書くか矩形のお気持ちをもっと理解すればよかった 次は総合⼀位を⽬指したい!!🔥🔥🔥

    16