ktrのブログ

だいたい体験談と勉強したことのアウトプット

メラノーマコンペの思い出

2020/6/28 ~ 2020/8/18でKaggleで開催されたSIIM-ISIC Melanoma Classificationに参加して、銀メダルだったのでその思い出です

www.kaggle.com

コンペの概要等はチームメンバーのkaerururuさんのブログに載っているのでそちらもご参考下さい kaeru-nantoka.hatenablog.com

私のソリューション概要は3.に載っています

1. 参加動機

Twitter Sentiment Extractionで銀メダル圏からシェイクダウンをくらい、メダルなしに泣きながらLateSubをしている際に、チームメイトだったmobassir氏に「ちょっとやらない?」と声をかけられたのがきっかけでした。
画像タスクが去年の今頃のAPTOS以来だったので、リハビリとTensorFlowの学習にいいかなあくらいの軽いモチベーションで参加しました。

2. 時系列

初期

本格的に参加したのはコンペが始まって1ヶ月ほどたったタイミングでした。この頃からEfficientNetを使って モデルサイズ x 画像サイズ でアンサンブルするとスコアが伸びることがDiscussionに報告されていました。画像なんも分からん状態なので、とりあえずPublic Notebookを写経しながら自分のパイプラインを改修してました。

中期

シングルモデルでCVを改善しても、PublicLBは改善しないという状態に陥りました。他の参加者も大体似たような感じだったと思います。
mobassir氏が知人を誘い3人になったので、一回アンサンブルを試してみましたが、結果は同様で、CVは改善するが、PublicLBはほとんど改善しなかったので絶望した覚えがあります。 チームで参加していなければ多分投げていました。

後期

mobassir氏が、Twitterでよくお見かけしていたkaerururuさんと、氏とよくチームを組んでおられるToru Itoさんをチームに勧誘しました。開催中コンペで日本人とチームマージするのは初めてだったので、モチベーションがだいぶ回復しました。軽く情報共有した後、各人でモデルを改善して、私がモデルを回収してアンサンブルに含める感じで進めました。

中期から私がアンサンブルのスクリプトを書いていたため(と言ってもアベレージをとるナイーブなものでしたが)、流れで最後までアンサンブルは私が担当してました。
上手くいかなかったらチームの努力が水の泡になるので、まあまあプレッシャーがありました。アンサンブル担当は当分したくありません。

最終的なCVは0.951ほどで、Publicでは1000thくらいだったと思います。前々からHigh Publicスコア(銅圏くらい)とHigh CVスコアの結果を提出しようと多数決していたため、最終サブの一つにしました。

結果的にこれがPrivateで最も高いものとなり、Trust CVでシェイクアップし無事に銀メダルでフィニッシュでした。

High Publicスコアのサブはことごとくメダル圏外でしたが、メンタルヘルスの維持に役に立ちました

3. ソリューションの概要

基本訓練したモデルは捨てずに、アンサンブルに加えてCVを伸ばす方針でいきました。

CVはChris氏が公開していたtriple stratified leak-free CV1で、基本的に2018年の画像をExternalとして含めて訓練しました。

モデルはEfficientNetを使用。Headなど特に工夫はなく、augumentaionもPublicで共有されていたものを使用しました。

  • ベースラインとなるimagenetからの重みを使ったもの
    • B5 512
    • B4 512
    • B4 384
  • noisy-studentからの重みを使ったもの
    • B5 384
    • B5 480 + augmentationにcoarse dropout
  • pretraining model
    • kaerururuさんがExternalで事前学習するモデルを持っていたので、私もアイディアをお借りしました
    • モデルはB5で画像サイズは384を使用
    • 公開されているすべてのデータで事前学習した後、コンペティションのデータでfine-tuning
    • コンペティションのデータを除いて事前学習した後、コンペティションのデータでfine-tuning
  • その他
    • SEResNeXt-50
      • 画像サイズ 192 upsampleデータ使用
      • ほかにもXceptionやInceptionResnetなどを試しましたが、最終的にこれだけ残りました
    • metaデータ
      • 画像と紐づく年齢等のデータ
      • LightGBM
      • PublicのNotebookを参考にしつつ、RGBのヒストグラムとかを特徴量に追加した

画像はほとんど分からない+ドメイン知識なしなので、いろいろ試してモデルを積木した感じです。

面白味やインパクトに欠けると思いますが、粛々といろいろ試してローカルCVを改善するという点で、成功体験が得られたので個人的には良かったです。

アンサンブル

変換方法がいろいろシェアされていましたが、私の体感では大体

power << rank ~ simple < log でした。rankでスコアが伸びなかったのが謎でした。

weightを調整したかったので、LogisticRegressionやXGBoost等を試しましたが、4GM本2に書いているOptimized AUCが一番CVが上がりました(simple avg: 0.95096 → 0.95147)。

weightでcvがまあまあブレるので工夫として、train_test_splitして、trainとvalのスコアの偏差が小さいものでweightの平均をとりました。結果に寄与したかは不明です。

どのモデルをアンサンブルするかは人力グリッドサーチしてました。この辺なにがベストなのか知りたいです。

4. 終わりに

  • 実はチームメンバー各人のモデルでは、終了間近に作成されたToru Itoさんのモデルが最もCV,LB共に高かったのですが、アンサンブルに含めるとなぜかCVが落ちるという結果になったので、時間的余裕もなく含めることができませんでした。

  • Private Share粛清後の最終的な順位が39thで、上位と比べてもクリティカルな差があまりなかったようなので、上手く組み込めたら金もあったかなあと思うと悔しいところです。

  • 最終的にTwitter Sentiment Extractionの二の舞にならなくて良かったです。

  • 金とって早くMasterになりたいです。

おわり