CNNを使ってやりたいことがあったのでその練習に参加.
10月13日に始めて2週間くらいちょこちょこやってた.
5位/210チーム,Publicが13位だったので実質そのくらいだと思う.

Overview

CNNの上にGBDTを載せてStackingした.

閾値の決め方とValidation時の評価

  1. validation dataで一番条件付きPrecisionが高くなる閾値を使う
  2. 出力した確率が合っていると仮定してその確率に従って正解ラベルをランダムに決めて各閾値での条件付きPrecisionを計算.10000回繰り返して平均とかmedianを取って一番良い物を使う.全データだと10000回で2分くらいかかって遅い.

1.の決め方をvalidationに使って,2.のmedianのやつをsubmissionに使った. 最終的な手元のスコアは1.が0.58307,2.のmeanが0.57491,medianが0.58627.閾値はそれぞれ0.20716, 0.19939, 0.21035

CNN

Data Augmentation

  • cropping (64x64->54x54)
    • 44x44 も1回やったけど精度が落ちたので以降やらなかった
  • flip (水平,垂直,両方(180度回転))
    • 90, 270度が抜けてることに今気づいた
  • rotation (±12度)
    • ちょっとくらい回転してもええやろという気持ち
    • 良いのかどうかは知らない

TTA

10回

Subsampling

正例の1倍,4倍,8倍を試したが8倍は遅かったので結局使わなかった.
不例を多めにした方が良くなる傾向があったが,上に載せるGBDTがなんとかしてくれるやろという気持ち.

Architecture

  • 普通のCNN
    convが[32, 48, 64],denseが[64, 32]の普通のCNN
    色々試そうと思ってたけど適当に試してResNet50が良かったのでほかは試してない
  • ResNet50
    このレポジトリの実装を使った.CIFAR向けに最初のpooling or strideが無かったりBottleNeckのAddの後にreluが無かったりする.
  • SEResNet50
    ChainerCVのSEBlockを上のResNet50に使った.コンペ期間中,まだSENetはReleaseに無かったがmasterにはあったので使った.

Optimization

だいたい全部 Adam, lr 1e-3, 40 epochでやった.
MomentumSGD, lr 0.1, step shift, 300 epochとかもやったけど全然うまく行かなかった.
batchsizeはGCPでP100借りた時は128,手元の1080Tiでは64でやった.

GBDT

LightGBMに投げた.最終日にやっとここまで来たのであんまり凝ったことはしてない
モデルのArchitectureとかSubsampleの割合とかのグループでmeanとかquantileとか取ったものも追加してみたけどほとんど変化なし.
普通のCNNは単体の性能は低かったものの入れると0.001くらい上がって面白かった.

感想

  • 不例が多いと学習に時間かかるのでSubsampleしてStackingをしたんだけど,StackingのためにCVしなきゃいけなくなって結局1モデル回すのにだいぶ時間がかかった.
  • SEBlockは時間はあまり増えないけど性能はあがるのでお得.
  • この評価指標でどうValidationするのが良いのかイマイチわからず .
  • 3層くらいのCNNとResNet50しか試していなくて極端.一気に複雑にしすぎた.

おまけ

訓練データのファイル名が時系列順に付いているかもと思ってplotしてみたら明らかに季節性があった. これに気づいたのが最終日の10時半くらいで,急いでdayofyear的な特徴量 ファイル名 % (len(train) // 15) を作ってGBDTの特徴量に加えたら0.761209が出て「これがリークか」という気持ちになったけどサブミットしてみたら0でワロタ.
CVのsplitがrandomのままだったので過学習しちゃったのかもしれないけど,直す時間なく終了.
そもそもテストデータのファイル名が時系列順になっているのかもわからないけど,予測した確率値に対して同じようなプロットをすると偏りがあるので時系列順にはなっているんだと思う.1位はこれ使ってたりしないかなー.

links

あれどこでみたっけってなった時のためのリンク