メラノーマコンペの思い出
2020/6/28 ~ 2020/8/18でKaggleで開催されたSIIM-ISIC Melanoma Classificationに参加して、銀メダルだったのでその思い出です
コンペの概要等はチームメンバーの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
- その他
- SEResNeXt-50
- 画像サイズ 192 upsampleデータ使用
- ほかにもXceptionやInceptionResnetなどを試しましたが、最終的にこれだけ残りました
- metaデータ
- 画像と紐づく年齢等のデータ
- LightGBM
- PublicのNotebookを参考にしつつ、RGBのヒストグラムとかを特徴量に追加した
- SEResNeXt-50
画像はほとんど分からない+ドメイン知識なしなので、いろいろ試してモデルを積木した感じです。
面白味やインパクトに欠けると思いますが、粛々といろいろ試してローカル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になりたいです。
おわり