$30 off During Our Annual Pro Sale. View Details »

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

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

Sansan DSOC

December 17, 2021
Tweet

More Decks by Sansan DSOC

Other Decks in Technology

Transcript

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

    View Slide

  2. 自己紹介
    @colum2131
    九州⼤学理学部⽣物学科 学部4年 数理⽣物学研究室
    プログラミング歴(≒コンペ歴) 2年
    u Kaggle Competition Expert (銀以上1枚でMaster)
    u AtCoder ⽔⾊ (Rating: 1305 Highest Rating: 1490)
    u atmaCup#10でチームで総合4位(敢闘賞3位)獲得
    自己紹介
    2

    View Slide

  3. 自己紹介
    発表内容
    u短期間(atmaCup)でのコンペの進め⽅
    u評価指標を理解する
    uコンペ期間でできることを考える
    u解法とそれに⾄った経緯
    uどのモデルを使うか?
    u他の矩形情報を使った学習をするには?
    uclass_id 9へのアプローチ
    コンペの方向性・解法
    3

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  9. 自己紹介
    特徴量作成 + 学習
    9
    lightGBMで学習してCV: 0.8707 LB: 0.7701を達成!
    左座標と上座標それぞれでソートしてラグ特徴量を作成
    ラグ特徴量(左座標ソートと上座標ソートでそれぞれ求める)
    ・基本的な特徴量のshiftとdiff
    ・shiftしたときの矩形それぞれの重なり部分の⾯積,IoU
    ・マンハッタン距離
    基本的な特徴量
    + 集約特徴量
    + ラグ特徴量
    1st Stage

    View Slide

  10. 自己紹介
    予測値を用いた学習
    10
    他の矩形の予測値を新しく特徴量として学習に⽤いたい
    予測値特徴量
    ・⾃⾝の矩形の予測値の除いた名刺単位の集約(mean)
    ・予測値のラグ特徴量(shiftのみ, 左座標ソートと上座標ソートそれぞれ)
    基本的な特徴量
    + 集約特徴量
    + ラグ特徴量
    1st Stage
    基本的な特徴量
    + 集約特徴量
    + ラグ特徴量
    + 予測値特徴量
    2nd Stage
    2stage学習でCV :0.8823 LB: 0.7909を達成!!

    View Slide

  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らしさ…?

    View Slide

  12. 自己紹介
    Adversarial Validation
    12
    Adversarial Validationとは?
    • trainとtestの分布が違うときにtestに似たtrainのvalidationデータを作成する⽅法
    • trainとtestで特徴量がリークしていないか特徴量選択としても応⽤することができる
    また「Kaggleで勝つデータ分析の技術」(技術評論社)のp.295には,
    コンペ序盤のEDAで違いが発⾒できなくてもadversarial validationで判別に効いている特徴量を
    確認し、その特徴量を中⼼にさまざまな仮説を⽴てて再度EDAを⾏ってみるといいでしょう.
    と書かれており,class id 9の分類に効くであろう特徴量を調べることができるかも

    View Slide

  13. 自己紹介
    Adversarial Validation
    13
    基本的な特徴量とラグ特徴量を⽤いて⽬的変数をtrainを0,testを1として学習(AUC:
    0.579)
    各矩形のtrain/testらしさの予測値のヒストグラム
    testらしい
    trainらしい
    feature importanceの上位10個
    testらしい矩形があって,topに依存していそう?

    View Slide

  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!!!

    View Slide

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

    View Slide

  16. 自己紹介
    反省点
    短期間コンペでの⽅向性の⽴て⽅はかなり良かった
    → ⼀⽅でGNNなどを⼀切触らなかったため僅差の勝負で負けてしまう原因に
    Data Augmentationを試したが処理が⽢く精度が出せなかった
    → ⾃分ならどこに書くか矩形のお気持ちをもっと理解すればよかった
    次は総合⼀位を⽬指したい!!🔥🔥🔥
    16

    View Slide